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

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.dtcms.com/a/331597.html

相关文章:

  • 嵌入式学习笔记--MCU阶段--DAY12实时操作系统rt_thread1
  • Cypher注入详解:原理、类型与测试方法
  • 使用免费API开发口播数字人
  • 数智化与全球化,双轮驱动艾芬达持续引领行业变革
  • 嵌入式 - Linux软件编程:进程
  • PIDGenRc函数中lpstrRpc的由来和InitializePidVariables函数的关系
  • 什么是期权ETF分仓的意思呢?
  • 安全加固4(K8S最小化微服务安全)
  • java-JVM详解
  • 如何安装 scikit-learn Python 库
  • Azure微软云内网接入问题
  • 大规模调用淘宝商品详情 API 的分布式请求调度实践
  • ant design vue pro 1.7.8 自定义渲染菜单,多页签,keep-alive 详细教程 vue2.x版
  • day33-LNMP
  • PostgreSQL——视图
  • 六十五、【Linux数据库】MySQL表结构 、 MySQL键值
  • 重学JS-003 --- JavaScript算法与数据结构(三)JavaScript 基础调试方法
  • Codeforces 1042 Div3(ABCDEFG)
  • 【科研日常】使用tensorflow实现自注意力机制和交叉注意力机制
  • Java中Record的应用
  • Flink Stream API 源码走读 - socketTextStream
  • Spark Shuffle机制原理
  • STM32HAL 快速入门(七):GPIO 输入之光敏传感器控制蜂鸣器
  • 深入理解管道(下):括号命令 `()`、`-ExpandProperty` 与 AD/CSV 实战
  • Java 大视界 -- Java 大数据在智能家居能耗监测与节能优化中的应用探索(396)
  • 【漏洞复现】WinRAR 目录穿越漏洞(CVE-2025-8088)
  • JavaScript 解构赋值语法详解
  • iOS Sqlite3
  • Playwright初学指南 (3):深入解析交互操作
  • 【完整源码+数据集+部署教程】肾脏病变实例分割系统源码和数据集:改进yolo11-CARAFE