我们首先按照上面Cluster集群搭建部分的内容,先启动两个redis实例192.168.0.61:8007(主)
和192.168.0.61:8008(从)
然后执行下面的命令
# -a redis连接密码
# 第一个ip为当前新启动的redis实例ip
# 后面一个ip为当前cluster集群中任意一个正常运行的节点ip
/usr/local/redis-5.0.3/src/redis-cli -a hs --cluster add-node 192.168.0.61:8007 192.168.0.61:8001
查看节点状态
/usr/local/redis-5.0.3/src/redis-cli -a hs -c -h 192.168.0.61 -p 8001
192.168.0.61:8001> cluster nodes
新加入的节点都是master,并且不会分配任何slot槽位,我们要手动为新节点分配hash槽
使用redis-cli --cluster reshard
命令为新加入的节点分配槽位,需要使用集群中任意一个master节点对其进行重新分片工作
/usr/local/redis-5.0.3/src/redis-cli -a hs --cluster reshard 192.168.0.61:8001
接下来的命令交互如下:
… …
How many slots do you want to move (from 1 to 16384)? 600
(ps:需要多少个槽移动到新的节点上,自己设置,比如600个hash槽)
… …
What is the receiving node ID? 2728a594a0498e98e4b83a537e19f9a0a3790f38
(ps:把这600个hash槽移动到哪个节点上去,需要指定节点id)
… …
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.
Source node 1:all
(ps:输入all为从所有主节点(8001,8002,8003)中分别抽取相应的槽数指定到新节点中,抽取的总槽数为600个)
… …
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(ps:输入yes确认开始执行分片任务)
接下来再查看最新的集群节点信息
/usr/local/redis-5.0.3/src/redis-cli -a hs -c -h 192.168.0.61 -p 8001
192.168.0.61:8001> cluster nodes
此时还只是添加了一台master节点到集群中,我们接下来在添加192.168.0.61:8008
节点来作为192.168.0.61:8007
节点的从节点
# 使用集群中任意一个节点来进行添加新节点
/usr/local/redis-5.0.3/src/redis-cli -a hs --cluster add-node 192.168.0.61:8008 192.168.0.61:8001
新加入的节点是master,并且不会分配slot槽位
接下来需要登录刚刚添加的新节点,使用replicate
命令来指定当前节点要作为哪一个节点的slave节点,
# 先登录从节点,然后在replicate命令中指定主节点的id
/usr/local/redis-5.0.3/src/redis-cli -a hs -c -h 192.168.0.61 -p 8008
192.168.0.61:8008> cluster replicate 2728a594a0498e98e4b83a537e19f9a0a3790f38 #后面这串id为8007的节点id
现在8008端口的redis实例就变为了slave了。
接下来将上面新增加的两个节点删除
删除8008从节点
用redis-cli --cluster del-node
删除从节点8008,指定删除节点ip和端口,以及节点id
/usr/local/redis-5.0.3/src/redis-cli -a hs --cluster del-node 192.168.0.61:8008 a1cfe35722d151cf70585cee21275565393c0956
再次查看集群状态,如下图所示,8008这个slave节点已经移除,并且该节点的redis服务也已被停止
删除8807主节点
主节点的里面是有分配了hash槽的,所以我们这里必须先把8007里的hash槽放入到其他的可用主节点中去,然后再进行移除节点操作,不然会出现数据丢失问题
目前只能把master的数据迁移到一个节点上,暂时做不了平均分配功能
# 任选一个主节点进行重新分片
/usr/local/redis-5.0.3/src/redis-cli -a hs --cluster reshard 192.168.0.61:8007
接下来的命令交互如下:
… …
How many slots do you want to move (from 1 to 16384)? 600
(ps:需要多少个槽移动到新的节点上)
… …
What is the receiving node ID? 2728a594a0498e98e4b83a537e19f9a0a3790f38
(ps:把这600个hash槽移动到哪个节点上去,这里使用8001的主节点id)
… …
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.
Source node 1:2728a594a0498e98e4b83a537e19f9a0a3790f38
(ps:这里是需要数据源,也就是我们的8007节点id。这里这次就不写all了)
Source node 2:done
(ps:这里直接输入done 开始生成迁移计划)
… …
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(ps:这里输入yes开始迁移)
至此,我们已经成功的把8007主节点的数据迁移到8001上去了,我们可以看一下现在的集群状态如下图,你会发现8007下面已经没有任何hash槽了,证明迁移成功!
最后我们直接使用del-node命令删除8007主节点即可
# 指定要删除的节点实例ip 端口 节点id
/usr/local/redis-5.0.3/src/redis-cli -a hs --cluster del-node 192.168.0.61:8007 2728a594a0498e98e4b83a537e19f9a0a3790f38
现在就是回到了最当开始六个实例的时候了