Redis Cluster集群伸缩

本文基于redis-5.0.3版本,环境为Mac OS,单机器上部署。

在Redis高可用集群之rediscluster文章中介绍了Redis Cluster集群的两种搭建方式,本篇文章来讲述下集群的伸缩问题。

使用redis-cli --cluster help 查看可用命令以及使用方式,文章里只对不容易理解的地方作说明。

集群扩容

第一步:准备新节点
以Redis高可用集群之rediscluster文章中搭建的集群为基础,新增8006和8007节点,配置文件内容参考8000实例节点,将文件中的8000全局替换为对应的端口实例即可,比如8006实例的配置:

bind 10.40.222.186
port 8006
daemonize yes
pidfile /var/run/redis_8006.pid
logfile "redis8006.log"
dbfilename dump8006.rdb
dir /redis-cluster/redis8006
masterauth 123456
requirepass 123456
appendonly yes
appendfilename "appendonly8006.aof"

#集群模式配置
cluster-enabled yes # 启动集群模式
cluster-config-file nodes-8006.conf  # 集群配置文件,自动生成 后期勿动
cluster-node-timeout 15000
cluster-replica-validity-factor 10
cluster-require-full-coverage no #部分节点下线的情况下也可以对外提供服务

第二步:加入集群
启动所有示例,可以发现8006和8007还属于孤立节点,需要将这两个实例节点加入到集群中。
Redis Cluster集群伸缩_第1张图片
添加8006实例节点:
../redis-5.0.3/src/redis-cli -a 123456 --cluster add-node 10.40.222.186:8006 10.40.222.186:8000

添加8007实例节点并指定主节点:
../redis-5.0.3/src/redis-cli -a 123456 --cluster add-node 10.40.222.186:8007 10.40.222.186:8000 --cluster-slave --cluster-master-id 8b5145fdd13161f846a6f312e1efaa7587f12842
其中--cluster-master-id后面的值为8006实例节点的run-id。

使用cluster nodes命令查看集群当前状态:
在这里插入图片描述
第三步:迁移槽和数据
上面的图中可以看到,8006和8007已正确添加到集群中,接下来就开始分配槽位。我们将8000、8001、8002三个节点中的槽位分别迁出一些槽位给8006,假设分配后的每个节点槽位平均,那么应该分出(16384/4)=4096个槽位。

语法:/redis-cli --cluster reshard 已存在节点ip:端口

执行命令:
../redis-5.0.3/src/redis-cli -a 123456 --cluster reshard 10.40.222.186:8000

注意红框中的内容,英文很好理解这里不再解释。Resharding plan会预先打印出分配计划,填写yes即可。分配后的集群状态如下:
集群状态
节点已成功加入集群并分配好槽位,说明集群扩容成功。

集群缩容

第一步:迁移槽和数据
语法:redis-cli --cluster reshard --cluster-from 要迁出节点ID --cluster-to 接收槽节点ID --cluster-slots 迁出槽数量 已存在节点ip 端口

迁出1365个槽位到8000节点
../redis-5.0.3/src/redis-cli -a 123456 --cluster reshard --cluster-from 8b5145fdd13161f846a6f312e1efaa7587f12842 --cluster-to ade0a5ff7c10689d4eebc2e9ce3dca25b768a070 --cluster-slots 1365 10.40.222.186 8000

迁出1365个槽位到8001节点
../redis-5.0.3/src/redis-cli -a 123456 --cluster reshard --cluster-from 8b5145fdd13161f846a6f312e1efaa7587f12842 --cluster-to 0aa42e1f81225e450e6482985b5da61928d7342c --cluster-slots 1365 10.40.222.186 8000

迁出1366个槽位到8002节点
../redis-5.0.3/src/redis-cli -a 123456 --cluster reshard --cluster-from 8b5145fdd13161f846a6f312e1efaa7587f12842 --cluster-to 416bf32139d56eb5f0198e93ef2a6eb32b016f8a --cluster-slots 1366 10.40.222.186 8000

第二步:下线节点

语法:redis-cli --cluster del-node 已存在节点:端口 要删除的节点ID
下线节点
下线节点不仅是从集群中移除,而且进程也会给shutdown掉。缩容后的集群状态如下:
cluster status

集群故障转移

故障转移的方式与sentinel方式类似。

故障发现
通过ping/pong消息实现故障发现(不依赖sentinel)

故障恢复:

  • 检查资格:每个从节点检查与主节点的断开时间 超过cluster-node-timeout * cluster-replica-validity-factor 时间取消资格,满足资格的选择偏移量最大的节点。
  • 替换主节点:通过slaveof no one命令,让选出来的从节点成为主节点;撤销以前主节点的槽位给新的主节点;向集群广播消息,表明已经替换了故障节点。

------------本文结束感谢您的阅读------------

你可能感兴趣的:(redis)