当前位置: 首页 > ds >正文

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 端口为例:

# 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节点超时时间
appendonlyAOF 持久化
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 个节点和它们的主从关系。

详细介绍:

序号含义
1Node ID:节点唯一标识,例如 7e152538d01558fdf8fb541baf7518428cd55a53
2IP:PORT:节点网络地址,@BUS-PORT 是集群内部通信端口。例如 172.23.0.7:7005@17005
3角色masterslave;当前节点是主节点还是从节点
4主节点 ID:如果是从节点,这里会显示它复制的主节点 ID;如果是主节点,显示 -
5Ping-sent:最近一次发送 ping 的时间戳(毫秒)
6Pong-recv:最近一次收到 pong 的时间戳(毫秒)
7Config Epoch:配置纪元(用于主从选举)
8状态connected 表示节点处于正常连接状态
9Slots:主节点负责的槽位范围(只有主节点有)

🧪 八、测试集群

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

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

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

http://www.xdnf.cn/news/17973.html

相关文章:

  • linux 软硬链接详解
  • vscode的wsl环境,ESP32驱动0.96寸oled屏幕
  • 前端包管理工具
  • 基于wireshark的USB 全速硬件抓包工具USB Sniffer Lite的使用
  • 【lucene】DocumentsWriterFlushControl
  • 负载因子(Load Factor) :哈希表(Hash Table)中的一个关键性能指标
  • C++ 滑动窗口、二分查找
  • Ubuntu 22.04 远程桌面设置固定密码的方法
  • 快手入局外卖?上桌了,又没上
  • 第4节课:多模态大模型的核心能力(多模态大模型基础教程)
  • 18.13 《3倍效率提升!Hugging Face datasets.map高级技巧实战指南》
  • 顺序表插入删除
  • list模拟实现
  • 2025 年电赛 C 题 发挥部分 1:多正方形 / 重叠正方形高精度识别与最小边长测量
  • 36 C++ STL模板库5-string
  • %in%与`==
  • pnpm常用命令;为什么使用pnpm?
  • CV 医学影像分类、分割、目标检测,之【肺结节目标检测】项目拆解
  • 华为6730交换机恢复接口默认配置
  • 疏老师-python训练营-Day45Tensorboard使用介绍
  • elasticsearch冷热数据读写分离!
  • 数学建模-非线性规划模型
  • Linux编程1:进程和线程
  • 目标检测-动手学计算机视觉12
  • 爱情的本质及模拟推演
  • 机器翻译:Hugging Face库详解
  • 模型选择与调优
  • Java 并发新范式:用 Structured Concurrency 优雅收拾多线程烂摊子
  • Linux软件编程:进程和线程
  • 【软考中级网络工程师】知识点之入侵防御系统:筑牢网络安全防线