深入浅析Redis 集群伸缩原理
redis 节点分别维护自己负责的槽和对应的数据。伸缩原理:redis 槽和对应数据在不同节点之间移动
一、集群扩容
1. 手动扩容
(1) 准备节点 9007,并加入集群
192.168.11.40:9001> cluster meet 192.168.11.40 9007
【注意】若 cluster meet 加入已存在于其它集群的节点,会导致集群合并,造成数据错乱!。建议使用 redis-cli 的 add-node:
(2) 迁移槽和数据
槽在迁移过程中集群可以正常提供读写服务
首先确定原有节点的哪些槽需要迁移到新节点。确保每个节点负责相似数量的槽,保证各节点的数据均匀
槽是 redis 集群管理数据的基本单位。数据迁移是逐槽进行的
槽迁移流程:
- 目标节点准备导入槽的数据:目标节点执行
cluster setslot {slot} importing {sourcenodeid}
- 源节点准备迁出槽的数据:源节点执行
cluster setslot {slot} migrating {targetnodeid}
- 获取 count 个属于槽 slot 的键:源节点执行
cluster getkeysinslot {slot} {count}
- 迁移键:源节点执行
migrate {targetip} {targetport} "" 0 {timeout} keys {keys...}
,把键通过流水线(pipeline)机制批量迁移到目标节点。redis3.0.6 后才支持批量迁移 - 重复上两步,直到槽下所有的键值数据迁移到目标节点
- 向集群所有主节点通知槽被分配给目标节点:集群内所有主节点执行
cluster setslot {slot} node {targetnodeid}
内部伪代码:
(3) 将 9001 的槽 4096 迁移到 9007 中
准备数据
192.168.11.40:9001> set key:test:5028 value:5028
192.168.11.40:9001> set key:test:68253 value:68253
目标节点准备工作
源节点准备工作
导出数据
通知所有主节点:槽 4096 指派给 9007
查看最终结果
192.168.11.40:9007> cluster nodes
8ccdb0963411ebd05ce21952bdd4b7597825afdc 192.168.11.40:9001@19001 master - 0 1620931743303 7 connected 0-4095 4097-5461
bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d 192.168.11.40:9007@19007 myself,master - 0 1620931741000 8 connected 4096
...
2. 使用 redis-cli 扩容
redis-cli 提供了槽重分片功能
reshard 命令参数详解:
将 9001、9002、9003 的槽迁移到 9007,共迁移 4096 个
查看最终结果
192.168.11.40:9007> cluster nodes
8ccdb0963411ebd05ce21952bdd4b7597825afdc 192.168.11.40:9001@19001 master - 0 1620933907753 7 connected 1366-4095 4097-5461
5786e3237c7fa413ed22465d15be721f95e72cfa 192.168.11.40:9002@19002 master - 0 1620933906733 1 connected 6827-10922
85ceb9826e8aa003169c46fb4ba115c72002d4f9 192.168.11.40:9003@19003 master - 0 1620933905000 3 connected 12288-16383
bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d 192.168.11.40:9007@19007 myself,master - 0 1620933900000 8 connected 0-1365 4096 5462-6826 10923-12287
...
检查节点之间槽的均衡性
迁移之后所有主节点负责的槽数量差异在 2% 以内,因此集群节点数据相对均匀,无需调整
二、集群收缩
1. 迁移槽
执行 reshard 三次,将数据平均分布到其他三个节点
2. 忘记节点
60s 内对所有节点执行如下操作:(不建议)
建议使用 redis-cli 的 del-node 忘记节点:
内部伪代码
若主从节点都要下线,先下线从,避免全量复制
以上就是redis 集群伸缩原理的详细内容,更多关于redis 集群原理的资料请关注其它相关文章!