架构设计 · 数据库与存储

待环境验证

Redis Sentinel 的仲裁与客户端接入

理解 Redis Sentinel 的主观下线、客观下线、quorum 与多数授权,检查故障域分布、客户端发现及异步复制边界。

Redis高可用
阅读导引 · 理解后再操作

这篇知识解决什么问题

阅读 Sentinel 架构时,要分别说明谁判断主节点故障、谁有资格发起切换、客户端如何找到新主,以及写入结果如何由业务核验。把故障域和真实网络路径纳入设计,避免把协调服务的多数授权误认为数据提交多数或完整防双写保证。

判故障、准许切换与保住数据分开论证

先按实际成员和连通关系计算下线判断及切换授权,再检查候选数据历史和应用写入边界。协调面还能形成多数,不能证明每笔确认写入已经复制到候选。设计评审应分别记录三类目标及证据来源;一个环节通过不能替代另一个环节的业务验收。

客户端也是高可用拓扑中的参与方

应用先获得主地址,随后直接连接数据节点,因此需要分别理解发现认证、数据认证和候选地址可达性。长连接、后台任务与不同客户端库可能保留不同状态,应登记发现配置及重连行为。对超时请求还需业务去重或结果核对,不能用自动重连代替安全重试。

进入文章正文
关联架构图解8 个组件 · 点击展开

参考图适用于非分片 Redis 主从与 Sentinel,重点查看客户端发现边、直接读写边和异步复制边。实例组是逻辑聚合,不表示共置部署;图未展开所有成员互连、客户端库实现和独立数据备份路径。

查看场景架构与实施步骤
参考架构 · 非实时拓扑

客户端发现、复制与 Sentinel 协调架构

客户端向 Sentinel 查询当前主节点后直接访问 Redis,数据通过主副本复制传递;下线判定、故障转移授权和旧主写入约束需要分别验证。

  • 数据 / 请求
  • 控制 / 管理
  • 观测 / 查询

点击组件,在图下方查看职责;连线编号对应流向解读。小屏可横向滚动,或直接展开文字说明。

客户端发现、复制与 Sentinel 协调架构:组件关系图客户端向 Sentinel 查询当前主节点后直接访问 Redis,数据通过主副本复制传递;下线判定、故障转移授权和旧主写入约束需要分别验证。 Sentinel 客户端 → Sentinel 实例组:查询当前主地址;Sentinel 客户端 → Redis 当前主节点:直接读写;Redis 当前主节点 → Redis 副本 A:异步复制;Redis 当前主节点 → Redis 副本 B:异步复制;Sentinel 实例组 → Redis 当前主节点:监测角色与可达性;Sentinel 实例组 → Redis 副本 A:获授权后提升;旧主写入约束 → Redis 当前主节点:限制旧主接写;Prometheus → Sentinel 实例组:采集协调状态;Grafana → Prometheus:查询时间线。箭头说明见下方流向解读。
逻辑参考图,Sentinel 组表示分布在独立故障域的多个实例;布局不是物理共置关系,也不表示已经完成切换或零丢失验证。

Sentinel 客户端

入口 / 来源

配置多个 Sentinel 地址与准确的主节点名称,发现后的数据地址必须可达;对超时写入需要幂等或业务核对。

全部组件职责 8 个组件
Sentinel 客户端
配置多个 Sentinel 地址与准确的主节点名称,发现后的数据地址必须可达;对超时写入需要幂等或业务核对。
Redis 当前主节点
承接业务请求并向副本复制,主角色发生变化后客户端需要重新发现;不能继续用旧地址判断权威。工具介绍 Redis 当前主节点
Redis 副本 A
根据复制健康、优先级和实际资格参与候选选择,提升后需观察其他副本重配置与应用恢复。工具介绍 Redis 副本 A
Sentinel 实例组
参考使用跨故障域的三个实例。quorum 用于客观下线认定,发起故障转移还需多数授权;本图只示意部分监测与控制连线。工具介绍 Sentinel 实例组
旧主写入约束
按预案约束旧主的直连和旧连接写入,必要时评估副本数量限制写入等取舍;不是 Sentinel 自带的通用强制隔离保证。
Redis 副本 B
表示另一可用数据副本,应按真实故障域部署;全量同步可能额外占用内存、磁盘和网络。工具介绍 Redis 副本 B
Prometheus
通过版本兼容的指标端点观测 Redis 和 Sentinel,并保留选主事件与资源时间线,不参与多数投票。工具介绍 Prometheus
Grafana
结合复制链路、持久化错误、客户端重连与事件时间,区分采集失败、单副本故障和多数不可达。工具介绍 Grafana
流向解读 9 条连接
  1. 1

    Sentinel 客户端 Sentinel 实例组

    控制 / 管理 · 查询当前主地址

    Sentinel 返回当前主节点地址;它不是转发业务命令的数据代理。

  2. 2

    Sentinel 客户端 Redis 当前主节点

    数据 / 请求 · 直接读写

    客户端使用发现结果直接连接 Redis,角色变化后需要刷新旧连接池。

  3. 3

    Redis 当前主节点 Redis 副本 A

    数据 / 请求 · 异步复制

    数据从当前主节点复制到副本 A,已确认写入仍可能尚未送达。

  4. 4

    Redis 当前主节点 Redis 副本 B

    数据 / 请求 · 异步复制

    数据复制到副本 B;副本数量增加不自动形成强一致提交多数。

  5. 5

    Sentinel 实例组 Redis 当前主节点

    观测 / 查询 · 监测角色与可达性

    Sentinel 监测数据节点并交换视图,客观下线和多数授权是不同条件。

  6. 6

    Sentinel 实例组 Redis 副本 A

    控制 / 管理 · 获授权后提升

    只有具备故障转移授权和合格候选时才执行提升;此边不表示当前副本已经成为主节点。

  7. 7

    旧主写入约束 Redis 当前主节点

    控制 / 管理 · 限制旧主接写

    故障转移时防止旧主在隔离分区继续承接业务,需要实际验证所有写入口。

  8. 8

    Prometheus Sentinel 实例组

    观测 / 查询 · 采集协调状态

    通过适配指标端点观察多数可达性和角色事件,不把采集失联等同于完成选主。

  9. 9

    Grafana Prometheus

    观测 / 查询 · 查询时间线

    查看切换相关指标,并与 Sentinel 原始事件和客户端记录对照。

故障域与操作边界

Sentinel 多数不是数据多数

quorum 认定下线,多数授权允许故障转移;两者都不能保证每笔已确认写入已在被提升副本上保存。

发现服务不能阻止所有旧主直连

网络分区中的旧客户端可能继续使用旧连接,需单独落实写入约束及业务重试策略,不能宣称 Sentinel 天然避免一切双写。

恢复冗余不意味着自动回切

旧主回归时先保留分歧证据,按新主重同步;不能用旧 RDB/AOF 覆盖新主或为还原机器角色直接切回。

架构依据与版本核对 1 篇官方资料

图解是本站基于官方资料整理的逻辑参考;实施前仍需核对实际部署版本、组件支持范围与变更审批。

适用范围与设计目标

本文作为「Redis Sentinel 高可用」场景的架构参考,适用于非分片 Redis 主从复制与 Sentinel。先明确业务能容忍的写入中断、数据丢失、读一致性和跨故障域成本;这些目标需要环境测试,不能从组件名称推导出来。若系统采用 Redis Cluster,应使用其集群发现与故障转移机制另行设计。

区分故障判断与切换授权

quorum 决定多少 Sentinel 共同判断主节点不可达;真正发起自动故障转移还需要满足多数 Sentinel 的授权要求。降低 quorum 不能让失去多数的分区继续自动切换。官方建议稳健部署至少使用三个 Sentinel,并置于能独立故障的机器或故障域,具体依据见文末 Sentinel 文档。

设计时列出机器、机架、网络和可用区失效后的剩余成员及连通性。三进程集中在同一宿主机不提供三个独立故障视角;只有两个故障域时,还需要明确整域失效对投票和数据副本的影响。

分开核对三条连接路径

  • Sentinel 之间需要交换监控与选举信息。
  • Sentinel 需要连接所有可能承担主从角色的 Redis 实例。
  • 应用需要连接多个 Sentinel,并能访问它们返回的 Redis 地址。

把每条路径的认证、TLS、名称解析和网络策略写入接入清单。容器或 NAT 场景特别核对通告地址,不能只验证宿主机上能够连接。为 Sentinel 的状态配置文件保留正确写权限及持久化位置,避免重启后依赖过期配置。

客户端必须支持重新发现

应用配置应包含一组 Sentinel 地址与一致的主组名,而非把当前主节点 IP 固定为长期写入口。客户端向 Sentinel 查询主地址后,还需按客户端规范验证角色;重连时重新发现,并替换连接池中的旧连接。Sentinel 不代理业务命令,认证和超时也要分别处理。

