docker部署redis cluster需三主三从6节点,分两阶段启动:先启全部节点并确认就绪,再用redis-cli --cluster create初始化;必须关闭protected-mode、启用aof、固定端口(7001–7006)及总线端口(+10000),密码须在集群创建后动态配置。

用 Docker 部署 Redis Cluster 是 Java 项目中实现高可用、可扩展缓存的主流方案。它不依赖中心节点,6 节点(3 主 3 从)即可支撑生产级读写分离与自动故障转移,Java 应用通过 Jedis 或 Lettuce 客户端直连任意主节点即可完成分片路由和容错访问。
Redis Cluster 核心机制必须清楚
集群基于 16384 个哈希槽(slot)实现数据分片:每个 key 经 crc16(key) % 16384 算出所属槽位,槽由主节点负责;从节点不参与读写,只同步数据并准备故障接管。集群节点间用 Gossip 协议交换状态,无需哨兵——自身具备检测、选举、主从切换能力。
- 必须至少 6 个节点(3 主 + 3 从)才能满足最小高可用要求;少于 3 个主节点无法容忍单点故障
- 所有主节点共同覆盖全部 16384 个槽,任一主节点宕机且无从节点晋升时,若 cluster-require-full-coverage yes,整个集群将拒绝写入
- 不支持多数据库(db0 是唯一可用库),也不支持事务跨槽执行、Lua 脚本跨槽调用等操作
Docker Compose 快速部署三主三从
推荐使用自定义 bridge 网络而非 host 模式,避免端口冲突和 IP 绑定硬编码。以 6 个节点为例,统一规划端口 7001–7006,每个节点挂载独立配置与数据目录:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 创建网络:
docker network create redis-net --subnet=192.168.101.0/24 - 为每个节点生成 redis.conf,关键项示例(以 7001 为例):
port 7001<br>bind 0.0.0.0<br>cluster-enabled yes<br>cluster-config-file nodes.conf<br>cluster-node-timeout 5000<br>cluster-announce-ip 192.168.101.101<br>cluster-announce-port 7001<br>cluster-announce-bus-port 17001<br>appendonly yes<br>protected-mode no
- docker-compose.yml 中每个 service 映射对应端口、挂载配置与 data 卷,并指定 network 为 redis-net
初始化集群与密码配置要分两步走
集群创建阶段严禁设置密码——redis-cli --cluster create 会因认证失败中断。正确流程是:
- 先启动全部 6 个容器,确认
redis-cli -p 7001 cluster info显示cluster_state:fail(正常) - 执行集群构建:
redis-cli --cluster create 192.168.101.101:7001 192.168.101.101:7002 ... --cluster-replicas 1 - 集群就绪后,逐个进入容器执行动态设密:
redis-cli -p 7001 config set requirepass "yourpass"<br>redis-cli -p 7001 config set masterauth "yourpass"<br>redis-cli -p 7001 config rewrite
Java 客户端接入要点
Lettuce 是当前推荐客户端(线程安全、响应式、内置 Cluster 支持),Maven 引入后配置如下:
- 连接字符串格式:
redis://:yourpass@192.168.101.101:7001,192.168.101.101:7002,...(逗号分隔多个节点) - 启用自适应拓扑刷新:
ClusterClientOptions.builder().autoReconnect(true).topologyRefreshOptions(ClusterTopologyRefreshOptions.builder().enableAllAdaptiveRefreshTriggers().build()).build() - 避免手动分片:直接使用
StatefulRedisClusterConnection,Lettuce 自动根据 key 计算 slot 并路由到对应节点 - 异常处理需捕获
RedisException和RedisCommandExecutionException,对 MOVED/ASK 重定向自动重试
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










