redis cluster扩容+slot迁移

目前的redis cluster情况:

Master1 → Slave1
Master2 → Slave2
Master3 → Slave3

现在增加:

Master4 → 暂时没有 Slave

然后希望:

Master1
Slot 0 ~ 5460
    ↓ 迁移一部分
Master4

最推荐的方式是使用 Redis 自带的 redis-cli --cluster 工具完成,而不是自己手动写大量迁移命令。


一、先启动 Master4

假设:

Master1 = 192.168.1.101:7001
Master2 = 192.168.1.102:7001
Master3 = 192.168.1.103:7001

Master4 = 192.168.1.104:7001 <--要新添加的cluster

首先在 192.168.1.104 上启动一个 Redis:

redis-server redis.conf

这时候 Master4 只是一个普通 Redis:

Master1
Master2
Master3

Master4  ← 还没有加入 Cluster

二、把 Master4 加入 Cluster

执行:

redis-cli --cluster add-node 192.168.1.104:7001 192.168.1.101:7001

这里:

192.168.1.104:7001
        ↑
     新节点

192.168.1.101:7001
        ↑
Cluster 中已经存在的节点

意思就是:

把 Master4 加入现有 Redis Cluster。

但是注意:

加进去以后,Master4 还没有 Slot。

也就是说:

Master1 → Slot 0 ~ 5460
Master2 → Slot 5461 ~ 10922
Master3 → Slot 10923 ~ 16383

Master4 → 没有 Slot

所以,此时 Master4 基本不能负责正常的数据请求


三、把 Master1 的部分 Slot 迁移给 Master4

这一步就是你真正想做的事情。

可以执行:

redis-cli --cluster reshard 192.168.1.101:7001

它会进入一个交互式过程

大概会问你:

How many slots do you want to move?

假设你想从 Master1 迁移 1000 个 Slot

1000

然后会问:

What is the receiving node ID?

这里填写:

Master4 的 Node ID

然后它还会问:

Source node IDs

这里填写:

Master1 的 Node ID

最后确认:

Do you want to proceed with the proposed reshard plan?

输入:

yes

Redis 就会开始迁移。


四、迁移过程中发生什么?

假设原来:

Master1
Slot 0 ~ 5460

你让它迁移 1000 个 Slot。

迁移完成之后可能变成:

Master1 → Slot 0 ~ 4460
Master4 → Slot 4461 ~ 5460

当然具体是哪 1000 个 Slot,是根据 Redis 的迁移计划决定的

而且非常重要:

Slot 迁移的时候,不只是把 Slot 编号改一下,对应 Slot 里面的数据也会一起迁移。

比如:

user:100
   ↓
Slot 5000
   ↓
原来 Master1

如果 Slot 5000 被迁移到 Master4:

user:100
   ↓
Slot 5000
   ↓
Master4

对应的数据也会迁过去。


五、整个过程可以记成

原来:

Master1 ── Slave1
  ↓
Slot 0 ~ 5460

Master2 ── Slave2
  ↓
Slot 5461 ~ 10922

Master3 ── Slave3
  ↓
Slot 10923 ~ 16383

第一步:启动 Master4

Master4

第二步:加入 Cluster

redis-cli --cluster add-node 192.168.1.104:7001 192.168.1.101:7001

Master1
Master2
Master3
Master4 ← 加入,但是暂时没有 Slot

第三步:reshard

redis-cli --cluster reshard 192.168.1.101:7001

迁移:

Master1
   │
   │ 1000个Slot
   ↓
Master4

最终:

Master1 → 4461个Slot
Master2 → 5462个Slot
Master3 → 5461个Slot
Master4 → 1000个Slot

具体数量根据你实际迁移的 Slot 数量而定。


六、还有一个非常重要的点:Master4 最好也配一个 Slave

你现在原来的结构是:

Master1 → Slave1
Master2 → Slave2
Master3 → Slave3

如果 Master4 加进来以后变成:

Master1 → Slave1
Master2 → Slave2
Master3 → Slave3
Master4

那么 Master4 没有副本

Master4 一旦挂掉,它负责的那些 Slot 就可能暂时无法正常提供服务。

所以生产环境一般会继续增加:

Master4 → Slave4

然后:

redis-cli --cluster add-node 192.168.1.105:7001 192.168.1.101:7001 --cluster-slave --cluster-master-id <Master4的NodeID>

最终:

              Redis Cluster

Master1 ─── Slave1
Master2 ─── Slave2
Master3 ─── Slave3
Master4 ─── Slave4

这就是比较完整的 Redis Cluster 扩容

小结:

Redis Cluster 扩容时,我会先启动新的 Redis 节点,然后使用 redis-cli --cluster add-node 把它加入集群;

再使用 redis-cli --cluster reshard 把原 Master 上的一部分 Slot 迁移到新 Master,迁移过程中对应 Slot 的数据也会一起迁移。

最后再给新 Master 配置 Replica,保证高可用。

七、查看集群节点的node id

这两个 ID 不是你自己随便写的,都是 Redis Cluster 给每个节点分配的 Node ID

你可以先执行:

redis-cli -p 7001 cluster nodes

它会返回类似:

07c37dfeb2352e0b9c586e9f3e8f4f3f... 192.168.1.101:7001@17001 master - 0 123456789 1 connected 0-5460
8f1a2b3c4d5e6f...                    192.168.1.102:7001@17001 master - 0 123456789 2 connected 5461-10922
9a2b3c4d5e6f7a...                    192.168.1.103:7001@17001 master - 0 123456789 3 connected 10923-16383
abc123def456...                      192.168.1.104:7001@17001 master - 0 123456789 4 connected

你重点看这一列:

07c37dfeb2352e0b...    ← Node ID

你的场景

假设:

Master1 = 192.168.1.101:7001
Master4 = 192.168.1.104:7001

执行:

redis-cli -p 7001 cluster nodes

找到:

Master1
07c37dfeb2352e0b... 192.168.1.101:7001 ... master ... 0-5460

Master4
abc123def456...      192.168.1.104:7001 ... master

那么:

Receive node ID:

填 Master4:

abc123def456...

因为它是:

接收 Slot 的节点。


Source node ID:

填 Master1:

07c37dfeb2352e0b...

因为它是:

提供 Slot 的节点。

所以你可以非常简单地记:

Source = 谁把 Slot 给出去
Receive = 谁接收 Slot

你的场景就是:

Master1
   │
   │  转移1000个Slot
   ↓
Master4

Source       Receive
Master1  →   Master4

还有一个小技巧

你甚至可以不用记 Node ID。

执行:

redis-cli --cluster reshard 192.168.1.101:7001

当它问:

How many slots do you want to move?

你输入:

1000

然后它问:

What is the receiving node ID?

这时候你就去另一个终端执行:

redis-cli -p 7001 cluster nodes

找到:

192.168.1.104:7001

对应的 Node ID,复制过来。

然后它问:

Source node IDs

再找到:

192.168.1.101:7001

对应的 Node ID。

所以本质上就是:

cluster nodes
      ↓
找到 IP:Port
      ↓
看它前面的 Node ID

不要把 192.168.1.104:7001 当成 Receive node ID。

192.168.1.104:7001节点地址,而类似:

abc123def456789...

这种一长串字符串才是 Node ID

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值