Redis 系列(十):高可用(一)——主从复制与哨兵
核心目标理解主从复制的原理全量/增量同步、replicationid 与 offset与数据一致性边界理解哨兵如何实现监控、客观下线与自动故障转移部署一主一从一哨兵环境并完整演练一次主库宕机与旧主归队。前置知识完成 Part 5RDB——全量同步的载体与 Part 9主从切换丢锁的机制基础。验证环境Redis 8.10.0cygwin 移植版主库 6380、从库 6381、哨兵 26379 均为隔离实例故障注入在隔离环境进行。最后复核日期2026-08-07。0. 本篇问题场景单机 Redis 的三个单点机器宕机唯一的主库挂了服务全部不可用恢复靠重启持久化数据丢了主库磁盘损坏RDB/AOF 跟着没——持久化救不了机器没了读瓶颈QPS 高到单机 CPU 饱和加内存加机器都没用单线程。主从复制解决读扩展 数据冗余哨兵解决主库挂了自动切换。本篇先把复制讲透再演练一次完整的故障转移。1. 主从复制一主多从1.1 配置与角色# 从库配置一行即可redis-server--port6381--replicaof127.0.0.16380# 或运行时REPLICAOF127.0.0.16380部署后的角色实测INFO replication# 主库 6380 role:master connected_slaves:1 master_repl_offset:422 # 从库 6381 role:slave master_host:127.0.0.1 master_port:6380 master_link_status:up slave_repl_offset:422 ← 与主库 offset 一致 无延迟复制生效验证写主读从$ redis-cli -p 6380 SET product:1 机械键盘 OK $ redis-cli -p 6381 GET product:1 机械键盘1.2 同步机制全量 增量从库主库从库主库之后进入增量同步M 实时推送新命令PSYNC ? -1首次无历史BGSAVE 生成 RDB传输 RDB全量同步期间新写命令进 repl_backlog加载 RDB补发 backlog 中的增量命令两个关键概念概念作用replicationid主库的身份标识从库复制后继承repl_backlog主库的环形缓冲区存最近 N 字节写命令——断线重连时靠它做增量同步从库断线后重连如果断线期间产生的增量仍在 backlog 内 →部分同步只补发缺口如果断开太久、backlog 已覆盖不到 → 退化为全量同步重新传 RDB。全量同步的代价随数据量增长生产要监控repl_backlog_size是否够大。1.3 复制的一致性边界重要异步复制主库写命令先执行后传播从库有一定延迟——master_repl_offset与slave_repl_offset的差值就是延迟Part 12 会监控它从库可读但可能旧从库默认replica-read-only yes读从库拿到的是主库某时刻之前的数据过期键删除动作只由主库发起Part 6从库收到DEL才删——读从库可能在 TTL 之后短暂读到已过期键replica-serve-stale-data默认放行主库未开持久化 高危主库宕机重启后数据为空从库会同步到空生产必须主库开持久化或保证从库优先。2. 哨兵 Sentinel自动故障转移2.1 哨兵做什么哨兵是独立的 Redis 进程--sentinel对主库做四件事监控每 1 秒向主库/从库发 PING通知状态变化通知管理员/客户端自动故障转移主库不可用时选一个从库提升为新主配置中心客户端问哨兵当前主库是谁。2.2 下线判定与故障转移流程主观下线sdown单个哨兵 PING 超时down-after-milliseconds 客观下线odown达到 quorum 个哨兵都认为 sdown 选举 leader哨兵集群投票选一个执行故障转移的 leader 故障转移 1. 选一个从库优先级高、复制进度新 2. 对从库 REPLICAOF NO ONE 提升为主 3. 通知其他从库转向新主 4. 旧主恢复后自动降级为从库2.3 实测完整故障转移演练部署主 6380 从 6381 哨兵 26379quorum 1、down-after-milliseconds 3000。第一步——强杀主库$ taskkill /F /PID 19420 成功: 已终止 PID 为 19420 的进程。第二步——等待哨兵检测与切换约 8 秒$ redis-cli -p 26379 sentinel get-master-addr-by-name mymaster 127.0.0.1 6381 ← 哨兵已把新主指向 6381 $ redis-cli -p 6381 info replication role:master ← 原从库被提升为新主 connected_slaves:0第三步——新主可写$ redis-cli -p 6381 SET order:1001 paid OK第四步——旧主恢复归队$ redis-cli -p 6380 REPLICAOF 127.0.0.1 6381 OK $ redis-cli -p 6381 info replication role:master connected_slaves:1 ← 旧主已作为从库归队切换期间的代价从主库宕机到新主可写客户端有约检测时间 选举 提升的不可写窗口本实验约 5-8 秒期间写请求会失败应用需重试/排队。数据丢失窗口 主库宕机时刻尚未复制到从库的写入异步复制的天然延迟Part 5 的丢失窗口在复制场景同样存在。3. 脑裂故障转移的阴暗面网络分区下可能发生主库与哨兵/从库失联但主库自身还活着分区而非宕机。客户端写旧主分区中旧主仍接受写 哨兵判定旧主 o_down → 提升从库为新主 分区恢复 → 旧主归队成为从库 → 分区期间写入旧主的数据因从未复制给任何人而丢失防护配置redis.confmin-replicas-to-write 1 # 主库写请求至少要有 1 个从库在线 min-replicas-max-lag 10 # 从库延迟超过 10 秒视为不在线效果分区期间从库全部失联 → 旧主拒绝写入→ 数据不丢代价是写入短暂失败。这是保数据还是保可用的权衡min-replicas 倾向保数据。4. 客户端接入哨兵应用不直连主库而是问哨兵拿当前主库redis-pyfromredis.sentinelimportSentinel sentinelSentinel([(127.0.0.1,26379)],socket_timeout0.5)mastersentinel.master_for(mymaster,db0,decode_responsesTrue)slavesentinel.slave_for(mymaster,db0,decode_responsesTrue)master.set(k,v)# 读写走主slave.get(k)# 只读走从故障转移后客户端重新向哨兵询问即可拿到新主——应用代码无需感知切换。5. 版本与环境差异差异点说明REPLICAOF5.0 起替代SLAVEOF旧客户端注意复制协议7.x/8.x 均为 PSYNC2支持断线增量同步哨兵sentinel monitor配置在 7.x/8.x 一致quorum建议 ≥ 2生产至少 3 个哨兵cygwin 移植版fork/BGSAVE 行为与 Linux 有细微差异实验环境注明即可6. 测试与验收复制测试写主读从、master_link_status:up、offset 对齐故障转移测试隔离环境强杀主库 → 哨兵提升 → 新主可写 → 旧主归队脑裂防护测试断从库网络/停从库 → 验证min-replicas生效拒绝写。本篇验收清单能画出全量/增量同步的时序并说出repl_backlog的作用能解释replicationid/offset 与部分同步 vs 全量同步的判定能说出复制场景的三个一致性边界异步延迟、从库旧数据、过期键能区分 sdown/odown 与故障转移四步选主、提升、改向、归队能解释脑裂的丢数据场景与min-replicas-*防护的取舍部署过一主一从一哨兵并完成一次故障转移演练。7. 常见误区“从库会自动故障转移”——不会复制只提供冗余自动切换是哨兵的职责。“主库挂了数据一条不丢”——异步复制下未同步到从库的写入会丢丢失窗口 复制延迟§1.3。“主库没开持久化没关系有从库”——主库重启后变空从库会同步成空双输§1.3。“哨兵越多越好”——quorum 与哨兵数量要平衡单哨兵quorum 1能跑但无脑裂裁决能力生产 ≥ 3 哨兵。“脑裂只会丢数据写不进是 bug”——min-replicas的拒绝写正是防止丢数据的主动选择§3。8. 本篇小结复制解决数据有备份、读可扩展代价是异步延迟与一致性边界哨兵解决主库挂了怎么办代价是切换窗口与脑裂风险脑裂防护是保数据 vs 保可用的显式选择。但哨兵仍有上限单主库的写能力、单机内存的容量。数据量或写入吞吐超出单机时需要横向分片——下一篇 Part 11Redis Cluster 讲 16384 个哈希槽、MOVED/ASK 重定向与集群的扩容。9. 官方资料Replication 文档https://redis.io/docs/latest/operate/oss_and_stack/management/replication/Sentinel 文档https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel/PSYNC2 复制协议https://redis.io/docs/latest/operate/oss_and_stack/management/replication/

