14、Docker Compose 安装 Redis 集群(三主三从)

🌟 CentOS 9 + Docker Compose 搭建 Redis Cluster 集群全指南

Redis Cluster 是 Redis 提供的原生分片解决方案,它可以自动分片数据、支持高可用,并能在部分节点故障时继续服务。本文将手把手讲解如何在 CentOS 9 上使用 Docker Compose 快速搭建 Redis Cluster 集群。


📌 一、环境准备

  1. 操作系统:CentOS 9
  2. Docker:建议 24.x 版本
  3. Docker Compose:建议 2.x 版本
  4. 网络:独立 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 7000
Slot 0-5460
Status: OK Master 7001
Slot 5461-10922
Status: OK Master 7002
Slot 10923-16383
Status: OK Slave 7003
Replicate: 7000
Status: OK Slave 7004
Replicate: 7001
Status: OK Slave 7005
Replicate: 7002
Status: OK

🔹 特性说明

  • 红色节点:Master 主节点,显示端口号、槽位范围、状态
  • 蓝色节点:Slave 从节点,显示从属的主节点和状态
  • 虚线连接:表示集群主节点互联,用于 Gossip 协议
  • 箭头:表示主从复制关系

📝 四、Redis 节点配置文件

以 7000 端口为例:

conf 复制代码
# 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 文件

yaml 复制代码
version: "3.9"
services:
  redis-7000:
    image: redis:7.2
    container_name: redis-7000
    ports:
      - "7000:7000"
    volumes:
      - ./redis/redis-7000.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      - redis-net

  redis-7001:
    image: redis:7.2
    container_name: redis-7001
    ports:
      - "7001:7001"
    volumes:
      - ./redis/redis-7001.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      - redis-net

  redis-7002:
    image: redis:7.2
    container_name: redis-7002
    ports:
      - "7002:7002"
    volumes:
      - ./redis/redis-7002.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      - redis-net

  redis-7003:
    image: redis:7.2
    container_name: redis-7003
    ports:
      - "7003:7003"
    volumes:
      - ./redis/redis-7003.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      - redis-net

  redis-7004:
    image: redis:7.2
    container_name: redis-7004
    ports:
      - "7004:7004"
    volumes:
      - ./redis/redis-7004.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      - redis-net

  redis-7005:
    image: redis:7.2
    container_name: redis-7005
    ports:
      - "7005:7005"
    volumes:
      - ./redis/redis-7005.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      - redis-net

networks:
  redis-net:
    driver: bridge

🚀 六、启动 Redis 节点

bash 复制代码
docker compose up -d

查看容器状态:

bash 复制代码
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

进入任意节点容器,运行以下命令:

bash 复制代码
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 完成集群创建

验证集群状态:

bash 复制代码
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 角色masterslave;当前节点是主节点还是从节点
4 主节点 ID :如果是从节点,这里会显示它复制的主节点 ID;如果是主节点,显示 -
5 Ping-sent:最近一次发送 ping 的时间戳(毫秒)
6 Pong-recv:最近一次收到 pong 的时间戳(毫秒)
7 Config Epoch:配置纪元(用于主从选举)
8 状态connected 表示节点处于正常连接状态
9 Slots:主节点负责的槽位范围(只有主节点有)

🧪 八、测试集群

1. 写入测试:

bash 复制代码
[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 正常的重定向机制,它的意思是:

  1. slot [9189]

    • Redis Cluster 会把所有 key 根据 CRC16 哈希算法 映射到 16384 个槽位(0~16383)
    • key1 的哈希槽位是 9189
  2. located at 172.23.0.5:7001

    • 槽位 9189 当前归属于主节点 7001(IP 172.23.0.5)
    • 所以 Redis 告诉客户端:"你请求的 key 应该在这个节点上"
  3. 作用

    • 这是 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. 故障测试:停止某个主节点,看集群是否还能正常读写:

bash 复制代码
[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 环境,适合开发和测试使用,也可扩展到生产环境。