Redis 高可用集群部署实战:单Docker实现1主2从3

前言

在现代分布式系统中,高可用性是系统设计的核心目标之一。Redis 作为高性能的内存数据库,其高可用架构设计直接影响着整个系统的稳定性。本文将手把手教你搭建一套生产级的 Redis 高可用集群,涵盖主从复制、哨兵监控、自动故障转移等核心技术点。

本文价值:通过实战部署案例,深入理解 Redis 高可用架构原理,掌握生产环境部署技巧,规避常见坑点。

👉 关联文章|从传统Linux部署到容器化:实践对比与工程化指南(涵盖 Docker 安装与镜像加速配置)

👉 完整脚本链接|git仓库链接,涵盖python的实验和实用脚本

一、架构设计解析

1.1 高可用架构概览

本方案采用经典的 Redis Sentinel 高可用架构,通过主从复制 + 哨兵监控实现故障自动转移:
Sentinel 哨兵集群 Redis 高可用集群 数据同步 数据同步 监控 监控 监控 Sentinel1
172.30.0.5:26379 Sentinel2
172.30.0.6:26380 Sentinel3
172.30.0.7:26381 Master节点
172.30.0.2:6379 Slave1节点
172.30.0.3:6379 Slave2节点
172.30.0.4:6379

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 环境初始化

bash 复制代码
#!/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 主节点配置
bash 复制代码
# 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 从节点配置
bash 复制代码
# 从节点配置(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 哨兵配置
bash 复制代码
# 哨兵统一配置
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; do
  cp /opt/redis/sentinel.conf /opt/redis/sentinel$i/
done

3.3 容器启动

bash 复制代码
# 启动 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.conf

docker 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.conf

docker 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; do
  docker 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 集群状态验证

bash 复制代码
# 等待服务启动
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; do
  printf "sentinel$i: "
  docker exec sentinel$i redis-cli -p 26379 info sentinel | grep -E 'sentinel_masters|slaves|sentinels' | tr '\n' ' '
  echo
done

效果截图

四、功能测试验证

4.1 数据同步测试

bash 复制代码
# 在主节点写入数据
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 模拟主节点故障

bash 复制代码
# 模拟主节点宕机
docker kill redis-master

# 检查新的主节点,等待10秒左右
docker exec sentinel1 redis-cli -p 26379 sentinel get-master-addr-by-name mymaster

5.2 故障转移结果验证

bash 复制代码
# 查看容器状态
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 日常监控命令

bash 复制代码
# 查看所有容器状态
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 性能监控指标

40% 25% 25% 10% Redis 集群资源分配 Master节点 Slave1节点 Slave2节点 Sentinel集群

七、总结与展望

7.1 方案优势总结

特性 实现情况 说明
高可用性 已支持 主节点故障自动转移
数据冗余 已支持 多从节点数据备份
读写分离 已支持 从节点分担读压力
监控告警 已支持 哨兵实时监控
容器化 已支持 Docker 快速部署

7.2 生产环境建议

  1. 监控告警:集成 Prometheus + Grafana 监控
  2. 日志管理:使用 ELK 栈集中管理日志
  3. 备份策略:定期备份数据到远程存储
  4. 性能调优:根据业务特点调整参数

7.3 扩展方案

当前方案 Redis Cluster Redis Proxy 云托管服务 数据分片 水平扩展 Twitter Twemproxy Redis-cerberus AWS ElastiCache 阿里云Redis

八、参考资料

相关推荐
发发就是发1 分钟前
顺序锁(Seqlock)与RCU机制:当读写锁遇上性能瓶颈
java·linux·服务器·开发语言·jvm·驱动开发
我命由我123455 分钟前
Android Jetpack Compose - ModalNavigationDrawer、NavigationRail、PullToRefreshBox
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
四谎真好看5 分钟前
Redis学习笔记(高级篇3)
redis·笔记·学习·学习笔记
Byron__12 分钟前
HashSet/LinkedHashSet/TreeSet 原理解析
java
Jul1en_20 分钟前
【Redis】String 类型命令、编码方式与应用场景
数据库·redis·缓存
苏瞳儿30 分钟前
创建后端项目-连接MySql并运行成功
java
菜鸟小九43 分钟前
JUC(共享模型之管程、synchronized、wait、park、活跃性、renetrantlock、条件变量)
java·开发语言·juc
kongba00743 分钟前
学习COZE编程 / LangGraph 通用工作流项目 提示词模板
java·网络·学习
程序员阿明1 小时前
spring boot3识别PDF图纸
java·spring boot·后端·pdf