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

八、参考资料

相关推荐
j***518935 分钟前
Redis 安装及配置教程(Windows)【安装】
数据库·windows·redis
A***F1573 小时前
Redis开启远程访问
数据库·redis·缓存
tg-zm8899964 小时前
2025返利商城源码/挂机自动收益可二开多语言/自定义返利比例/三级分销理财商城
java·mysql·php·laravel·1024程序员节
X***C8624 小时前
SpringBoot:几种常用的接口日期格式化方法
java·spring boot·后端
前端达人4 小时前
你的App消息推送为什么石沉大海?看Service Worker源码我终于懂了
java·开发语言
小光学长4 小时前
基于ssm的宠物交易系统的设计与实现850mb48h(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·前端·数据库
编程大师哥4 小时前
vxe-table 透视表分组汇总及排序基础配置
java
j***29484 小时前
Redis 设置密码(配置文件、docker容器、命令行3种场景)
数据库·redis·docker
8***84824 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
9***J6284 小时前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端