Docker+Redis Cluster集群搭建避坑指南:三主三从配置全流程解析

张开发
2026/4/17 8:49:17 15 分钟阅读

分享文章

Docker+Redis Cluster集群搭建避坑指南:三主三从配置全流程解析
DockerRedis Cluster集群实战三主三从架构深度配置与排错手册Redis Cluster作为分布式缓存解决方案在实际开发中常遇到网络配置复杂、槽位分配异常等痛点。本文将手把手带你用Docker构建生产级三主三从集群重点解决以下核心问题为什么Cluster模式需要开放两个端口如7001和17001如何避免跨主机通信导致的CLUSTERDOWN错误当出现Not all 16384 slots are covered时如何快速修复槽位分配1. 环境准备网络架构设计陷阱1.1 虚拟网络规划许多教程忽略了一个关键点Redis Cluster节点间通信需要双向可达的网络环境。使用默认的Docker桥接网络可能导致节点发现失败。推荐创建自定义网络# 创建带固定子网的网络避免IP冲突 docker network create \ --subnet172.28.0.0/16 \ --gateway172.28.0.1 \ redis-cluster-net典型踩坑场景节点IP采用自动分配重启后IP变化导致集群失效未开放集群总线端口默认客户端端口10000防火墙阻止了节点间通信提示生产环境建议为每个节点配置固定IP如下表所示节点角色容器名称IP地址客户端端口集群总线端口Master-1redis-node-1172.28.0.101700117001Master-2redis-node-2172.28.0.102700217002Master-3redis-node-3172.28.0.103700317003Slave-1redis-node-4172.28.0.104700417004Slave-2redis-node-5172.28.0.105700517005Slave-3redis-node-6172.28.0.1067006170061.2 配置文件关键参数创建redis-cluster目录存放所有配置主节点配置示例redis-master-1.confport 7001 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 cluster-announce-ip 172.28.0.101 # 必须与容器IP一致 cluster-announce-port 7001 cluster-announce-bus-port 17001 # 总线端口必须显式声明 appendonly yes protected-mode no易错点分析cluster-announce-*参数未设置 → 外网无法访问集群protected-mode设为yes → 从节点无法连接主节点cluster-node-timeout过小 → 频繁主从切换2. 容器化部署实战2.1 Docker Compose编排使用以下docker-compose.yml模板注意端口映射的特殊性version: 3.8 services: redis-node-1: image: redis:7.0 container_name: redis-node-1 networks: redis-cluster-net: ipv4_address: 172.28.0.101 ports: - 7001:7001 - 17001:17001 # 集群总线端口必须暴露 volumes: - ./redis-master-1.conf:/usr/local/etc/redis/redis.conf - ./data/node-1:/data command: [redis-server, /usr/local/etc/redis/redis.conf] # 其他节点配置类似... networks: redis-cluster-net: external: true关键操作# 启动所有节点 docker-compose up -d # 检查节点日志观察集群握手过程 docker logs -f redis-node-12.2 集群初始化执行集群创建命令时90%的失败源于节点发现超时。推荐使用--cluster-replicas 1自动分配主从关系# 进入任意容器执行 redis-cli --cluster create \ 172.28.0.101:7001 \ 172.28.0.102:7002 \ 172.28.0.103:7003 \ 172.28.0.104:7004 \ 172.28.0.105:7005 \ 172.28.0.106:7006 \ --cluster-replicas 1 \ --cluster-yes # 自动确认配置成功标志[OK] All 16384 slots covered3. 高频故障排查指南3.1 槽位分配异常当出现Not all slots are covered时手动修复步骤检查各节点槽位分布redis-cli -h 172.28.0.101 -p 7001 cluster slots重新分配未覆盖的槽位redis-cli --cluster fix 172.28.0.101:70013.2 主从切换失败典型错误日志FAIL message received from node-id about node-id解决方案检查节点间网络连通性docker exec redis-node-1 ping 172.28.0.102调整cluster-node-timeout建议≥15000ms3.3 客户端重定向问题使用-c参数启用集群模式连接redis-cli -c -h 172.28.0.101 -p 7001当看到MOVED错误时说明客户端未正确处理重定向。主流客户端配置示例// Jedis集群模式配置 SetHostAndPort nodes new HashSet(); nodes.add(new HostAndPort(172.28.0.101, 7001)); // ...添加所有节点 JedisCluster jedis new JedisCluster(nodes);4. 性能调优与监控4.1 关键指标监控通过CLUSTER INFO获取集群状态redis-cli -h 172.28.0.101 -p 7001 cluster info重点关注cluster_state应为okcluster_slots_assigned必须等于16384cluster_known_nodes当前节点数4.2 内存优化配置在redis.conf中添加hash-max-ziplist-entries 512 hash-max-ziplist-value 64 activerehashing yes4.3 备份策略集群数据备份需要逐个节点执行# 在宿主机执行 docker exec redis-node-1 \ redis-cli -p 7001 save \ cp ./data/node-1/dump.rdb /backups/redis-node-1-$(date %s).rdb

更多文章