bigywater.tech
Redis · 85

Redis Sentinel 监控

Sentinel 只需要知道主库的地址。它怎么知道有几个从库、有哪些别的 sentinel?探测多频繁?这篇从零启动三个 sentinel,把发现过程按毫秒量出来,再看它对主库的探测流量和写回配置文件的内容。

185 ms
3 个 sentinel 发现 2 个从库(向主库发 INFO)
2.2 s
3 个 sentinel 互相发现完成(通过主库的 hello 频道)
34 / 16 / 4
12 秒内主库上 ping / publish / info 的调用次数(3 个 sentinel)

发现过程

实测 · 本机执行输出
  +   185 ms  sentinel0: 已知从库 2 个,已知其它 sentinel 0 个
  +   185 ms  sentinel1: 已知从库 2 个,已知其它 sentinel 0 个
  +   186 ms  sentinel2: 已知从库 2 个,已知其它 sentinel 0 个
  +  2102 ms  sentinel0: 已知从库 2 个,已知其它 sentinel 1 个
  +  2103 ms  sentinel1: 已知从库 2 个,已知其它 sentinel 1 个
  +  2103 ms  sentinel2: 已知从库 2 个,已知其它 sentinel 2 个
  +  2225 ms  sentinel0: 已知从库 2 个,已知其它 sentinel 2 个
  +  2226 ms  sentinel1: 已知从库 2 个,已知其它 sentinel 2 个
  三个 sentinel 都发现了 2 个从库、2 个其它 sentinel:2.2 s

从库靠向主库发 INFO(里面列出了 slave0、slave1)发现;其它 sentinel 靠主库上的发布订阅频道 __sentinel__:hello:每个 sentinel 定期发布自己的地址、ID 与当前对主库的看法,其它 sentinel 订阅了这个频道就能看到。所以 sentinel 之间不需要互相配置地址。

SENTINEL MASTER / REPLICAS / SENTINELS

实测 · 本机执行输出
  name                       mymaster
  ip                         127.0.0.1
  port                       7600
  flags                      master
  num-slaves                 2
  num-other-sentinels        2
  quorum                     2
  down-after-milliseconds    3000
  failover-timeout           10000
  parallel-syncs             1
  last-ping-reply            180
  role-reported              master
实测 · 本机执行输出
  replica 127.0.0.1:7602 flags=slave master-link-status=ok slave-priority=100 slave-repl-offset=0
  replica 127.0.0.1:7601 flags=slave master-link-status=ok slave-priority=100 slave-repl-offset=0
  sentinel 127.0.0.1:7622 flags=sentinel,disconnected last-hello-message=23 ms
  sentinel 127.0.0.1:7621 flags=sentinel last-hello-message=129 ms
> SENTINEL CKQUORUM mymaster
"OK 3 usable Sentinels. Quorum and failover authorization can be reached"

quorum 2 是判定客观下线所需的 sentinel 数(第 87 篇)。SENTINEL CKQUORUM 检查当前可用的 sentinel 数够不够达到 quorum 并有权限发起故障转移。(输出里 7622 那一行的 disconnected 是那一刻到该 sentinel 的连接还没建好的瞬时状态。)

探测流量

实测 · 本机执行输出
   {'replconf': 24, 'publish': 16, 'ping': 34, 'info': 4} (3 个 sentinel,12 秒)
  主库上的 sentinel 连接 6 个,示例: name=sentinel-338eaf79-cmd flags=N rbs=1024 rbp=7 omem-shared=0 omem-unshared=0 cmd=publish lib-name= lib-ver= read-avg-pipeline-len-sum=24 avg-pipeli

3 个 sentinel 在 12 秒里对主库发了 ping 34 次(约每个 sentinel 每秒一次)、publish 16 次(约每 2 秒一次)、info 4 次(约每 10 秒一次)。replconf 是两个从库自己的心跳。流量很小;ping 的间隔也决定了主观下线判断的粒度(第 86 篇)。

写回配置文件

实测 · 本机执行输出
  sentinel monitor mymaster 127.0.0.1 7600 2
  sentinel myid 338eaf7961e5e1da322ce10dff126e6e97fdff72
  sentinel current-epoch 0
  sentinel known-replica mymaster 127.0.0.1 7602
  sentinel known-replica mymaster 127.0.0.1 7601
  sentinel known-sentinel mymaster 127.0.0.1 7622 472f7e38b4285fad839a745f52b0146d686fda7a
  sentinel known-sentinel mymaster 127.0.0.1 7621 f5fd0f1564839384a3fa55d41d9cb79368c6d85f

Sentinel 会改写自己的配置文件,保存 known-replica、known-sentinel、myid、current-epoch。所以 sentinel 的配置文件必须可写;重启后靠这些内容直接恢复拓扑。

分步演示:从「只知道主库」到完整拓扑

Sentinel 监控
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / Redis 8.10.2 独立实例(本机回环端口,save 关闭),redis-cli 风格输出由自写的 RESP 客户端打印;计时用 time.perf_counter,数字每次运行会有小幅抖动。1 主 2 从 + 3 个 sentinel,quorum 2,down-after-milliseconds 3000
    • 没有验证:sentinel 数量更多时的发现时间、跨机器网络、sentinel 密码/ACL 配置、announce-ip 设置、sentinel 重启后的重新发现细节
    京ICP备2026067502号-1京公网安备11010502063487号