以下查询只用于核对发现结果。大写字符串是主机与主组名占位符,认证参数按环境的安全凭据方式补充:

redis-cli -h REPLACE_WITH_SENTINEL_HOST -p 26379 SENTINEL GET-MASTER-ADDR-BY-NAME REPLACE_WITH_MASTER_NAME
redis-cli -h REPLACE_WITH_REDIS_HOST -p 6379 ROLE

把数据语义写进应用约定

异步复制下,已确认写入仍可能在故障转移中丢失。断连后的命令也可能处于「服务端已执行、客户端未收到响应」状态,重试策略应结合操作幂等性和业务去重。不要把自动重连等同于业务安全重试。

设计评审应明确关键数据能否重建、如何核对重复操作、是否允许副本读及如何识别过期数据。持久化、备份与 Sentinel 各有作用,需要分别制定恢复验证,而不是互相替代。

验收与停止条件

在测试环境覆盖主节点失效、单个 Sentinel 失效、网络隔离及旧主恢复,记录发现收敛、连接池恢复和业务请求结果。验收标准包括所有应用获得一致的新主、旧主不继续承接有效写入、数据偏差符合事先目标。若发现返回地址不可达、客户端仍固定连旧主或多数故障域设计不成立,应停止上线并修正架构;上线前保留原连接配置和数据恢复方案。

参考资料

从现象到判断

先收集证据,再缩小范围。以下是判读路径,不代表已经确认根因或获准变更。

  1. 部分 Sentinel 认为主节点异常,却没有自动切换;节点进程数看似足够,实际部署又集中在少数故障域。

    只读核对
    读取各 Sentinel 的同主组视图、已知成员及当前仲裁检查结果,核对机器、网络和故障域清单,不发起手动切换。
    如何判读
    先区分下线判断与多数授权是否成立,再检查候选资格;进程数量或单节点返回结果不能代表全局连通条件。
  2. Sentinel 返回了新的主地址,应用仍持续连接失败或访问旧节点;管理机上的连接结果却正常。

    只读核对
    只读对照不同应用的 Sentinel 地址、主组名和客户端版本,查看连接池目标及错误记录,核对通告地址的网络范围。
    如何判读
    发现成功只覆盖协调查询,未证明应用能访问数据地址或刷新旧连接;应按应用类别定位,而不是只重查管理端。
  3. 切换前后的业务记录出现缺口或重复,控制面最终已经收敛;部分超时请求无法从客户端判断是否执行。

    只读核对
    关联既有请求标识、客户端重试、复制状态和角色事件,保留旧主与新主的时间线,不重放业务请求验证猜测。
    如何判读
    异步复制风险和结果未知重试可能同时存在;需要业务证据区分未保存与重复执行,不能因单主恢复就关闭数据问题。
常见误区与判断边界 2 项

降低 quorum 不能制造授权多数

quorum 与执行故障转移所需多数承担不同职责,降低前者不能修复成员之间的网络分区,也不会补齐候选数据。若设计缺少独立故障域,应先说明整域失效后的剩余连通性;把阈值改小以得到切换事件,会掩盖真正的可用性边界。

发现新主不能自动隔离全部旧连接

应用直连、缓存地址和隔离分区里的旧连接可能继续影响写入行为。应把所有写入口与约束方法纳入评审,并明确丢失和重复操作如何核对。不能因为 Sentinel 已宣布新主,就假定旧主永远无法接写,或直接把流量切回原机器。

交接时应留下的证据

作为记录提纲使用,不是自动检查结果;未取得的证据应标记缺口,并注明负责人。

  • 列出 Sentinel 与数据节点的身份、主组名、版本和真实故障域,分别记录正常及规划故障下的成员连通与授权条件。
  • 保存每类应用的发现入口、数据入口、客户端库和认证方式说明,使用脱敏配置引用,不在交接材料中包含密码或令牌。
  • 对照主副本复制状态、Sentinel 视图和应用连接目标的同窗口记录,标明采样差异以及尚未验证的候选可达性。
  • 登记业务写入中断、数据偏差和超时重试的验收方法,说明旧主写入约束、未知结果处理人及备份恢复的独立边界。

记录需包含环境、版本、时间与时区;分享前脱敏,不附访问令牌、密码或完整业务敏感数据。

继续阅读与资料核对

补充相关主题,再结合当前环境的实施记录形成结论。

返回原理导读

DOUYA OPS ECOSYSTEM

贡献你的经验,帮助更多运维人

把故障复盘、标准流程和最佳实践沉淀为可检索、可复用的知识内容。