主要任务:
1、向集群中添加master,为master添加slave
2、移除集群中某台master的slave,移除没有slave的master
3、把移除的主机再次添加到集群当中
4、集群故障

一、向集群中添加主机:

添加master:(master的ip 192.168.4.57)

1、为主机192.168.4.57的redis修改ip地址,修改端口6357,开启集群功能
vim /etc/redis/6379.conf
    bind 192.168.4.57
    port 6357
    cluster-enabled  yes                         #启用集群
    cluster-config-file  nodes-6379.conf      #存储集群信息文件
    cluster-node-timeout  5000
/etc/init.d/redis_6379 start	#开启服务


2、将主机添加到集群当中作为master:(在MGM上进行操作)
# redis-trib.rb add-node 新添加的主机ip:端口 集群中任意主机ip:端口
redis-trib.rb add-node 192.168.4.57:6357  192.168.4.51:6351

3、为新添加的master主机分配hash槽:(在MGM上进行操作)
redis-trib.rb  reshard   192.168.4.51:6351	#重新分配hash槽,ip为集群中任意主机ip

# 以下为填写的信息,槽总共16384个,4个master每个4096
How many slots do you want to move (from 1 to 16384)?4096   #拿出4096个hash 槽给主机192.168.4.57
What is the receiving node ID?  c5e0da48f335c46a2ec199faa99b830f537dd8a0   #主机192.168.4.57的id值
Source node #1:all      #从当前所有master服务器获取hash槽
Do you want to proceed with the proposed reshard plan (yes/no)?yes #同意以上配置
# 当把槽分给4.57主机之后,数据也会分配给4.57主机



为master(4.57)主机添加slave(4.58):

1、为主机192.168.4.58的redis修改ip地址,修改端口6358,开启集群功能
vim /etc/redis/6379.conf
    bind 192.168.4.58
    port 6358
    cluster-enabled  yes                         #启用集群
    cluster-config-file  nodes-6379.conf      #存储集群信息文件
    cluster-node-timeout  5000
/etc/init.d/redis_6379 start	#开启服务

2、添加slave:(MGM上执行)
redis-trib.rb add-node --slave \	#做slave
[--master-id=c5e0da48f335c46a2ec199faa99b830f537dd8a0] \	#指定master4.57的id
192.168.4.58:6358  192.168.4.51:6351	#slave的ip,集群中任意主机的ip
# 如果不指定master的id,则默认分配给slave数量最少的master
# slave不需要分配槽

redis-trib.rb info192.168.4.51:6351		#查看集群信息
redis-trib.rb check 192.168.4.51:6351	#查看集群详细信息

二、从集群中移除主机:

移除master(4.57)的slave(4.58):

# redis-trib.rb  del-node 集群中任意主机的ip:端口 移除主机的id
redis-trib.rb  del-node 192.168.4.51:6351 f6649ea99b2f01faca26217691222c17a3854381
# 移除集群后,当前主机的redis服务会自动停止
# 集群配置文件nodes-6379.conf还存在
# 主机启动redis服务,主机4.58会认为自己还在集群中,但是集群已经没有了4.58的信息了



移除master(4.57):

1、回收master的hash槽:(MGM上执行)
redis-trib.rb  reshard 192.168.4.51:6351	#集群中任意主机的ip

How many slots do you want to move (from 1 to 16384)?4096 #移除4096个数槽
What is the receiving node ID?  bc5c4e082a5a3391b634cf433a6486c867cfc44b # 要移动给谁的id即目标主机(这里可以随机写一个master的id)  
Source node #1: c5e0da48f335c46a2ec199faa99b830f537dd8a0	#从谁那移动即源主机(这里写4.57的id)  
Source node #2:done           #设置完毕
# 把4.57的hash槽全部分配给了另外一个主机,相当于回收了4.57的hash槽

2、移除master:
# redis-trib.rb  del-node 集群中任意主机的ip:端口 移除主机的id
redis-trib.rb del-node 192.168.4.51:6351 c5e0da48f335c46a2ec199faa99b830f537dd8a0
# 移除集群后,当前主机的redis服务会自动停止
# 集群配置文件nodes-6379.conf还存在
# 主机启动redis服务,主机4.57会认为自己还在集群中,但是集群已经没有了4.57的信息了

三、把移除的主机再次添加到集群当中:

# 集群配置文件nodes-6379.conf还存在
# 主机启动redis服务,主机会认为自己还在集群中,但是集群已经没有主机的信息了
# 此时使用redis-trib.rb add-node添加主机会报错
# 因此需要重置redis服务器的集群设置
redis-cli -h 192.168.4.57 -p 6357	#连接redis
xxxx> CLUSTER RESET					#重置redis设置
redis-trib.rb add-node 192.168.4.57:6357  192.168.4.51:6351	#作为master添加到集群,不会报错
redis-trib.rb add-node --slave 192.168.4.57:6357  192.168.4.51:6351	#作为slave添加到集群

四、集群故障:

对于一台master来说,有两个slave,结构如下:
slave1 --> master <-- slave2

当master发生故障的时候,会从两台slave中选取一台作为新的master
另外一台slave会成为当前master的slave
当发生故障的机器修好之后,会作为当前master的slave,并且自动同步数据

当一组主从的master和slave都坏掉之后,由于hash槽没有回收,因此整个集群就会崩溃

xxx> info replication	#查看当前主机的复制信息

redis-trib.rb info192.168.4.51:6351		#查看集群信息
redis-trib.rb check 192.168.4.51:6351	#查看集群详细信息

写总结的第四十九天!!!