先决条件
- 了解 docker 基础知识和网络模式
- 熟练使用 docker 常用命令
- 网络模式使用 host 主机模式(自定义组网模式待验证)
开始构建
-
示例命令
docker run -itd --name redis-node-x -v /home/redis/share/redis-node-x:/data(持久化目录) -e TZ=Asia/Shanghai --net host(适用主机网络模式) --privileged=true(让容器用户在容器中拥有root权限) redis:7.0.3 --requirepass 123456 --cluster-enabled yes(开启集群) --appendonly yes(开启持久化) --port 6380(修改redis默认端口:默认值:6379)
-
拉去镜像
docker pull redis:7.0.3
-
启动 6 个 redis 容器
docker run -itd --name redis-node-1 -v /home/redis/share/redis-node-1:/data -e TZ=Asia/Shanghai --net host --privileged=true redis:7.0.3 --requirepass 123456 --cluster-enabled yes --appendonly yes --port 6381 docker run -itd --name redis-node-2 -v /home/redis/share/redis-node-2:/data -e TZ=Asia/Shanghai --net host --privileged=true redis:7.0.3 --requirepass 123456 --cluster-enabled yes --appendonly yes --port 6382 docker run -itd --name redis-node-3 -v /home/redis/share/redis-node-3:/data -e TZ=Asia/Shanghai --net host --privileged=true redis:7.0.3 --requirepass 123456 --cluster-enabled yes --appendonly yes --port 6383 docker run -itd --name redis-node-4 -v /home/redis/share/redis-node-4:/data -e TZ=Asia/Shanghai --net host --privileged=true redis:7.0.3 --requirepass 123456 --cluster-enabled yes --appendonly yes --port 6384 docker run -itd --name redis-node-5 -v /home/redis/share/redis-node-5:/data -e TZ=Asia/Shanghai --net host --privileged=true redis:7.0.3 --requirepass 123456 --cluster-enabled yes --appendonly yes --port 6385 docker run -itd --name redis-node-6 -v /home/redis/share/redis-node-6:/data -e TZ=Asia/Shanghai --net host --privileged=true redis:7.0.3 --requirepass 123456 --cluster-enabled yes --appendonly yes --port 6386
-
创建集群
redis-cli --cluster create 192.168.0.51:6381 192.168.0.51:6382 192.168.0.51:6383 192.168.0.51:6384 192.168.0.51:6385 192.168.0.51:6386 --cluster-replicas 1 -a 123456
-
进入其中一个容器
docker exec -it redis-node-1 /bin/bash
-
登录 redis
redis-cli -p 6381 -a 123456
-
查看集群信息
cluster info
-
查看节点信息
cluster nodes
-
根据 7 和 8 的结果,分析本次主从关系,结果如下
M S 1 6 2 4 3 5
-
集群后使用
集群后,要使用集群连接,如果使用单机指定连接,有的key-value值存不进去,因为集群槽值范围不一样,比如出现:cluster_slots_assigned:16384错误信息。 redis-cli -p 6381 -c(使用集群模式连接) -a 123456 redis-cli -p 6381 -c -a 123456
-
集群情况检测
redis-cli --cluster check 192.168.0.51:6381 -a 123456 这里可以测试主从切换(他们会互相交换位置,如果需要还原自己的配置架构位置关系,需要按照顺序启停主从)
集群扩容
-
扩容
扩容(4主4从) docker run -itd --name redis-node-7 -v /home/redis/share/redis-node-7:/data -e TZ=Asia/Shanghai --net host --privileged=true redis:7.0.3 --requirepass 123456 --cluster-enabled yes --appendonly yes --port 6387 docker run -itd --name redis-node-8 -v /home/redis/share/redis-node-8:/data -e TZ=Asia/Shanghai --net host --privileged=true redis:7.0.3 --requirepass 123456 --cluster-enabled yes --appendonly yes --port 6388
-
加盟新节点
redis-cli --cluster add-node 192.168.0.51:6387 192.168.0.51:6381 -a 123456 192.168.0.51:6387 新加入成员 192.168.0.51:6381 已有成员的领路人
-
检查
redis-cli --cluster check 192.168.0.51:6387 -a 123456
-
重新分配槽号
redis-cli --cluster reshard 192.168.0.51:6381 -a 123456 槽大小:4096 节点ID:6e03e01bdb7531428081c673d6b39e31bdab6a96 模式:all 最后一步确认:yes
-
重新检查,注意观察槽号分配情况
redis-cli --cluster check 192.168.0.51:6387 -a 123456 发现现象:前3个都会给第四个分一点槽号,均摊现象
-
给新主节点增加从节点
redis-cli --cluster add-node 192.168.0.51:6388 192.168.0.51:6387 -a 123456 \ --cluster-slave --cluster-master-id 主节点ID redis-cli --cluster add-node 192.168.0.51:6388 192.168.0.51:6387 -a 123456 \ --cluster-slave --cluster-master-id 6e03e01bdb7531428081c673d6b39e31bdab6a96
集群缩容
-
缩容
找到slave节点的ID slave id:c63ba08f93646f2318bfe625c66de3332164ee45
-
删除 slave
redis-cli --cluster del-node 192.168.0.51:6388 c63ba08f93646f2318bfe625c66de3332164ee45 -a 123456
-
重新检查集群状态
redis-cli --cluster check 192.168.0.51:6381 -a 123456
-
重新分配槽号
redis-cli --cluster reshard 192.168.0.51:6381 -a 123456
-
回收方案
可以把回收的主节点的所有槽号全部分配给一个节点 可以把回收的主节点的所有槽号平均的分配给目前所有的主节点 步骤: 1、接受槽号的数量 2、接受槽号的节点ID 3、从哪个节点ID获取槽号 4、done 生成计划 5、yes 执行处理计划
-
重新检查
redis-cli --cluster check 192.168.0.51:6381 -a 123456
-
删除释放的节点(扩容的主节点)
redis-cli --cluster del-node 192.168.0.51:6387 7e576dcb3adbe6afee28a71f6e369ccdcd17fbf1 -a 123456
回顾总结
构建不论是不是 docker 或原生 linux,都需要注意网络环境是否通畅、防火墙是否拦截了自定义端口等,注意检查状态时候查看槽号分配,节点主从归属;集群模式下 redis 只有 db0;集群模式下连接 redis 需要使用集群模式,命令行增加-c 参数
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于