目录
前言
Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用。单节点的Redis已经就达到了很高的性能,为了提高可用性我们可以使用Redis集群。
一、概述
(一)、概述
Redis3.0版本以上开始支持cluster,采用的是hashslot(hash槽),可以将多个Redis实例整合在一起,形成一个群集,也就是将数据分散到群集的多台机器上。
(二)、原理
Redis Cluster是一个无中心的结构,每个节点都保存数据和整个群集的状态。每个节点都会保存其他节点的信息,知道其他节点所负责的槽,并且会与其他节点定时发送心跳信息,能够及时感知群集中异常的节点。
(三)、架构细节
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
(2)节点的失效(fail)在群集中超过半数的主(master)节点检测失效时才生效。
(3)客户端与 redis 节点直连,不需要中间代理(proxy)层,客户端不需要连接群集所有节点,连接群集中任何一个可用节点即可。
(4)redis-cluster 把所有的物理节点映射到【0-16383】slot 上,cluster 负责维护 node<->slot<->key。
(四)、选举过程
选举过程是群集中所有master参与,如果半数以上master节点与当前 master 节点通信超时(cluster—node—timeout),认为当前 master 节点挂掉。以下两种情况为整个群集不可用(cluster_state:fail),当群集不可用时,所有对群集的操作都不可用,收到((error)CLUSTEFDOWN The cluster is down)错误。
如果群集任意 master挂掉,且当前 master 没有 slave,则群集进入 fail状态,也可以理解成群集的slot映射【0 ~16383】不完整时进入fail状态。
如果群集中超过半数的master挂掉,无论是否有slave,群集都进入 fail状态。
默认情况下,每个群集的节点都使用两个TCP端口.一个是6379,一个是16379;6379服务于客户端的连接,16379 用于群集总线,即使用二进制协议的节点到节点通信通道。节点使用群集总线进行故障检测、配置更新、故障转移授权等。如果开启了防火墙,需要开放这两个端口。
二、搭建
本篇文章用FinaShell远程连接进行的操作
事先用网络源在三台虚拟机上安装了Redis服务
以此图为例,Redis-server1的IP更改为192.168.238.129、Redis-server2的IP更改为192.168.238.130、Redis-server3的IP更改为192.168.238.131
(一)、更改配置文件
Redis-server1
192.168.238.129
创建目录
mkdir /etc/redis -p
cp /etc/redis.conf /etc/redis/redis1_6379.conf
cp /etc/redis.conf /etc/redis/redis2_6380.conf
mkdir /var/lib/redis/redis1_6379 -p
mkdir /var/lib/redis/redis2_6380 -p
更改配置文件
更改port、protected-mode、daemonize、bind、dir
vim /etc/redis/redis1_6379.conf
vim /etc/redis/redis2_6380.conf
以/etc/redis/redis1_6379为例
启动服务
redis-server /etc/redis/redis1_6379.conf
redis-server /etc/redis/redis2_6380.conf
netstat -anptu |grep redis
Redis-server2
192.168.238.130
创建目录
mkdir /etc/redis -p
cp /etc/redis.conf /etc/redis/redis3_6379.conf
cp /etc/redis.conf /etc/redis/redis4_6380.conf
mkdir /var/lib/redis/redis3_6379 -p
mkdir /var/lib/redis/redis4_6380 -p
更改配置文件
更改port、protected-mode、daemonize、bind、dir
vim /etc/redis/redis3_6379.conf
vim /etc/redis/redis4_6380.conf
启动服务
redis-server /etc/redis/redis3_6379.conf
redis-server /etc/redis/redis4_6380.conf
netstat -anptu |grep redis
Redis-server3
192.168.238.131
创建目录
mkdir /etc/redis -p
cp /etc/redis.conf /etc/redis/redis5_6379.conf
cp /etc/redis.conf /etc/redis/redis6_6380.conf
mkdir /var/lib/redis/redis5_6379 -p
mkdir /var/lib/redis/redis6_6380 -p
更改配置文件
更改port、protected-mode、daemonize、bind、dir
vim /etc/redis/redis5_6379.conf
vim /etc/redis/redis6_6380.conf
启动服务
redis-server /etc/redis/redis5_6379.conf
redis-server /etc/redis/redis6_6380.conf
netstat -anptu |grep redis
(二)、构建集群
更改配置文件
cluster-enabled、cluster-config-file、cluster-node-timeout
启动服务前要先杀死进程以免冲突
kill 43366
kill 43452
Redis-server1
启动服务
redis-server /etc/redis/redis1_6379.conf
redis-server /etc/redis/redis2_6380.conf
netstat -anptu |grep redis
Redis-server2和Redis-server3同上操作,注意端口不同
将其他节点加入集群
不区分大小写,在一台机器上操作即可
redis-cli -h 192.168.238.131
CLUSTER MEET 192.168.238.131 6380
CLUSTER MEET 192.168.238.130 6379
CLUSTER MEET 192.168.238.130 6380
CLUSTER MEET 192.168.238.129 6379
CLUSTER MEET 192.168.238.129 6380
cluster nodes
查看所有群集节点
给master分配slot
需退出再界面外操作,否则会异常
建立主从关系
对应图中关系建立主从
cluster info
查看群集状态
若主从配置错误,需每个节都重置
重置集群命令
cluster reset
数据的key不能相同
验证
需注意是哈希算法随机分配,按提示进行
哈希分配的是2919,所有只有在{0..5461}的范围才可以
总结
今天的内容要格外的细心,前面和Redis主从复制有雷同地方,集群中的主从配置才是要重点关注的地方,一定要先将图中主从关系理清出再去操作,否则要重置重新配置。