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

八、参考资料

相关推荐
码界奇点11 分钟前
基于Spring Boot的内容管理系统框架设计与实现
java·spring boot·后端·车载系统·毕业设计·源代码管理
HPYON20 分钟前
【docker】CentOS安装docker失败,一直提示yum没有docker仓库
docker·容器·centos
墨雪不会编程36 分钟前
C++【string篇1遍历方式】:从零开始到熟悉使用string类
java·开发语言·c++
蒂法就是我1 小时前
有一张表,只有一个字段没有插入主建,能插入成功吗? 隐藏的 rowid除了在这里用到还在哪里用到了?
java
a努力。1 小时前
字节Java面试被问:系统限流的实现方式
java·开发语言·后端·面试·职场和发展·golang
独自破碎E1 小时前
Java中的Exception和Error有什么区别?
java·开发语言
小徐Chao努力1 小时前
【Langchain4j-Java AI开发】08-向量嵌入与向量数据库
java·数据库·人工智能
傻啦嘿哟1 小时前
Docker部署Scrapy集群:爬虫容器化实战指南
爬虫·scrapy·docker
qq_377112371 小时前
从零开始深入理解并发、线程与等待通知机制
java·开发语言
小徐Chao努力1 小时前
【Langchain4j-Java AI开发】07-RAG 检索增强生成
java·人工智能·python