使用 docker 搭建 redis-cluster 集群

本贴最后更新于 201 天前,其中的信息可能已经沧海桑田

先决条件

  1. 了解 docker 基础知识和网络模式
  2. 熟练使用 docker 常用命令
  3. 网络模式使用 host 主机模式(自定义组网模式待验证)

开始构建

  1. 示例命令

    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)
    
  2. 拉去镜像

    docker pull redis:7.0.3
    
  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
    
  4. 创建集群

    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
    
  5. 进入其中一个容器

    docker exec -it redis-node-1 /bin/bash
    
  6. 登录 redis

    
    redis-cli -p 6381 -a 123456
    
  7. 查看集群信息

    cluster info
    
  8. 查看节点信息

    cluster nodes
    
  9. 根据 7 和 8 的结果,分析本次主从关系,结果如下

    M	S
    1	6
    2	4
    3	5
    
  10. 集群后使用

    集群后,要使用集群连接,如果使用单机指定连接,有的key-value值存不进去,因为集群槽值范围不一样,比如出现:cluster_slots_assigned:16384错误信息。
    redis-cli -p 6381 -c(使用集群模式连接) -a 123456
    redis-cli -p 6381 -c -a 123456
    
  11. 集群情况检测

    redis-cli --cluster check 192.168.0.51:6381 -a 123456
    这里可以测试主从切换(他们会互相交换位置,如果需要还原自己的配置架构位置关系,需要按照顺序启停主从)
    
    

集群扩容

  1. 扩容

    扩容(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
    
  2. 加盟新节点

    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 已有成员的领路人
    
  3. 检查

    redis-cli --cluster check 192.168.0.51:6387  -a 123456
    
  4. 重新分配槽号

    redis-cli --cluster reshard 192.168.0.51:6381 -a 123456
    
    槽大小:4096
    
    节点ID:6e03e01bdb7531428081c673d6b39e31bdab6a96
    
    模式:all
    
    最后一步确认:yes
    
  5. 重新检查,注意观察槽号分配情况

    redis-cli --cluster check 192.168.0.51:6387  -a 123456
    
    发现现象:前3个都会给第四个分一点槽号,均摊现象
    
  6. 给新主节点增加从节点

    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
    

集群缩容

  1. 缩容

    找到slave节点的ID
    slave id:c63ba08f93646f2318bfe625c66de3332164ee45
    
  2. 删除 slave

    redis-cli --cluster del-node 192.168.0.51:6388 c63ba08f93646f2318bfe625c66de3332164ee45 -a 123456
    
  3. 重新检查集群状态

    redis-cli --cluster check 192.168.0.51:6381  -a 123456
    
  4. 重新分配槽号

    redis-cli --cluster reshard 192.168.0.51:6381 -a 123456
    
  5. 回收方案

    可以把回收的主节点的所有槽号全部分配给一个节点
    可以把回收的主节点的所有槽号平均的分配给目前所有的主节点
    步骤:
    1、接受槽号的数量
    2、接受槽号的节点ID
    3、从哪个节点ID获取槽号
    4、done 生成计划
    5、yes 执行处理计划
    
  6. 重新检查

    redis-cli --cluster check 192.168.0.51:6381 -a 123456
    
  7. 删除释放的节点(扩容的主节点)

    redis-cli --cluster del-node 192.168.0.51:6387 7e576dcb3adbe6afee28a71f6e369ccdcd17fbf1 -a 123456
    

回顾总结

构建不论是不是 docker 或原生 linux,都需要注意网络环境是否通畅、防火墙是否拦截了自定义端口等,注意检查状态时候查看槽号分配,节点主从归属;集群模式下 redis 只有 db0;集群模式下连接 redis 需要使用集群模式,命令行增加-c 参数

  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 62 关注
  • 集群
    29 引用 • 65 回帖 • 1 关注
1 操作
JayGao 在 2024-05-04 23:19:30 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
JayGao
JayGao 的个人博客,分享技术,记录生活,感谢您的支持与关注。 成都