redis cluster集群节点的扩缩容、重新分配槽位

扩容

我们首先按照上面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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-thkshdbv-1679531893788)(picture/Redis/81628)]

新加入的节点都是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

redis cluster集群节点的扩缩容、重新分配槽位_第1张图片

此时还只是添加了一台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

redis cluster集群节点的扩缩容、重新分配槽位_第2张图片

新加入的节点是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了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hZQ2XRGS-1679531893789)(picture/Redis/81647)]



缩容

接下来将上面新增加的两个节点删除

删除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服务也已被停止

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YcgPw3oe-1679531893789)(picture/Redis/81657)]

删除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槽了,证明迁移成功!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8zsscp6Y-1679531893789)(picture/Redis/81668)]

最后我们直接使用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

现在就是回到了最当开始六个实例的时候了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EqQc7Rx6-1679531893789)(picture/Redis/81676)]

你可能感兴趣的:(小知识点,redis,数据库,缓存)