使用主从时需要避免主与从在同一物理机, 否则当一对主从挂机后, 对应数据不可使用
一. 构建
1. 创建6个Redis容器实例
docker run -d --name redis-node-1 --net host --privileged=true -v /opt/redis/share/redis-node-1:/data redis --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /opt/redis/share/redis-node-2:/data redis --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /opt/redis/share/redis-node-3:/data redis --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /opt/redis/share/redis-node-4:/data redis --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /opt/redis/share/redis-node-5:/data redis --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /opt/redis/share/redis-node-6:/data redis --cluster-enabled yes --appendonly yes --port 6386
# 参数详解 --net host = 使用宿主机的ip和端口, 是默认选项
2. 构建集群
redis-cli --cluster create 10.122.1.86:6381 10.122.1.86:6382 10.122.1.86:6383 10.122.1.86:6384 10.122.1.86:6385 10.122.1.86:6386 --cluster-replicas 1 # 一一分配
yes
3. 查看集群状态(redis内执行)
cluster info
cluster nodes # 可以确定主从的对应关系
M S
1 6
2 4
3 5
redis-cli --cluster check 10.122.1.86:6381 (容器内执行)
4.连接至集群中
docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381 -c
5. 容错迁移, 假使某个master宕, 是否有slave上位
docker stop redis-node-2 # 宿主机执行
# check状态
cluster nodes
# 发现master,fail, 短暂等待再次check
cluster nodes
# 会发现原先属于master2的slave4上位, 变成master
二. 扩容
需求: 新增主从, master6387, 其slave为6388
1. 启动实例
docker run -d --name redis-node-7 --net host --privileged=true -v /opt/redis/share/redis-node-7:/data redis --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /opt/redis/share/redis-node-8:/data redis --cluster-enabled yes --appendonly yes --port 6388
2. 将6387节点作为master加入集群
docker exec -it redis-node-7 /bin/bash
redis-cli --cluster add-node 10.122.1.86:6387 10.122.1.86:6381
redis-cli --cluster check 10.122.1.86:6381发现6387已经作为新的master
3. 重新分配槽号
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? c6822e309e97b70122ec8219334b28457bbd6845
Source node #1: all
Do you want to proceed with the proposed reshard plan (yes/no)? yes
redis-cli --cluster check 10.122.1.86:6381
# 发现6387节点具有4096个槽位(原本的3个节点各均匀分配一些出来)
1. 将6388作为6387的slave新增至集群
redis-cli --cluster add-node 10.122.1.86:6388 10.122.1.86:6387 --cluster-slave --cluster-master-id c6822e309e97b70122ec8219334b28457bbd6845
redis-cli -p 6381 -c
cluster nodes # 确认集群状态
三. 缩容
需求: 删除主从6387和6388
1. 删除从机6388
redis-cli --cluster del-node 10.122.1.86:6388 1da4941694c45812027fc74e687d7de17ad798eb
2. 重分配槽位
2.1 方案1: 将6387的槽位分配给6382
redis-cli --cluster reshard 10.122.1.86:6382
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 4314fd868093beea918b8aabacca74f3800855e4
Source node #1: c6822e309e97b70122ec8219334b28457bbd6845
Source node #2: done
Do you want to proceed with the proposed reshard plan (yes/no)? yes
redis-cli --cluster check 10.122.1.86:6381
# 发现6387已经没有槽位, 而6382有8192个槽位
1. 删除主机6387
redis-cli --cluster del-node 10.122.1.86:6387 c6822e309e97b70122ec8219334b28457bbd6845
2. 确认
redis-cli --cluster check 10.122.1.86:6381
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。