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

八、参考资料

相关推荐
liangbo72 分钟前
JVM规范第 4 章:class 文件格式
java·jvm
橘子汽水1683 分钟前
Leetcode 236,437:二叉树的最近公共祖先,路径总和III
java·数据结构
ylj_dev9 分钟前
从 0 构建 AI Workload Platform(八):受限执行环境与 Kubernetes
docker·容器·kubernetes·分布式系统·ai工作流·容器安全·ai infra
数据狐(Datafox)10 分钟前
1688商品详情API技术解析与落地应用(含标准 JSON 示例)
java·数据库·json
君顾118 分钟前
AI智能商城实战指南:从架构设计到部署落地的完整技术方案
java·开发语言·多商户
半个落月20 分钟前
Next.js 16 笔记应用实战:Redis 数据链路与组件两版拆分详解
前端·redis·next.js
Rain的Java大神之路20 分钟前
SkyWalking从0-1部署成功实战
java·后端·架构
就叫飞六吧21 分钟前
Spring 动态注册与移除 Bean 科普
java·后端·spring
IMPYLH25 分钟前
HTML 的 <legend> 元素
java·前端·html
运行时异常27 分钟前
WMS 仓储系统集成 AI Agent 实战】第 1 讲:从零搭建开发环境——pgvector 装不上、模型选错、依赖冲突,一天踩完三个大坑
java