当前位置: 首页 > news >正文

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地址职责说明
Master1172.30.0.2处理写请求,数据同步到从节点
Slave2172.30.0.3-4处理读请求,数据冗余备份
Sentinel3172.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 性能监控指标

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

八、参考资料

  • Redis 官方文档 - Sentinel
  • Docker 最佳实践教程
  • Redis 高可用架构设计
http://www.dtcms.com/a/592794.html

相关文章:

  • 成都在线制作网站作文网入口
  • 想更新公司网站怎么做利于优化的wordpress模板
  • APP开发技术选型:原生 vs 跨端 (Flutter/React Native) 对比与适配场景
  • 智能指针在仓颉技术中的深度实践:从原理到架构的全维解析
  • Flutter开发全攻略:从入门到精通
  • Flutter持续健康发展的多维度分析
  • Flutter架构解析:从引擎层到应用层
  • 六大 API 架构风格
  • LoRA: Low-Rank Adaptation of Large Language Models及其反思
  • 搜索网站做淘宝客怎么在电脑上建立自己的网站
  • 股票投资方法论
  • SSE通信技术详解:Node.js实现服务器端事件推送
  • 广州市建设工程定额管理网站重写路由 wordpress
  • 有什么做兼职的医疗网站做网站应选那个主题
  • Visual Basic创建工具栏
  • IDEA的Code Style配置(使用google的Java Code Stytle)
  • 一个网站空间如何放两个网站内容
  • Vue 绑定class样式
  • LeetCode 153.寻找旋转排序数组中的最小值
  • 无人船 | 图解基于MPC控制的路径跟踪算法(以全驱动无人艇WAMV为例)
  • 蓝牙标签APP与网页端操作常见问题指南
  • 深度测评解析 CANN:从 ACL 到自定义算子,解锁昇腾计算的全部潜能
  • ui作品集 网站怎么做手机app开发需要什么技术
  • 做门头上那个网站申报WordPress怎么两个标题
  • emu系列模拟器最新汉化版 安卓版 怀旧游戏模拟器全集附可运行游戏ROM
  • 前端状态管理,为什么要状态管理?(React状态管理、zustand)
  • 江西中创建设工程有限公司网站专业建设报告
  • 1024开发者节:开源发布,引领生态繁荣
  • 测试自动化Replay:让数据库迁移测试回归真实场景的一把“利器”
  • 从“死记硬背“到“主动思考“:用 Microsoft Agent Framework 重新定义 RAG