master 宕机后对应的 slave 自动被选举为 master,原 master 启动后,会自动配置为当前 master 的 slave
mgm68管理主机,查看集群信息
主服务器地址和端口(ID值) ——> 存储变量的个数 | 占用槽的个数 | 从服务器个数
[root@mgm68 ~]# redis-trib.rb info 192.168.4.63:6379 #选择任何节点均可,结果相同
[root@mgm68 ~]# redis-trib.rb check 192.168.4.65:6379
[root@redisC ~]# redis-cli -h 192.168.4.63 -p 6379 shutdown
mgm68管理主机,查看集群信息
[root@mgm68 ~]# redis-trib.rb info 192.168.4.61:6379 #4.64从服务器成为主服务器,从服务为0
192.168.4.64:6379 (28ff0eaf...) -> 0 keys | 5461 slots | 0 slaves.
[root@mgm68 ~]# redis-trib.rb check 192.168.4.61:6379 #从服务器剩下两台
[root@host50 ~]# redis-cli -c -h 192.168.4.64 -p 6379
192.168.4.64:6379> keys *
192.168.4.64:6379> set v1 101
192.168.4.61:6379> set v2 102
192.168.4.61:6379> exit
[root@redisC ~]# /etc/init.d/redis_6379 start
查看redis服务端口和集群端口是否开启
[root@redisC ~]# ss -ntulp | grep redis
[root@mgm68 ~]# redis-trib.rb info 192.168.4.63:6379
[root@mgm68 ~]# redis-trib.rb check 192.168.4.61:6379 #4.63主机为4.64的从服务器
[root@redis ~]# redis-cli -c -h 192.168.4.63 -p 6379
192.168.4.63:6379> keys * #数据同步,高可用验证成功
客户端连接集群中任意服务器存/取数据
查看master节点上的数据,在redisA,redisB,redisD上操作
所有节点上的数据加起来,就是整个redis集群中的数据
[root@redis ~]# redis-cli -c -h 192.168.4.61 -p 6379
192.168.4.61:6379> keys *
[root@redis ~]# redis-cli -c -h 192.168.4.62 -p 6379
192.168.4.62:6379> keys *
[root@redis ~]# redis-cli -c -h 192.168.4.64 -p 6379
192.168.4.64:6379> keys *
redisA 槽数:5461 范围:0-5460
redisB 槽数:5462 范围: 5461-10922
redisD 槽数:5461 范围: 10923-16383
CRC16算法:
存储数据时,对存入数据的变量名进行hash计算,用得到的数值和16384进行取余运算,看余数在那个范围之内,则将数据存储到对应的master节点上。例如:存入变量bob,值为777, 对bob进行hash计算,值和16384取余后的值为10930, 在redisB的槽数范围内,bob变量就会被存储到redisB的master节点上。
在redis集群中,一对主从中,至少得有一个服务器处于正常的状态,才可以取出数据,否则集群中的数据会发生缺失。
要添加的slave 主机名:redis71 IP地址:192.168.4.71/24
要添加的master 主机名:redis69 IP地址:192.168.4.69/24
redis71和redis69主机安装redis服务,开启集群功能
[root@redis71 ~]# /etc/init.d/redis_6379 stop
[root@redis71 ~]# vim /etc/redis/6379.conf
70 bind 192.168.4.71 #修改客户端访问的地址,为本机物理网卡的地址
815 cluster-enabled yes #取消注释,启用集群功能
823 cluster-config-file nodes-6379.conf #取消注释,存储集群信息相关文件
829 cluster-node-timeout 5000 #设置集群通信的超时时间(5000秒)
[root@redis71 ~]# /etc/init.d/redis_6379 start
[root@redis71 ~]# ss -ntulp | grep redis
[root@redis71 ~]# redis-cli -h 192.168.4.71 -p 6379
192.168.4.71:6379> keys * #做redis集群时,要保证所有的节点的数据为空
(empty list or set)
192.168.4.71:6379> cluster info #查看集群的相关信息
cluster_state:fail #集群状态,失败
在管理服务器添加 slave 角色主机,添加时不指定主机角色,默认新主机被选为 master
–master-id id值:指定新添加的节点,作为哪个主服务器的slave;
如果不指定 master节点的id值,则会在集群中查看哪个主服务器的slave最少,将新添加的节点作为哪个主服务器的slave;
如果所有主服务器拥有slave数量相同,则将新添加的节点随机作为某个主服务器的slave;
ip地址:端口 指要添加的slave的地址和端口
192.168.4.61:6379 代指集群,可以是集群中的任意节点
[root@localhost ~]# redis-trib.rb add-node --slave 【--master-id id值】 ip地址:端口 192.168.4.61:6379
check 查看集群的详细信息,获取4.61 master节点的ID值
[root@mgm68 ~]# redis-trib.rb check 192.168.4.61:6379
[root@mgm68 ~]# redis-trib.rb add-node --slave --master-id c1198049c748cd11daff4a2477bd9dcdb3358fba 192.168.4.71:6379 192.168.4.61:6379
# 192.168.4.61:6379 代指集群,可以是集群中的任意节点的IP和端口
[root@mgm68 ~]# redis-trib.rb info 192.168.4.61:6379 #主服务器4.61拥有两台从服务器
192.168.4.61:6379 (c1198049...) -> 4 keys | 5461 slots | 2 slaves.
[root@mgm68 ~]# redis-trib.rb check 192.168.4.61:6379
[root@redis71 ~]# redis-cli -h 192.168.4.71 -p 6379
192.168.4.71:6379> cluster info #节点内查看集群的状态信息
cluster_state:ok #集群状态OK
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:7 #集群中节点的数量为7台
cluster_size:3 #集群中主服务器的个数为3台
192.168.4.71:6379> keys * #数据同步成功
添加 master 角色服务器 (当集群中内存不足时添加)
这里使用redis69主机做此实验,环境已经准备完成
添加 master 主机步骤:添加 master 主机,分配 hash 槽(slots)
在管理主机向集群添加新主机:添加时不指定主机角色,默认新主机被选为 master
[root@mgm68 ~]# redis-trib.rb add-node 192.168.4.69:6379 192.168.4.66:6379 #192.168.4.66:6379 代指集群,可以是集群中的任意节点的IP和端口
[root@mgm68 ~]# redis-trib.rb info 192.168.4.61:6379
4.69 已经成为了主服务器,但是slots(hash槽)的数量为0,而redis集群存储数据是根据slots进行的,所有数据不会被存储到4.69上,需要重新分配hash槽
重新分片:移出 hash 槽个数,接收 hash 槽主机 ID,移出 hash 槽主机 ID,同意配置
reshard 对hash槽进行重新分配; 最后的IP和端口可以选择集群中任意主机
[root@mgm68 ~]# redis-trib.rb reshard 192.168.4.61:6379
计算四个主服务器,每个服务器平均的槽数为:16384/4 = 4096
从集群中要移出多少个槽:4096个(用于给新的master服务器)
How many slots do you want to move (from 1 to 16384)? 4096
ID 指定集群中的节点, 哪个节点将接收从集群中移出的4096个hash槽
这里给4.69主机(新的master节点)分配hash槽
What is the receiving node ID? d4d193c429616a95f2b1a4a5dacb26b9a88be549
选择从所有master节点拿出hash槽,还是从单一的master节点拿出hash槽,用于分配给新的master节点4.69
如果要从单个master中拿出hash槽,后面写master对应的ID值
这里选择all,从所有的master节点拿出hash槽,总数为4096个
Please enter all the source node IDS.
Type 'all' to user all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1: all
...
Do you want to proceed with the proposed reshard plan (yes/no)? yes
mgm68重新查看redis集群信息,每个主服务器都有4096个hash槽
[root@mgm68 ~]# redis-trib.rb info 192.168.4.61:6379
[root@mgm68 ~]# redis-trib.rb check 192.168.4.61:6379
[root@redis ~]# redis-cli -c -h 192.168.4.69 -p 6379
192.168.4.69:6379> keys *
192.168.4.69:6379> set k1 99
192.168.4.64:6379> set k2 199
192.168.4.69:6379> keys *
移除 slave 主机:从服务器没有 hash 槽,直接移除即可;移除时指定从服务器 id 值
移除slave从服务器4.65,在mgm68上操作
移除slave主机,需要获取4.65主机的ID值,可以通过check 获取
[root@mgm68 ~]# redis-trib.rb check 192.168.4.61:6379
S: 5aab79c9c6c27420884203a3bf2f86697354c31a 192.168.4.65:6379
[root@mgm68 ~]# redis-trib.rb del-node 192.168.4.61:6379 5aab79c9c6c27420884203a3bf2f86697354c31a #del-node 根据4.65的ID值,删除集群中的slave 4.65,192.168.4.61:6379 指定集群,可以是集群中任意节点
SHUTDOWN the node. #会停止被移除主机的redis服务
[root@mgm68 ~]# redis-trib.rb info 192.168.4.61:6379 #4.69主机的从服务器4.65被移除
192.168.4.69:6379 (d4d193c4...) -> 6 keys | 4096 slots | 0 slaves.
[root@redis65 ~]# ss -ntulp | grep redis #服务被停止
移除 master 服务器:释放占用的 hash 槽,移除主机
释放占用的 slots
指定移出 slots 个数
指定接收 slots 主机ID
指定移出 slots 主机ID
释放4.61主服务器占用的hash槽给到64主机,在mgm68上操作
[root@mgm68 ~]# redis-trib.rb info 192.168.4.61:6379 #获取要被移除主机的槽数(slots)
192.168.4.61:6379 (c1198049...) -> 2 keys | 4096 slots | 0 slaves.
reshard 重新分配hash槽数
[root@mgm68 ~]# redis-trib.rb reshard 192.168.4.61:6379
这里写要被移除的master节点的槽数(slots):4094
How many slots do you want to move (from 1 to 16384)? 4096
移除的4096个hash槽分配给哪个主机,写主机的ID号
这里分配给master节点4.64
What is the receiving node ID? 28ff0eaf0da4a8f256d6e57453d7fdbd2ae591e1
选择从所有master节点拿出hash槽,还是从单一的master节点拿出hash槽
如果要从单个master中拿出hash槽,后面写master对应的ID值
这里选择all,从所有的master节点拿出hash槽,总数为4096个
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
这里是从4.61主机中移除hash槽,如果只从一台主机中移除,后面写done即可
Source node #1:c1198049c748cd11daff4a2477bd9dcdb3358fba
Source node #2:done
Do you want to proceed with the proposed reshard plan (yes/no)?yes
[root@mgm68 ~]# redis-trib.rb info 192.168.4.61:6379 #要被移除的master节点4.61, hash槽数为0
192.168.4.61:6379 (c1198049...) -> 0 keys | 0 slots | 0 slaves.
[root@mgm68 ~]# redis-trib.rb check 192.168.4.61:6379 #移除master主机,需要获取4.61主机的ID值
M: c1198049c748cd11daff4a2477bd9dcdb3358fba 192.168.4.61:6379
[root@mgm68 ~]# redis-trib.rb del-node 192.168.4.61:6379 c1198049c748cd11daff4a2477bd9dcdb3358fba #del-node 根据4.61的ID值,删除集群中的master节点4.61,192.168.4.61:6379 指定集群,可以是集群中任意节点
SHUTDOWN the node. #会停止被移除主机的redis服务
将hash槽数平均分配到所有master服务器上
[root@mgm68 ~]# redis-trib.rb info 192.168.4.62:6379
rebalance 将hash槽数平均分配到所有master服务器上
[root@mgm68 ~]# redis-trib.rb rebalance 192.168.4.62:6379
[root@mgm68 ~]# redis-trib.rb info 192.168.4.62:6379 #所有master节点slots平均分配
把移除的redis服务器重新加入到redis集群中
当集群中的节点被移除后,该节点主机的默认数据目录下的文件 nodes-6379.conf 依然保存着集群信息,所以当重复添加时会报错,需要将其删除或通过集群命令重置
[root@redisA ~]# /etc/init.d/redis_6379 start
[root@redisA ~]# ss -ntulp | grep redis
验证集群信息,并通过集群命令,重置集群配置文件
[root@redisA ~]# redis-cli -h 192.168.4.61
192.168.4.61:6379> cluster info #查看集群信息
cluster_state:ok #已经被移除,但还是OK状态
192.168.4.61:6379> cluster reset #重置集群配置文件内的信息
192.168.4.61:6379> cluster info #查看集群信息
cluster_state:fail #fail状态,重置成功
192.168.4.61:6379> cluster nodes #查看集群节点信息,只有本机,清除成功
c1198049c748cd11daff4a2477bd9dcdb3358fba 192.168.4.61:6379@16379 myself,master - 0 1601368935353 1 connected
将4.61作为master服务器添加到redis的集群中
[root@mgm68 ~]# redis-trib.rb add-node 192.168.4.61:6379 192.168.4.62:6379
4.61 master节点添加成功,hash槽数目前为0,需要重新分配
[root@mgm68 ~]# redis-trib.rb info 192.168.4.62:6379
192.168.4.61:6379 (c1198049...) -> 0 keys | 0 slots | 0 slaves.
重新分配hash槽 (slots)
[root@mgm68 ~]# redis-trib.rb reshard 192.168.4.62:6379
#获取4.61主服务器的ID号,用于接收hash槽
M: c1198049c748cd11daff4a2477bd9dcdb3358fba 192.168.4.61:6379
#从集群中要移出20个槽,用于给新的master服务器
How many slots do you want to move (from 1 to 16384)? 20
#ID 指定集群中的节点, 哪个节点将接收从集群中移出的20个hash槽
#这里给4.61主机(新的master节点)分配hash槽
What is the receiving node ID? c1198049c748cd11daff4a2477bd9dcdb3358fba
#这里是从4.62节点上拿出20个hash槽,done为结束
Source node #1:c503c5db7fe80512cfc990b793f67af675ba4370
Source node #2:done
Do you want to proceed with the proposed reshard plan (yes/no)? yes
查看集群信息,集群中hash槽(slots)的数量不平均,数据被存储到 4.61节点上的几率很低,需要平均分配hash槽(slots)
[root@mgm68 ~]# redis-trib.rb info 192.168.4.62:6379
平均分配hash槽 (slots), slots 平均分配的前提,是所有的 master 都必须有hash槽
[root@mgm68 ~]# redis-trib.rb rebalance 192.168.4.62:6379
[root@mgm68 ~]# redis-trib.rb info 192.168.4.62:6379 #再次查看,已经平均分配