Redis 高可用集群部署实战:单Docker实现1主2从3
前言
在现代分布式系统中,高可用性是系统设计的核心目标之一。Redis 作为高性能的内存数据库,其高可用架构设计直接影响着整个系统的稳定性。本文将手把手教你搭建一套生产级的 Redis 高可用集群,涵盖主从复制、哨兵监控、自动故障转移等核心技术点。
本文价值:通过实战部署案例,深入理解 Redis 高可用架构原理,掌握生产环境部署技巧,规避常见坑点。

👉 关联文章|从传统Linux部署到容器化:实践对比与工程化指南(涵盖 Docker 安装与镜像加速配置)
👉 完整脚本链接|git仓库链接,涵盖python的实验和实用脚本
一、架构设计解析
1.1 高可用架构概览
本方案采用经典的 Redis Sentinel 高可用架构,通过主从复制 + 哨兵监控实现故障自动转移:
1.2 核心组件职责
| 组件类型 | 数量 | IP地址 | 职责说明 |
|---|---|---|---|
| Master | 1 | 172.30.0.2 | 处理写请求,数据同步到从节点 |
| Slave | 2 | 172.30.0.3-4 | 处理读请求,数据冗余备份 |
| Sentinel | 3 | 172.30.0.5-7 | 监控节点状态,自动故障转移 |
二、环境准备
2.1 系统要求
Docker 20.10+
4GB+ 可用内存
网络端口:6379,6380,6381,26379,26380,26381
Linux/Windows/MacOS 支持 Docker 的环境
2.2 网络规划
采用 自定义桥接网络 实现容器间通信:
网络名称: redis-net
子网网段: 172.30.0.0/24
网关地址: 172.30.0.1
三、部署实战(已把脚本拆解,需要自己合并)
3.1 环境初始化
#!/bin/bash
# Redis 高可用集群部署脚本
# 描述: 自动化部署 Redis 主从 + Sentinel 集群
IMG=redis:7.0-alpine
NET=redis-net
SUBNET=172.30.0.0/24# 清旧环境
docker rm -f redis-master redis-slave1 redis-slave2 sentinel1 sentinel2 sentinel3 2>/dev/null
docker network rm $NET 2>/dev/null# 创建自定义桥接网络
docker network create --subnet $SUBNET --gateway 172.30.0.1 $NET# 创建目录
mkdir -p /opt/redis/{master,slave1,slave2,sentinel{1..3}}/data
3.2 配置文件准备
3.2.1 主节点配置
# 3. 主配置
cat >/opt/redis/master/redis.conf <<'EOF'
bind 0.0.0.0
port 6379
protected-mode no
daemonize no
requirepass 123456
masterauth 123456
appendonly yes
dir /data
EOF
3.2.2 从节点配置
# 从节点配置(slave1, slave2)
for n in slave1 slave2; do
cat >/opt/redis/$n/redis.conf <<'EOF'
bind 0.0.0.0
port 6379
protected-mode no
daemonize no
requirepass 123456
masterauth 123456
replicaof 172.30.0.2 6379
appendonly yes
dir /data
EOF
done
3.2.3 哨兵配置
# 哨兵统一配置
cat >/opt/redis/sentinel.conf <<'EOF'
bind 0.0.0.0
port 26379
protected-mode no
daemonize no
sentinel monitor mymaster 172.30.0.2 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000
EOF
for i in 1 2 3; docp /opt/redis/sentinel.conf /opt/redis/sentinel$i/
done
3.3 容器启动
# 启动 Redis
docker run -d --name redis-master --network $NET -p 6379:6379 \-v /opt/redis/master/redis.conf:/usr/local/etc/redis/redis.conf:ro \-v /opt/redis/master/data:/data $IMG redis-server /usr/local/etc/redis/redis.confdocker run -d --name redis-slave1 --network $NET -p 6380:6379 \-v /opt/redis/slave1/redis.conf:/usr/local/etc/redis/redis.conf:ro \-v /opt/redis/slave1/data:/data $IMG redis-server /usr/local/etc/redis/redis.confdocker run -d --name redis-slave2 --network $NET -p 6381:6379 \-v /opt/redis/slave2/redis.conf:/usr/local/etc/redis/redis.conf:ro \-v /opt/redis/slave2/data:/data $IMG redis-server /usr/local/etc/redis/redis.conf# 8. 启动哨兵(同一网络,IP 即 172.30.0.5/6/7)
for i in 1 2 3; dodocker run -d --name sentinel$i --network $NET -p $((26379+i-1)):26379 \-v /opt/redis/sentinel$i/sentinel.conf:/usr/local/etc/redis/sentinel.conf \redis:7.0-alpine redis-sentinel /usr/local/etc/redis/sentinel.conf
done
3.4 集群状态验证
# 等待服务启动
sleep 5
echo ===== 主从 =====
docker exec redis-master redis-cli -a 123456 info replication | grep -E 'role|connected_slaves'
echo ===== 哨兵 =====
for i in 1 2 3; doprintf "sentinel$i: "docker exec sentinel$i redis-cli -p 26379 info sentinel | grep -E 'sentinel_masters|slaves|sentinels' | tr '\n' ' 'echo
done
效果截图

四、功能测试验证
4.1 数据同步测试
# 在主节点写入数据
echo "测试主从数据同步..."
docker exec redis-master redis-cli -a 123456 set site "moonshot"
echo "主节点写入: site=moonshot"# 在从节点读取数据验证同步
docker exec redis-slave1 redis-cli -a 123456 get site
docker exec redis-slave2 redis-cli -a 123456 get site

五、故障转移实战
5.1 模拟主节点故障
# 模拟主节点宕机
docker kill redis-master# 检查新的主节点,等待10秒左右
docker exec sentinel1 redis-cli -p 26379 sentinel get-master-addr-by-name mymaster
5.2 故障转移结果验证
# 查看容器状态
docker ps -a | grep redis# 查看剩余节点状态
docker exec sentinel1 redis-cli -p 26379 info sentinel# 验证新主节点数据
NEW_MASTER=$(docker exec sentinel1 redis-cli -p 26379 sentinel get-master-addr-by-name mymaster | head -1)

六、运维管理指南
6.1 日常监控命令
# 查看所有容器状态
docker ps -a# 查看主从复制状态
docker exec redis-master redis-cli -a 123456 info replication# 查看哨兵状态
docker exec sentinel1 redis-cli -p 26379 info sentinel# 查看当前主节点
docker exec sentinel1 redis-cli -p 26379 sentinel get-master-addr-by-name mymaster
6.2 性能监控指标
七、总结与展望
7.1 方案优势总结
| 特性 | 实现情况 | 说明 |
|---|---|---|
| 高可用性 | 已支持 | 主节点故障自动转移 |
| 数据冗余 | 已支持 | 多从节点数据备份 |
| 读写分离 | 已支持 | 从节点分担读压力 |
| 监控告警 | 已支持 | 哨兵实时监控 |
| 容器化 | 已支持 | Docker 快速部署 |
7.2 生产环境建议
- 监控告警:集成 Prometheus + Grafana 监控
- 日志管理:使用 ELK 栈集中管理日志
- 备份策略:定期备份数据到远程存储
- 性能调优:根据业务特点调整参数
7.3 扩展方案
八、参考资料
- Redis 官方文档 - Sentinel
- Docker 最佳实践教程
- Redis 高可用架构设计