相关新闻

Redis 系列(九):分布式锁与限流——用 Redis 做并发治理

Redis 系列(九):分布式锁与限流——用 Redis 做并发治理

核心目标:掌握分布式锁的正确实现(SET NX EX 持有者标识 Lua 原子释放);理解锁过期、主从切换的失效边界与 Redlock 争议;掌握固定窗口、滑动窗口、令牌桶三种限流算法及其 Redis 实现。 前置知识:完成 P…

2026/10/10 15:25:27 阅读更多 →
Spring Statemachine实现订单状态管理的最佳实践

Spring Statemachine实现订单状态管理的最佳实践

1. 为什么需要状态机? 在开发复杂业务系统时,我们经常遇到需要管理对象状态流转的场景。比如订单从"待支付"到"已支付"再到"已发货",或者工单从"新建"到"处理中"再到"已解决"。…

2026/10/14 5:24:00 阅读更多 →
AI应用Token成本管控实战:从架构优化到监控治理的三层防御体系

AI应用Token成本管控实战:从架构优化到监控治理的三层防御体系

1. 项目概述:当AI的“账本”翻到Token成本这一页 最近和不少企业的技术负责人、产品经理聊天,发现一个挺有意思的现象。大家谈起AI,尤其是大语言模型(LLM),已经从最初的“哇,好厉害”的惊叹&…

