目前的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。

419

被折叠的 条评论
为什么被折叠?



