资讯动态

Redis Sentinel哨兵模式:自动故障转移原理、部署与排障实战

发布时间:2026/10/26 3:59:33 来源:尧图企业网站定制
1. 哨兵到底在解决什么问题第一次接触哨兵Sentinel的兄弟多半是先会了主从复制然后被一个现实问题卡住主节点挂了从节点还在那儿傻等业务写请求全部报错得半夜爬起来手动把一台从库提成主库再改一堆客户端的连接地址。这事儿干一两次还行规模一上来根本扛不住。哨兵模式要解决的核心痛点就一句话——让主从架构具备自动故障转移的能力顺带把当前谁是主节点这个信息做成可查询的服务发现入口。我先把结论摆前面哨兵不是缓存不是代理也不是用来提升性能的。它是一组独立的进程盯着主从集群发现主节点不可用时通过一套投票机制选出一个从节点升级为主节点并通知所有客户端切换连接。它的定位是高可用组件不承担数据存储职责也不接管读写流量客户端直连 Redis不经过哨兵。这套机制适合谁我认为有三类人必须吃透一是业务里已经用主从、但断点恢复还靠人肉运维的团队二是正准备做中小规模高可用方案、在哨兵和集群模式之间犹豫的架构同学三是线上出过事故、被主库挂了半小时没人发现坑过的运维。如果你们的量级还没到分片的需求单主写入完全够用那哨兵基本是这个阶段性价比最高的选择比集群模式省心太多。先把几个容易混淆的概念捋清楚不然后面看配置会懵。哨兵模式下有两类角色数据节点主库、从库正常存数据和哨兵节点只做监控、判断、选举不存数据。哨兵节点本身也建议部署奇数个最少三个原因后面讲投票的时候会展开。另外还有一个概念叫主观下线和客观下线前者是单个哨兵认为某个节点挂了后者是足够多的哨兵都认为它挂了——这个区分是整个故障转移的触发开关必须先建立这个认知否则你看到日志里一堆sdown和odown会一头雾水。还有一点我得提前说清楚很多人对哨兵的误解是它能自动扩容或者它能自动修复数据。不能。它只做故障转移不修复数据不一致也不处理网络分区下的数据丢失。故障转移过程中如果主库有数据还没同步到从库那部分数据就是丢了哨兵不会帮你找回来。所以用哨兵之前业务侧必须接受极端情况下可能丢少量写入这个前提或者从业务层面做补偿。这个心理预期得先立住。2. 原理拆解一个哨兵从怀疑到动手的全过程2.1 定时任务才是哨兵的心跳哨兵本身没什么魔法它的全部工作都建立在一堆定时任务上。理解哨兵其实理解这几条定时任务就够了我自己排查问题时也基本是对着这几条线去看。第一条每 10 秒一次每个哨兵向主库和从库发送INFO命令拿到完整的拓扑信息谁是主、有哪些从、从库的复制偏移量是多少、主库的复制积压缓冲区状态等。注意这条任务是哨兵发现从库挂了和新从库上线的主要途径所以新加从库后哨兵最多 10 秒左右就能感知到。第二条每 2 秒一次每个哨兵向主库和从库的__sentinel__:hello这个发布订阅频道上发送自己的信息IP、端口、运行 ID、当前配置版本号同时订阅这个频道接收其他哨兵的消息。这就是哨兵之间互相发现、交换情报的机制。三个哨兵为什么能自动组成一伙靠的就是这条。这里有个细节值得注意哨兵互相发现是通过主库和从库的 hello 频道中转的不是直接互连所以如果主库挂了哨兵之间的信息同步会受影响但已有的互相认知还在。第三条每 1 秒一次每个哨兵向主库、从库以及其他哨兵发送PING。这条是判断存活的核心。如果PING在down-after-milliseconds配置的时间内没有收到有效回复注意是有效回复返回错误也算活着只有超时或者回复内容不对才算就把这个节点标记为主观下线。第四条每 10 秒一次哨兵向主库和从库发送INFO的补充任务——其实严格说这条和第一条是同一类但从节点视角看哨兵还会在发现新节点后立即补发一次INFO加速拓扑收敛。提示配置down-after-milliseconds的时候别拍脑袋。这个值必须大于业务正常抖动的时间比如你们的网络偶尔有 200ms 抖动、GC 偶尔停顿一下那设 500ms 就会疯狂误判也不能设太大设成 60 秒主库真挂了业务要白等一分钟。我一般建议从 3000030 秒起步根据实际网络质量微调。2.2 主观下线不等于客观下线单个哨兵把某节点标记为主观下线sdown只是它自己的判断此时不会触发任何动作。为什么因为一个哨兵可能自己网络有问题或者和某个节点之间的链路抖动它的一家之言不能作数。于是有了客观下线odown当某个哨兵发现主节点主观下线后它会向其他哨兵询问你觉得这主库挂了吗如果认为挂了的哨兵数量达到 quorum法定人数就把主节点标记为客观下线正式进入故障转移流程。这里有几个非常容易踩的认知坑我必须展开说quorum 只对主节点生效。从库挂了不需要投票单个哨兵判定主观下线就够了因为它不影响写入。这是很多人的误区以为所有节点下线都要凑票数。quorum 是认为挂了的票数不是总哨兵数。比如 5 个哨兵quorum 配 2那只要有 2 个哨兵认为主库挂了就能触发客观下线剩下 3 个哨兵即使还认为主库活着也不影响触发。触发故障转移还需要授权这一步经常被忽略。客观下线只是拿到了可以开始选举的入场券真正要执行故障转移还需要超过半数majority的哨兵同意。所以 5 个哨兵、quorum2 的配置下如果只有 2 个哨兵活着它们能判定客观下线但凑不够 3 票的 majority故障转移是做不成的。这个两层机制的设计意图很明确quorum 保证发现问题的灵敏度majority 保证执行动作的谨慎度防止网络分区时小分区的哨兵擅自把主库切了造成脑裂。我个人在实际部署里的经验是哨兵节点数取奇数quorum 取(N/2)1向下取整的那个值比如 3 个哨兵 quorum 配 25 个哨兵 quorum 配 3这样灵敏度和安全性比较平衡。如果 quorum 配得太低比如 5 个配 1一个哨兵抽风就可能引发误切换风险很高。2.3 Leader 选举与从库挑选客观下线确认后哨兵之间要先选出一个 Leader 哨兵来执行这次故障转移避免多个哨兵同时动手造成混乱。选举用的是 Raft 算法的简化版每个哨兵都有一次投票机会可以投给自己或别人拿到超过半数票的成为 Leader。如果一轮没选出等待一段时间重来直到选出为止。Leader 选出来之后才是真正的重头戏——从一堆从库中挑一个升主。挑选有一套明确的优先级顺序很多人只知道选偏移量最大的其实前面还有两层筛选优先级筛选条件说明1排除主观下线、断线、被标记为s_down或o_down的从库自身都不健康的没资格2排除最近 5 秒内没有回复过主库INFO的从库信息太旧状态不可信3排除与主库断连超过down-after-milliseconds * 10的从库掉队太久数据差太多4按replica-priority配置选数值越小优先级越高默认 100配 0 表示永不升主5优先级相同选复制偏移量最大的数据最新6偏移量也相同选运行 ID 最小的纯粹为了确定性这个顺序非常关键。我见过有人把某个性能弱的从库replica-priority配成 10想让它备而不用结果主库一挂它就被选中了升主后性能直接拖垮整个集群。所以replica-priority的用法要想清楚它是升主倾向不是性能权重。如果你有专门的只读从库不想被升主就把它配成 0如果你希望某台配置高的机器优先接管那才把它的值调小。还有一个实操细节从库升主之后Leader 哨兵会向其余从库发送SLAVEOF命令新版本叫REPLICAOF让它们认新主。这个切换是串行的一个从库一个从库地改而且默认是并行度受控的。如果从库特别多比如 20 台故障转移的完成时间会被拉长这段时间内集群处于部分从库还指着旧主的中间状态读请求可能读到脏数据。这个问题在从库数量多的时候必须评估。2.4 客户端是怎么知道主库变了的这是哨兵模式设计上很巧妙的一点客户端不是被动等待而是主动订阅。客户端连上哨兵后订阅switch-master这类事件频道一旦哨兵完成切换会向频道推送新主库地址客户端收到后重建连接池。整个过程中客户端不需要重启也不需要改配置。但这里有个非常现实的坑不是所有客户端都实现了哨兵订阅逻辑。有些老版本客户端只支持启动时向哨兵查询一次主库地址不会持续订阅。这种客户端在故障转移后就会一直指着旧主直到重启。选客户端的时候务必确认它支持哨兵模式的动态切换Java 生态里主流的连接池基本都支持但版本要看清。另外一个常被忽略的点哨兵在故障转移后会更新自己的配置并通过 hello 频道把新配置广播给其他哨兵实现配置收敛。但如果此时有哨兵处于下线状态它重新上线后拿到的是旧配置需要靠后续的 hello 交换来纠正。这个纠正过程需要时间所以恢复一个宕机很久的哨兵后别急着做故障演练等它拓扑同步完再说。3. 部署实操三节点哨兵的完整落地过程3.1 环境规划与目录结构我这里按最常见的小规模生产场景来设计1 主 2 从 3 哨兵全部部署在 3 台机器上主库和从库分散哨兵也分散避免单机故障一锅端。如果你机器紧张哨兵和 Redis 混部也能跑但要清楚混部会带来资源竞争和故障域重叠的风险生产环境我不推荐。角色IP 规划端口说明主库10.0.0.116379初始主节点从库 110.0.0.126379复制主库从库 210.0.0.136379复制主库哨兵 110.0.0.1126379与主库混部哨兵 210.0.0.1226379与从库混部哨兵 310.0.0.1326379与从库混部注意哨兵默认端口 26379三台机器各自跑一个凑成奇数。千万不要图省事只在两台机器上跑哨兵2 个哨兵在投票时很容易卡死在永远凑不齐多数的状态反而比单哨兵更不可用。目录规划我习惯这样分配置、数据、日志、持久化文件分开后期排查和备份都方便# 数据节点 /data/redis/6379/{conf,data,logs,run} # 哨兵节点 /data/redis/26379/{conf,logs,run}创建目录并授权这块没什么技术含量但别省权限不对 Redis 起不来日志里报的错还很隐晦mkdir -p /data/redis/6379/{conf,data,logs,run} mkdir -p /data/redis/26379/{conf,logs,run} chown -R redis:redis /data/redis3.2 主从配置先把复制跑通哨兵是建立在主从之上的主从没跑通就上哨兵等于地基没打就盖楼。主库配置我列关键项其余用默认# /data/redis/6379/conf/redis.conf bind 0.0.0.0 port 6379 daemonize yes pidfile /data/redis/6379/run/redis.pid logfile /data/redis/6379/logs/redis.log dir /data/redis/6379/data # 持久化按业务选RDB AOF 都开更稳 appendonly yes appendfilename appendonly.aof # 关键设置密码主从和哨兵都要用 requirepass YourStrongPass123 masterauth YourStrongPass123 # 主库不需要配 replicaof从库配置在主库基础上加一行replicaof 10.0.0.11 6379这里有个坑我必须强调requirepass和masterauth都要配而且值要一致。只配requirepass的话从库连主库时拿不到认证复制建立不起来日志里会刷NOAUTH Authentication required只配masterauth的话客户端连不上节点。另外从 6.0 起Redis 支持 ACL但哨兵模式下为了兼容性我建议还是走传统的requirepass路线别在这上面玩花活。启动三台数据节点然后验证复制状态。在主库执行redis-cli -h 10.0.0.11 -p 6379 -a YourStrongPass123 info replication看到role:master和connected_slaves:2两个从库的stateonline、offset接近就说明复制正常。如果state是sync或connecting等一会儿再看超过半分钟还这样就得查网络和密码了。提示验证复制时一定要看offset复制偏移量两个从库的 offset 应该和主库的master_repl_offset非常接近。如果某个从库 offset 明显落后且不增长说明它一直在重连或全量同步这种从库在故障转移时会被排除掉属于看着活着其实没用的状态得提前修好。3.3 哨兵配置逐项拆解哨兵的配置文件叫sentinel.conf比 Redis 主配置简单得多但每一项都有讲究。我按一份实际配置来说明# /data/redis/26379/conf/sentinel.conf port 26379 daemonize yes pidfile /data/redis/26379/run/sentinel.pid logfile /data/redis/26379/logs/sentinel.log dir /data/redis/26379 # 核心配置监控的主库名、地址、quorum sentinel monitor mymaster 10.0.0.11 6379 2 # 认证信息主从有密码就必须配 sentinel auth-pass mymaster YourStrongPass123 # 主观下线判定时间30秒 sentinel down-after-milliseconds mymaster 30000 # 故障转移时同时向多少个从库发起同步 sentinel parallel-syncs mymaster 1 # 故障转移超时时间 sentinel failover-timeout mymaster 180000 # 通知脚本可选用于发告警 # sentinel notification-script mymaster /path/to/notify.sh逐项说下我的理解这些参数配错是故障转移失败的高发区sentinel monitor mymaster ... 2mymaster是集群的别名客户端就是靠这个名字找集群的改名字意味着客户端配置也要改所以上线前定好别乱动。最后的2就是 quorum。注意这行的 IP 端口是初始主库地址哨兵跑起来之后会自己维护故障转移后这个配置会被自动改写你可以去看 sentinel.conf切换后那行地址会变所以别手动去改它。sentinel auth-pass主从有密码时必须配否则哨兵连不上节点INFO都拿不到直接判定全部主观下线把自己搞成全员阵亡的假象。这个是最常见的部署失败原因我至少见过七八次是漏了这行。down-after-milliseconds前面讲过30 秒起步。这个值要结合业务的连接超时和重试策略来定如果客户端超时本身就设了 60 秒那哨兵设 30 秒切换客户端还在重试旧主呢会有一小段混乱期。parallel-syncs故障转移后新主需要向从库同步这个参数控制同时向几个从库发起同步。设成 1 表示一次同步一个其他从库排队。设太大有什么问题新主刚升上来要 fork 出多个子进程做全量同步CPU 和 IO 会被打满可能把新主自己拖死。所以从库多的时候这个值宁可小一点慢一点但稳。我一般设 1 或 2从库超过 5 台就设 1。failover-timeout故障转移的总超时超过这个时间认为本次转移失败重新走流程。默认 180 秒一般够用。但如果从库特别多、或者数据量大全量同步慢可能要调大。这个参数同时也影响从库被标记为恢复的时间和重新选主的等待时间属于一个综合参数不建议乱动除非你有明确的慢同步证据。三个哨兵节点上这份配置基本一致唯一要确认的是各节点的dir和日志路径不冲突。配置好之后启动redis-sentinel /data/redis/26379/conf/sentinel.conf启动后看日志正常情况下会看到类似 Sentinel ID is xxx、monitor master mymaster 10.0.0.11 6379, quorum 2、3 slaves 之类的输出。三个节点都起来后随便连一个哨兵执行redis-cli -h 10.0.0.11 -p 26379 sentinel master mymaster sentinel slaves mymaster sentinel sentinels mymastersentinel sentinels mymaster这条特别重要它列出当前哨兵能看到的其他哨兵。三个哨兵互相发现后这里应该能看到另外两个。如果只看到一两个说明 hello 频道还没同步完或者网络/密码有问题得等或者查。提示哨兵之间互相发现依赖主库的__sentinel__:hello频道。如果三个哨兵监控的mymaster别名不一致它们永远不会互相发现。所以别名必须全集群统一这个低级错误我也见过改一个字母排查半天。3.4 用命令验证故障转移别信理论上配置跑起来不代表能在故障时接管必须做切换演练而且要做得像真的——不是简单kill -9主库进程那个太理想化了。我一般分两步验证先验证客观下线判定再验证完整切换。第一步人为让主库停止响应一段时间观察哨兵日志里是否出现sdown主观下线和odown客观下线。可以临时用redis-cli -p 6379 debug sleep 60让主库阻塞这种活着但不应答的场景更接近真实故障比直接杀进程更能验证超时判定逻辑。日志里看到odown master mymaster ... #quorum 2/2就说明判定生效了。第二步直接停掉主库进程验证完整切换# 在均衡器上停主库 redis-cli -h 10.0.0.11 -p 6379 -a YourStrongPass123 shutdown然后盯着任意一个哨兵的日志观察完整流程大致是这些事件sdown→odown→try-failover→elected-leader→selected-slave→promoted-slave→slave-reconf-sent→slave-reconf-done→switch-master→failover-end。这个过程正常在 10 到 40 秒之间完成取决于超时配置和节点数量。切换完成后验证三件事一是哨兵日志里有switch-master mymaster 10.0.0.11 6379 10.0.0.12 6379说明新主换成了 12 那台二是新主上info replication显示role:master三是原来的 13 那台从库info replication里的master_host已经变成 12。三件事都对上才算切换成功。验证完把旧主拉回来。这里有个关键动作旧主重新上线后哨兵会自动把它降级为从库发送SLAVEOF日志里能看到convert-to-slave。这个自动降级非常重要否则旧主回来还带着旧配置一旦客户端还连它就出现双主写入数据就乱了。所以恢复旧主后务必检查它的role是不是已经从master变成slave。注意演练前一定确认业务处于低峰且客户端支持自动切换。我见过有人在线上高峰做演练结果客户端不支持动态切换切换后写了十几分钟旧主等发现时新主和旧主数据已经分叉只能手工对账代价很大。4. 常见故障与排查实录4.1 故障转移不触发先查这三处哨兵最常见的失灵表现是主库明明挂了哨兵日志里只有sdown或者odown但一直没有try-failover。这种时候别慌按顺序查三项基本能定位。第一查 quorum 和存活哨兵数。如果客观下线都没触发说明认为主库挂了的哨兵数不够 quorum。可能是某个哨兵自己挂了也可能是某个哨兵和主库之间的网络不通它能看到主库活着因为网络抖动让它误以为主库健在也可能是某个哨兵的down-after-milliseconds配置和其他节点不一致导致冷热不均。用sentinel master mymaster看num-other-sentinels和quorum用sentinel sentinels mymaster看有几个哨兵在列表里对不上就是这里的问题。第二查是否凑得齐 majority。触发了客观下线但没有try-failover多半是存活哨兵不够半数。3 个哨兵死 1 个剩 2 个是半数的边界情况能不能切换要具体看死 2 个剩 1 个肯定切不了因为 1 票凑不齐 2 的多数。这就是为什么我说哨兵至少三个且最好分散在不同机器上。第三查 Auth 和网络。哨兵连不上节点什么判断都做不了。日志里如果出现NOAUTH、Connection refused、Timeout直接对应处理。特别提醒改密码的时候主库、从库、所有哨兵的 auth-pass 必须同时改、同时重启漏一个就是这种故障。我经历过一次只改了一半节点的密码结果哨兵先判定主库挂了随后又发现能连上来回震荡日志刷得飞起。下面这张表是我整理的速查出现症状先对照症状可能原因排查命令/动作只有sdown无odownquorum 未达成sentinel master mymaster看 quorum 与 num-other-sentinels有odown无try-failover存活哨兵不足半数sentinel sentinels mymaster查列表数量日志刷NOAUTHauth-pass 缺失或密码不一致检查 sentinel.conf 的 auth-pass哨兵连不上节点防火墙、bind 配置、端口不通telnet测试端口查bind配置哨兵间互不可见别名不一致或 hello 频道被挡确认sentinel monitor别名统一切换后客户端仍连旧主客户端不支持订阅或未重建连接查客户端版本与连接池配置4.2 切换后的典型问题客户端连接池与只读故障转移成功不代表业务真的无恙客户端这一层往往是最后的暗礁。连接池没有刷新是最常见的。有些连接池在检测到连接断开会重建但如果它重建时还去连旧地址那就白搭。排查方法很直接切换后在一台业务机上netstat看它连的是哪个 IP如果还指着旧主就是客户端逻辑问题。解决思路有两个一是升级到支持哨兵订阅的客户端版本二是把连接池配置成从哨兵获取地址而不是硬编码 IP。千万别硬编码主库 IP这就等于白上了哨兵。只读从库的读流量没有重定向。哨兵切换后原主库降级为从库如果业务有读请求分发到从库需要客户端能识别新的拓扑。这里就要介绍sentinel replicas mymaster或者客户端侧的从哨兵获取从库列表能力。如果客户端只认主库那切换后新从库的读能力就浪费了全压在新主上性能可能掉一截。旧主恢复后的双写风险。前面提过自动降级但要注意时序旧主启动的瞬间到哨兵发出降级命令之间它还是master身份如果此时客户端恰好连上它写入就会产生新旧主数据分叉。稳妥的做法是在旧主恢复前先确认哨兵已经把它降级或者干脆在恢复时直接从哨兵查到当前主库地址用它作为replicaof的目标手动启动避免这段窗口。4.3 那些配置里不会写的坑做这种高可用方案最大的价值往往不在文档里在踩过的坑里。我挑几个印象深的分享。第一个坑时间不同步导致误判。哨兵的超时判断依赖本地时钟如果三台机器时间差超过秒级那么同时这个概念就崩了可能出现 A 哨兵认为超时了、B 哨兵还没到点投票永远对不齐。部署前务必把时间同步做起来这是隐性的基础工作不做的话所有超时类逻辑都不可靠。第二个坑protected-mode和 bind 配置。新版 Redis 默认开protected-mode如果bind只绑了 127.0.0.1从库和哨兵都连不上。配置里bind 0.0.0.0或者绑定内网地址别绑回环。这个错误在装新版本时特别高发因为很多人拿默认配置直接跑。第三个坑maxmemory和淘汰策略。主从复制场景下如果主库配了maxmemory和淘汰策略淘汰动作会作为写命令同步到从库这个没问题但如果从库的maxmemory配得比主库小从库可能自己把数据淘汰掉造成主从不一致。主从的maxmemory和maxmemory-policy应当保持一致这条在很多资料里都没强调。第四个坑AOF 和 RDB 的加载差异。从库重启后如果同时有 AOF 和 RDB优先加载 AOF。如果 AOF 因为异常损坏不完整从库可能起来就带着残缺数据然后又全量同步覆盖造成短暂的数据回退。所以日常要检查 AOF 的完整性别等到恢复时才发现载不进去。我自己的做法是定时用redis-check-aof跑一遍确认没问题。第五个坑哨兵自身的单点。有人只部署一个哨兵觉得配了就行结果这个哨兵一挂整个自动切换能力就没了等于退化回人工运维。哨兵不是越少越省事奇数个是底线而且每个哨兵都要纳入监控谁挂了立刻知道。第六个坑客户端重试与切换窗口。切换的十几秒到几十秒里业务一定有报错窗口。如果客户端没有重试机制这段时间的请求就是直接失败。解决办法是客户端配置合理的重试次数和重试间隔配合超时时间覆盖掉切换窗口。别指望能零报错高可用的本质是缩短不可用时间不是消灭不可用。5. 部署前的取舍与我的实践心得5.1 哨兵还是集群模式怎么选这个问题被问得最多我给一个纯粹从实操出发的判断表而不是抄概念维度哨兵模式集群模式数据量单机内存能装下单机内存装不下需要分片写入并发单主写入几十万 QPS 内通常够多主写入能横向扩展部署复杂度低主从加哨兵配置文件少高槽位、节点发现、扩缩容都复杂故障转移秒级到分钟级依赖超时配置内置故障转移速度通常更快运维心智负担小问题集中在主从和哨兵大节点扩缩容、槽迁移要小心客户端要求需要支持哨兵订阅需要支持集群协议我的建议很直接如果你的数据量能装进单机内存、写入量单主扛得住优先选哨兵别一上来就集群把自己搞得太累。集群的价值在分片和横向扩展代价是运维复杂度陡增。等业务真的到了单机内存扛不住、或写入出现瓶颈再迁集群也不迟架构演进是渐进的不用一步到位。5.2 参数调优的几条个人经验超时时间宁稳勿激。我见过把down-after-milliseconds设成 3000 的理由是想快速切换结果网络一抖就误切一个月搞出两次故障转移数据丢了几千条。宁可多等 10 秒确认也别频繁误切。切换一次的代价比多等一会儿大得多。从库的replica-priority要有设计。如果三台从库配置不一样就按性能调优先级让配置高的优先升主如果从库都差不多就保持默认依赖偏移量选最新。别给某台配 0 然后又期望它升主矛盾配置会让人抓狂。parallel-syncs切忌拉满。从库多的时候这个值拉大会让新主在故障转移瞬间负载飙升反而拖长恢复时间。慢就是快这个场景下很适用。监控要盯哨兵日志的关键事件。switch-master、failover-start、-failover-abort这些事件都该纳入告警。特别是switch-master每次出现都意味着发生了一次真实的主备切换背后一定有原因值得看一眼。日志要保留足够长时间切换前后几分钟的上下文是排查的关键。5.3 后续还能怎么扩展跑通三节点哨兵之后一般有几个演进方向。一是哨兵节点增加到五个覆盖更大的故障域提高投票的可靠性代价是配置和监控成本上升。二是读写分离把从库开放给只读业务同时注意客户端要用哨兵查从库列表不要硬编码。三是接入配置中心或域名让主库地址通过一个稳定的入口暴露减少客户端对 IP 的硬依赖给未来的迁移留后路。还有一个容易被忽略的扩展点把故障转移和业务侧的补偿机制结合起来。因为哨兵切换必然存在数据丢失窗口业务层如果对关键操作有幂等、对账或事务日志就能把影响降到最低。技术层面做到自动切换只是第一步业务层面接得住才是真的高可用。我个人在实际操作中的体会是哨兵这套东西配置不难难的是相信它在真故障时能接住。所以别只做一次演练建议在业务低峰期定期做切换演练把流程跑成肌肉记忆把各类日志事件看熟。真正出事的时候比的不是谁配置写得好是谁能在日志里三分钟内定位到卡在 majority 还是卡在从库筛选。把演练当成常态比研究再多原理都管用。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