ZooKeeper ZAB协议源码实现
深入源码理解ZAB协议实现细节。
ZAB协议源码实现
核心类结构:
| 类 | 角色 | 作用 |
|---|---|---|
| LeaderZooKeeperServer | Leader | 处理写请求、发起提议 |
| FollowerZooKeeperServer | Follower | 接收提议、参与投票 |
| LearnerHandler | Leader | 管理每个Follower连接 |
| CommitProcessor | 全角色 | 提交处理流水线 |
Leader请求处理链:
Java
PrepRequestProcessor
→ ProposalRequestProcessor
→ CommitProcessor
→ FinalRequestProcessor
关键源码分析:
Leader发送提议:
Java
// ProposalRequestProcessor.java
public void processRequest(Request request) {
zks.getLeader().propose(request); // 发送提议
zks.getLeader().forwardToFollowers(request); // 转发给Follower
}
Leader.propose()方法:
Java
public void propose(Request request) {
// 创建Proposal
Proposal proposal = new Proposal(request);
// 设置ZXID
proposal.zxid = getNextZxid();
// 加入提议队列
outstandingProposals.add(proposal);
// 发送给所有Learner
for (LearnerHandler f : learners) {
f.sendPacket(proposal);
}
}
Follower处理提议:
Java
// FollowerRequestProcessor.java
public void run() {
while (running) {
Request request = queuedRequests.take();
// 发送ACK给Leader
follower.writePacket(new Ack(request.zxid), false);
}
}
Leader收集ACK:
Java
// LearnerHandler.java
public void run() {
while (true) {
QuorumPacket qp = readPacket();
if (qp.getType() == Leader.ACK) {
// 更新ACK计数
leader.processAck(qp.getZxid(), qp.getTag());
}
}
}
提示:核心实现集中在Leader和LearnerHandler类中。
两阶段提交优化
传统2PC问题:
| 问题 | 说明 |
|---|---|
| 同步阻塞 | 参与者等待协调者 |
| 网络往返多 | 提议+投票+提交三次 |
| 性能瓶颈 | 等待全部确认 |
ZAB优化设计:
异步提交:
Java
// Leader收到过半ACK后立即提交
public void processAck(long zxid, long sender) {
Proposal proposal = outstandingProposals.get(zxid);
proposal.addAck(sender);
if (proposal.hasQuorum()) {
// 过半确认,立即提交
commit(zxid);
// 不等待全部Follower确认
}
}
流水线处理:
Java
// Leader持续发提议,不必等前一个提交
public void propose(Request request) {
// 异步发送,不阻塞
sendPacket(proposal);
// 继续处理下一个请求
}
批处理优化:
text
// LearnerHandler批量发送
public void sendPackets() {
List<Proposal> batch = new ArrayList<>();
while (!toSend.isEmpty()) {
batch.add(toSend.poll());
if (batch.size() >= BATCH_SIZE) {
sendBatch(batch);
batch.clear();
}
}
}
优化效果对比:
| 方式 | 吞吐量 |
|---|---|
| 传统2PC | 低 |
| ZAB异步 | 中 |
| ZAB流水线 | 高 |
优化总结:
| 优化 | 效果 |
|---|---|
| 过半提交 | 不等全部,减少延迟 |
| 流水线 | 连续提议,吞吐提升 |
| 批处理 | 减少网络往返 |
注意:流水线+批处理是ZAB高性能的核心设计。
要点总结
- LeaderZooKeeperServer处理写请求和提议
- FollowerZooKeeperServer接收提议并投票
- LearnerHandler管理Follower连接和ACK收集
- 处理链:Prep→Proposal→Commit→Final
- 过半ACK立即提交,不等全部
- 流水线连续提议,批处理减少网络往返
- 异步提交+流水线是性能优化核心
📝 发现内容有误?点击此处直接编辑