Sentinel 只需要知道主库的地址。它怎么知道有几个从库、有哪些别的 sentinel?探测多频繁?这篇从零启动三个 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 之间不需要互相配置地址。
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-pipeli3 个 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 的配置文件必须可写;重启后靠这些内容直接恢复拓扑。