2026/10/10 23:11:50 阅读更多 →

最新新闻

2026企业文档协作解决方案与实施指南

2026企业文档协作解决方案与实施指南

1. 企业文档协作的痛点与需求解析在2026年的数字化办公环境中,跨部门文档协作已成为企业运营的基础需求。根据我们团队对327家中大型企业的调研,89%的组织存在"信息孤岛"现象——市场部的方案需要重新排版才能给技术团队参考,财务数…

2026/10/14 5:23:12 阅读更多 →
各类特色评选活动,工具配置思路参考

各类特色评选活动,工具配置思路参考

线上评选活动类型繁多,党建评优、摄影书画大赛、校园才艺赛、社区之星、企业员工评选、短视频作品征集…… 不同活动的侧重点完全不一样:有的看重公平防刷、数据可溯源;有的需要高颜值页面展示作品;有的只追求快速上线、轻量化运营…

2026/10/14 5:23:12 阅读更多 →
AI判定机制倾向性:识别系统性偏差的实战指南

AI判定机制倾向性:识别系统性偏差的实战指南

1. 这不是“AI判案”,而是判定机制里悄悄偏移的刻度最近在几个行业内部交流群里,频繁看到“AI赋能的判定机制的倾向性”这个说法被反复提起——不是作为技术文档里的术语,而是像一句带着温度的提醒,出现在风控策略复盘、内容审核日…

2026/10/14 5:23:12 阅读更多 →
TypeScript驱动的RPG游戏架构:引擎+数据+编辑器三层解耦

TypeScript驱动的RPG游戏架构:引擎+数据+编辑器三层解耦

1. 项目概述:这不是怀旧复刻,而是一次面向现代 Web 的游戏架构重构“用 TypeScript 从零重写《仙剑奇侠传》:能通关的浏览器版,和一个给它做内容的可视化编辑器”——这个标题乍看像情怀营销,实则藏着三层硬核意图&…

2026/10/14 5:23:12 阅读更多 →
多线程到底创建多少个线程合适?后端线程数调优实测指南

多线程到底创建多少个线程合适?后端线程数调优实测指南

做后端这几年,几乎每次面试都会遇到同一个问题:多线程到底创建多少个线程才合适?刚入行的时候我背过标准答案,"CPU密集就N1,IO密集就2N",后来真到线上调优才发现,这套说法只能应付面试…

2026/10/14 5:23:12 阅读更多 →
摄像头如何看懂工地:视频智能检测技术落地与调参实战

摄像头如何看懂工地:视频智能检测技术落地与调参实战

当摄像头学会“看懂”工地:聊聊视频智能检测这门技术先说个直观感受。五年前如果有人说摄像头能自动发现工人没戴安全帽、能拦住翻围墙的人、能闻见工地上的烟火味,我多半会礼貌点头然后心想“这是产品宣传片吧”。但这两年我自己陆续接触过几个工地智能…

2026/10/14 5:22:04 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →