欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

深入浅析Redis 集群伸缩原理

程序员文章站 2022-04-09 11:59:55
redis 节点分别维护自己负责的槽和对应的数据。伸缩原理:redis 槽和对应数据在不同节点之间移动环境:centos7 搭建 redis 集群一、集群扩容1. 手动扩容(1) 准备节点 9007,...

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 集群管理数据的基本单位。数据迁移是逐槽进行的

槽迁移流程:

深入浅析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% 以内,因此集群节点数据相对均匀,无需调整

二、集群收缩

深入浅析Redis 集群伸缩原理

1. 迁移槽

执行 reshard 三次,将数据平均分布到其他三个节点

2. 忘记节点

60s 内对所有节点执行如下操作:(不建议)

建议使用 redis-cli 的 del-node 忘记节点:

内部伪代码

若主从节点都要下线,先下线从,避免全量复制

以上就是redis 集群伸缩原理的详细内容,更多关于redis 集群原理的资料请关注其它相关文章!