14、Docker Compose 安装 Redis 集群(三主三从)
🌟 CentOS 9 + Docker Compose 搭建 Redis Cluster 集群全指南
Redis Cluster 是 Redis 提供的原生分片解决方案,它可以自动分片数据、支持高可用,并能在部分节点故障时继续服务。本文将手把手讲解如何在 CentOS 9 上使用 Docker Compose 快速搭建 Redis Cluster 集群。
📌 一、环境准备
- 操作系统:CentOS 9
- Docker:建议 24.x 版本
- Docker Compose:建议 2.x 版本
- 网络:独立 bridge 网络,保证容器互联
安装 Docker 与 Docker Compose
📦 二、目录结构设计
redis-cluster/
├─ docker-compose.yml
├─ redis/
│ ├─ redis-7000.conf
│ ├─ redis-7001.conf
│ ├─ redis-7002.conf
│ ├─ redis-7003.conf
│ ├─ redis-7004.conf
│ └─ redis-7005.conf
我们使用 6 个节点,3 个主 + 3 个从,端口范围 7000~7005。
🔹 三、Redis Cluster 拓扑可视化
为了让读者更直观地理解 Redis Cluster 3 主 3 从架构,我们使用 Mermaid 图 + 彩色标注 展示集群拓扑及主从关系:
🔹 特性说明
- 红色节点:Master 主节点,显示端口号、槽位范围、状态
- 蓝色节点:Slave 从节点,显示从属的主节点和状态
- 虚线连接:表示集群主节点互联,用于 Gossip 协议
- 箭头:表示主从复制关系
📝 四、Redis 节点配置文件
以 7000 端口为例:
# redis/redis-7000.conf
port 7000
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
protected-mode no
说明:
配置项 | 作用 |
---|---|
port | 容器对外端口 |
bind | 监听地址,0.0.0.0 表示所有网卡 |
cluster-enabled | 开启集群模式 |
cluster-config-file | 存储集群节点信息 |
cluster-node-timeout | 节点超时时间 |
appendonly | AOF 持久化 |
protected-mode | 关闭保护模式(Docker 内部网络使用) |
其他节点只需改端口和 cluster-config-file 即可。
🐳 五、Docker Compose 文件
version: "3.9"
services:redis-7000:image: redis:7.2container_name: redis-7000ports:- "7000:7000"volumes:- ./redis/redis-7000.conf:/usr/local/etc/redis/redis.confcommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]networks:- redis-netredis-7001:image: redis:7.2container_name: redis-7001ports:- "7001:7001"volumes:- ./redis/redis-7001.conf:/usr/local/etc/redis/redis.confcommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]networks:- redis-netredis-7002:image: redis:7.2container_name: redis-7002ports:- "7002:7002"volumes:- ./redis/redis-7002.conf:/usr/local/etc/redis/redis.confcommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]networks:- redis-netredis-7003:image: redis:7.2container_name: redis-7003ports:- "7003:7003"volumes:- ./redis/redis-7003.conf:/usr/local/etc/redis/redis.confcommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]networks:- redis-netredis-7004:image: redis:7.2container_name: redis-7004ports:- "7004:7004"volumes:- ./redis/redis-7004.conf:/usr/local/etc/redis/redis.confcommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]networks:- redis-netredis-7005:image: redis:7.2container_name: redis-7005ports:- "7005:7005"volumes:- ./redis/redis-7005.conf:/usr/local/etc/redis/redis.confcommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]networks:- redis-netnetworks:redis-net:driver: bridge
🚀 六、启动 Redis 节点
docker compose up -d
查看容器状态:
docker ps
输出示例:
CONTAINER ID IMAGE PORTS NAMES
abc123 redis:7.2 0.0.0.0:7000->7000/tcp redis-7000
def456 redis:7.2 0.0.0.0:7001->7001/tcp redis-7001
...
🔗 七、创建 Redis Cluster
进入任意节点容器,运行以下命令:
docker exec -it redis-7000 redis-cli --cluster create \redis-7000:7000 redis-7001:7001 redis-7002:7002 \redis-7003:7003 redis-7004:7004 redis-7005:7005 \--cluster-replicas 1
说明:
--cluster-replicas 1
表示每个主节点有一个从节点- 系统会提示确认,输入
yes
完成集群创建
验证集群状态:
docker exec -it redis-7000 redis-cli -p 7000 cluster nodes
你会看到 6 个节点和它们的主从关系。
详细介绍:
序号 | 含义 |
---|---|
1 | Node ID:节点唯一标识,例如 7e152538d01558fdf8fb541baf7518428cd55a53 |
2 | IP:PORT:节点网络地址,@BUS-PORT 是集群内部通信端口。例如 172.23.0.7:7005@17005 |
3 | 角色:master 或 slave ;当前节点是主节点还是从节点 |
4 | 主节点 ID:如果是从节点,这里会显示它复制的主节点 ID;如果是主节点,显示 - |
5 | Ping-sent:最近一次发送 ping 的时间戳(毫秒) |
6 | Pong-recv:最近一次收到 pong 的时间戳(毫秒) |
7 | Config Epoch:配置纪元(用于主从选举) |
8 | 状态:connected 表示节点处于正常连接状态 |
9 | Slots:主节点负责的槽位范围(只有主节点有) |
🧪 八、测试集群
1. 写入测试:
[root@localhost redis-cluster]# docker exec -it redis-7000 redis-cli -c -p 7000
127.0.0.1:7000> set key1 value1
-> Redirected to slot [9189] located at 172.23.0.5:7001
OK
172.23.0.5:7001> set key1 value1
OK
172.23.0.5:7001> get key1
"value1"
172.23.0.5:7001>
🔹 含义解析
-> Redirected to slot [9189] located at 172.23.0.5:7001
这个提示是 Redis Cluster 正常的重定向机制,它的意思是:
-
slot [9189]
- Redis Cluster 会把所有 key 根据 CRC16 哈希算法映射到 16384 个槽位(0~16383)
- key1 的哈希槽位是 9189
-
located at 172.23.0.5:7001
- 槽位 9189 当前归属于主节点 7001(IP 172.23.0.5)
- 所以 Redis 告诉客户端:“你请求的 key 应该在这个节点上”
-
作用
- 这是 MOVED 重定向机制,Redis Cluster 的客户端收到这个提示后会自动跳转到正确节点
- 如果你使用
redis-cli -c
或支持 Cluster 的客户端(如 Jedis Cluster、Lettuce Cluster),它会自动去 7001 节点执行操作
🔹 简单理解
- 你在 7000 节点执行
get key1
- Redis 发现 key1 属于槽位 9189,而 9189 在 7001
- 7000 返回重定向消息,告诉客户端去 7001 访问
- 使用 cluster-aware 客户端就可以自动跳过去
这条消息本身不是错误,而是 Cluster 正常工作机制的一部分。
2. 故障测试:停止某个主节点,看集群是否还能正常读写:
[root@localhost redis-cluster]# docker stop redis-7000
redis-7000
[root@localhost redis-cluster]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0b691235c6ab redis:7.2 "docker-entrypoint.s…" 14 minutes ago Up 14 minutes 6379/tcp, 0.0.0.0:7002->7002/tcp, [::]:7002->7002/tcp redis-7002
76fa0338a3db redis:7.2 "docker-entrypoint.s…" 14 minutes ago Up 14 minutes 6379/tcp, 0.0.0.0:7004->7004/tcp, [::]:7004->7004/tcp redis-7004
cf56c92c6a09 redis:7.2 "docker-entrypoint.s…" 14 minutes ago Up 14 minutes 6379/tcp, 0.0.0.0:7001->7001/tcp, [::]:7001->7001/tcp redis-7001
e06f6e658a07 redis:7.2 "docker-entrypoint.s…" 14 minutes ago Up 14 minutes 6379/tcp, 0.0.0.0:7005->7005/tcp, [::]:7005->7005/tcp redis-7005
1757a69fca2b redis:7.2 "docker-entrypoint.s…" 14 minutes ago Up 14 minutes 6379/tcp, 0.0.0.0:7003->7003/tcp, [::]:7003->7003/tcp redis-7003
[root@localhost redis-cluster]# docker exec -it redis-7001 redis-cli -p 7001 get key1
"value1"
[root@localhost redis-cluster]#
Redis Cluster 会自动将从节点提升为主节点,保持服务可用。
⚠️ 九、常见问题
问题 | 解决方法 |
---|---|
节点无法互联 | 检查 Docker Compose 网络是否在同一 redis-net |
Cluster 创建失败 | 检查端口是否被占用、配置文件端口与命令是否一致 |
数据丢失 | 确认 appendonly yes ,挂载 Volume 持久化配置文件 |
容器重启后配置丢失 | Volume 必须映射到宿主机 |
🎯 十、总结
本文介绍了 CentOS 9 + Docker Compose 搭建 Redis Cluster 集群 的完整流程:
- Redis 配置文件详解
- Docker Compose 多节点部署
- Redis Cluster 初始化与验证
- 高可用故障测试
- 常见问题与解决方案
通过该方案,你可以快速搭建一个高可用、分布式 Redis Cluster 环境,适合开发和测试使用,也可扩展到生产环境。