11.1.2 一致性模型与ZAB协议概述
一致性模型与ZAB协议概述本节聚焦ZooKeeper的一致性保证与ZAB协议的核心流程,并结合可运行示例与排障手段,帮助理解“为何一致、何时提交、如何恢复”。
一致性模型要点(含示例)#
ZooKeeper提供顺序一致性、原子性、单系统映像与可靠性:
- 顺序一致性:所有客户端看到相同的更新顺序。
- 原子性:事务要么成功要么失败。
- 单系统映像:不同服务器视图一致。
- 可靠性:已提交事务不会回滚。
示例:会话内读到自身写入的单调性
# 假设连接到任意节点
$ zkCli.sh -server 127.0.0.1:2181
[zk: 127.0.0.1:2181(CONNECTED) 0] create /demo "v1"
Created /demo
[zk: 127.0.0.1:2181(CONNECTED) 1] get /demo
v1
# 同一会话内再写
[zk: 127.0.0.1:2181(CONNECTED) 2] set /demo "v2"
[zk: 127.0.0.1:2181(CONNECTED) 3] get /demo
v2
ZAB核心流程(原理草图)#
ZAB(ZooKeeper Atomic Broadcast)包含崩溃恢复与消息广播两个阶段:
关键点
- ZXID= epoch + counter,保证全局事务有序。
- Quorum:过半确认后提交,保证已提交事务不丢失。
- 读写分离:写必须经Leader,读可在任意节点。
关键命令与输出解释(含预期效果)#
1)查看Leader/Follower与ZXID#
# 查看当前节点角色与统计信息
$ echo stat | nc 127.0.0.1 2181
Zookeeper version: 3.8.1-...
Mode: follower
Node count: 87
# 输出中 Mode 表示角色;可在不同节点运行确认Leader
# 查看服务角色(适用于集群运维)
$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/conf/zoo.cfg
Mode: leader
2)查看事务日志/快照目录(定位一致性问题)#
# zoo.cfg中关键路径
dataDir=/opt/zookeeper/data
dataLogDir=/opt/zookeeper/logs
# 查看最新快照与日志
$ ls -lh /opt/zookeeper/data
snapshot.100000000
$ ls -lh /opt/zookeeper/logs
log.100000001
3)模拟多数派提交(写入测试)#
# 在Leader节点执行写入
$ zkCli.sh -server 127.0.0.1:2181 <<'EOF'
create /zab_test "ok"
get /zab_test
quit
EOF
# 预期:创建成功且能读到
排错与实战定位#
1)写延迟高或提交阻塞
- 可能原因:Follower磁盘慢、网络抖动导致ack迟到。
- 排查命令:
# 观察延迟与同步情况
$ echo mntr | nc 127.0.0.1 2181 | egrep 'zk_server_state|zk_avg_latency|zk_max_latency'
zk_server_state follower
zk_avg_latency 12
zk_max_latency 88
2)频繁选举/角色抖动
- 可能原因:心跳超时、网络分区、磁盘I/O阻塞。
- 排查步骤:
# 查看日志中选举与会话超时
$ grep -E "LEADING|FOLLOWING|LOOKING|Timeout|sid" /opt/zookeeper/logs/zookeeper.out | tail -n 50
练习(带目标与验收)#
- 角色识别:在3节点集群分别执行
echo stat | nc,确认Leader与Follower。 - 事务顺序验证:连续执行两次
set /demo,在不同节点get /demo,验证顺序一致性。 - 故障模拟:停止Follower,观察Leader是否仍可提交;恢复Follower后验证其是否追上(查看
stat的Node count与zxid变化)。
通过上述流程与命令,你可以把一致性模型、ZAB提交路径与典型故障表现建立起可验证的运维认知。