ZAB 的广播阶段是怎么让一个写入「在整个集群里生效」的?这篇用 mntr 的计数器验证 Proposal → Ack → Commit 的对应关系,再暂停 follower 看没有多数派确认时写入处于什么状态。
z40-1 follower 收到 proposal +500 收到 commit +500 本地提交 commit_count +0 z40-2 leader 收到 proposal +0 收到 commit +0 本地提交 commit_count +500 z40-3 follower 收到 proposal +500 收到 commit +500 本地提交 commit_count +0 leader 的 avg_quorum_ack_latency = 5.3733 ms;avg_proposal_latency = 0.0 ms
字段名对应:zk_learner_proposal_received_count、zk_learner_commit_received_count 是 follower 收到的数量,zk_commit_count 是本节点提交到内存树的数量。
两个 follower 暂停 1.5 秒后:异步 create 完成了吗? False | 另一个客户端读 /pending: None | leader 的 zk_outstanding_requests = 1 follower 恢复后 4 ms:create 结果 True,/pending 现在可见: True
leader 自己也要把提案写进事务日志并 ack,所以 3 个节点里 leader 加任意一个 follower 的 ack 就够多数派。这里两个 follower 都被暂停,leader 自己的 ack 不够,提案就卡住。