深入浅析Redis 集群伸缩原理

redis 节点分别维护自己负责的槽和对应的数据。伸缩原理:redis 槽和对应数据在不同节点之间移动

环境:centos7 搭建 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 集群原理的资料请关注www.887551.com其它相关文章!

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