ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
### 集群伸缩 Redis 集群提供了灵活的节点扩容和收缩方案。在**不影响集群对外服务**的情况下,可以为集群添加节点进行扩容也可以下线部分节点进行缩容。 ![](https://img.kancloud.cn/51/fc/51fce519a97033fcb241ea721cb07ca3_749x447.png) #### 1、槽和数据与节点的对应关系 当主节点分别维护自己负责的槽和对应的数据,如果希望加入1个节点实现集群扩容时,需要通过相关命令把一部分槽和数据迁移给新节点。 ![](https://img.kancloud.cn/fe/b9/feb9266b3ff6f0677a25fc48c4f7fd1f_897x546.png) 上面图里的每个节点把一部分槽和数据迁移到新的节点newredis,每个节点负责的槽和数据相比之前变少了从而达到了集群扩容的目的,**集群伸缩=槽和数据在节点之间的移动**。 ##### 扩容操作 ###### 1.准备新机器 需要提前准备好新节点并**运行在集群模式下**,新节点建议跟集群内的节点配置保持一致,便于管理统一。 ###### 2.加入集群 通过 `redis-trib.rb add-node ip:6397 ip:6391` 实现节点添加。 ###### 3.迁移槽和数据 **加入集群后需要为新节点迁移槽和相关数据,槽在迁移过程中集群可以正常提供读写服务,迁移过程是集群扩容最核心的环节,下面详细讲解。** 槽是 Redis 集群管理数据的基本单位,首先需要为新节点制定槽的迁移计划,确定原有节点的哪些槽需要迁移到新节点。迁移计划需要确保每个节点负责相似数量的槽,从而保证各节点的数据均匀,比如之前是三个节点,现在是四个节点,把节点槽分布在四个节点上。 ![](https://img.kancloud.cn/21/d5/21d5be0109f9ebae5ed894732118e648_876x325.png) 槽迁移计划确定后开始逐个把槽内数据从源节点迁移到目标节点. ![](https://img.kancloud.cn/7e/f1/7ef1d8dd2a802dceed73ba70908c62bf_858x318.png) 数据迁移过程是逐个槽进行的 流程说明: 1)对目标节点发送导入命令,让目标节点准备导入槽的数据。 2)对源节点发送导出命令,让源节点准备迁出槽的数据。 3)源节点循环执行迁移命令,将槽跟数据迁移到目标节点。 ![](https://img.kancloud.cn/27/b8/27b8df5500aa31be8d7bb4c68d2c0527_609x383.png) `redis-trib` 提供了槽重分片功能,命令如下: redis-trib.rb reshard host:port --from <arg> --to <arg> --slots <arg> --yes --timeout <arg> --pipeline <arg> 参数说明: `·host:port:`必传参数,集群内任意节点地址,用来获取整个集群信息。 `·--from:`制定源节点的 id,如果有多个源节点,使用逗号分隔,如果是all源节点变为集群内所有主节点,在迁移过程中提示用户输入。 `·--to:`需要迁移的目标节点的id,目标节点只能填写一个,在迁移过程中提示用户输入。 `·--slots:`需要迁移槽的总数量,在迁移过程中提示用户输入。 `·--yes:`当打印出 reshard 执行计划时,是否需要用户输入yes确认后再执行 reshard。 `·--timeout:`控制每次 migrate 操作的超时时间,默认为60000毫秒。 `·--pipeline:`控制每次批量迁移键的数量,默认为10。 **迁移操作** redis-trib.rb reshard ip:6379 打印出集群每个节点信息后,reshard 命令需要确认迁移的槽数量,这里我们根据节点个数输入对应的值: ![](https://img.kancloud.cn/1c/56/1c56171000cdd02b5231d5512c3131dc_465x75.png) 输入某个节点的节点 ID 作为目标节点,目标节点只能指定一个: What is the receiving node ID xxxx ![](https://img.kancloud.cn/ea/7a/ea7ad627bd5fe6af1e4be203baaa6335_554x151.png) 之后输入源节点的 ID,这里分别输入相应的节点 ID 最后用 done 表示结束: 数据迁移之前会打印出所有的槽从源节点到目标节点的计划,确认计划无误后输入 yes 执行迁移工作 redis-trib 工具会打印出每个槽迁移的进度: ![](https://img.kancloud.cn/26/4a/264a5298d7bf9e37aa25bbdff760a187_468x73.png) 查看节点的信息cluster-node ![](https://img.kancloud.cn/58/63/586376461364673dacc787ae55cd7949_554x88.png) 输入 `redis-trib.rb rebalance ip:port` ![](https://img.kancloud.cn/4b/6c/4b6c0850ffdcbdd7dbcdb263e8c82b6f_487x115.png) **主从节点设置** 扩容之初我们把6397、6398节点加入到集群,节点6397迁移了部分槽和数据作为主节点,但相比其他主节点目前还没有从节点,因此该节点不具备故障转移的能力。 这时需要把节点6398作为6397的从节点,从而保证整个集群的高可用。使用 `cluster replicate{masterNodeId}`命令为主节点添加对应从节点。 #### 收缩集群 收缩集群意味着缩减规模,需要从现有集群中安全下线部分节点,下线节点过程。持续更新中。。。