前提:
- 根据高可用部署 规划 master 和 slave 的部署。
- 使用 bitnami-redis 部署 master 和 slave StatefulSets。
组 Master 成为集群
进入任意 master,把另外两个加进来:
1
2
|
redis-cli -a <pass> CLUSTER MEET <master2-ip> <master2-port>
redis-cli -a <pass> CLUSTER MEET <master3-ip> <master3-port>
|
参考命令:
分配 Slot
此时所有 master 都没有负责任何 slot,要为 3 个 master 分配 slot:
1
2
3
4
5
6
|
# 进入 master-1
redis-cli -a <pass> CLUSTER ADDSLOTS $(seq -s ' ' 0 5500)
# 进入 master-2
redis-cli -a <pass> CLUSTER ADDSLOTS $(seq -s ' ' 5501 11000)
# 进入 master-3
redis-cli -a <pass> CLUSTER ADDSLOTS $(seq -s ' ' 11001 16383)
|
如果是 Redis 7.0 则:
1
2
3
4
5
6
|
# 进入 master-1
redis-cli -a <pass> CLUSTER ADDSLOTSRANGE 0 5500
# 进入 master-2
redis-cli -a <pass> CLUSTER ADDSLOTS 5501 11000
# 进入 master-3
redis-cli -a <pass> CLUSTER ADDSLOTS 11001 16383
|
参考命令:
检查集群状态
进入任意 master:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
redis-cli -a <pass> --cluster check <any-master-ip>:<any-master-port>
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node <any-master-ip>:<any-master-port>)
M: <master1-id> <master1-ip>:<master1-port>
slots:[<start>-<end>] (<num> slots) master
M: <master2-id> <master2-ip>:<master2-port>
slots:[<start>-<end>] (<num> slots) master
M: <master3-id> <master3-ip>:<master3-port>
slots:[<start>-<end>] (<num> slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] Not all 16384 slots covered.
|
添加 Slave
挨个进入 Slave 执行下列命令,把自己和集群建立联系,然后配置为某个 master 的 slave,注意根据 slave 运行位置安排对应关系,保持高可用架构:
1
2
3
4
|
# 把自己加入新建群中,连接集群中的任意节点
redis-cli -a <pass> CLUSTER MEET <any-master-ip> <any-master-port>
# 把自己设置为某个 Master Node 的 Slave
redis-cli -a <pass> CLUSTER REPLICATE <master-node-id>
|
参考命令:
取消分配 Slot
如果想调整 slot 分布,则要先把 slot 解放出来。
使用的是 CLUSTER DELSLOTS,和 CLUSTER ADDSLOTS 不同,CLUSTER DELSLOTS
必须在所有 master 和 slave 上执行,这个命令的意思是,让执行此命令的节点忘记 slot 的归属(包括自己),简单来说就是,当所有人都忘记 slot 的归属时,这个 slot 就自由了:
1
2
|
# 进入所有 master 和 slave
redis-cli -a <pass> CLUSTER DELSLOTS $(seq -s ' ' <start> <end>)
|
如果是 Redis 7.0 则:
1
2
|
# 进入所有 master 和 slave
redis-cli -a <pass> CLUSTER DELSLOTSRANGE <start> <end>
|
参考命令:
删除 Master
前提:master 上没有任何 slot
方法:
进入到以下节点执行命令:
- 每个 master(除了要被删掉的 master)
- 每个 slave (除了要被删掉的 master 的 slave)
1
|
redis-cli -a <pass> CLUSTER FORGET <master-id>
|
进入到被删除 master,重置:
1
|
redis-cli -a <pass> CLUSTER RESET
|
注意:以上所有操作要在 60 秒内全部执行完,否则可能因为 gossip 协议导致被删除 master 再次加入。
参考命令:
参考文档:
删除 Slave
进入到以下节点执行命令:
- 每个 master
- 每个 slave (除了要被删掉的的 slave)
1
|
redis-cli -a <pass> CLUSTER FORGET <slave-id>
|
进入到被删除 slave,重置:
1
|
redis-cli -a <pass> CLUSTER RESET
|
注意:以上所有操作要在 60 秒内全部执行完,否则可能因为 gossip 协议导致被删除 slave 再次加入。
评论