ZAB协议处理流程
2023-06-14 11:41:28 6 举报
zk-3.5.8版本,ZAB协议处理流程
作者其他创作
大纲/内容
LearnerHandler.start();
wakeup();
new QuorumPacketfont color=\"#f1ac6a\
追溯到集群启动源码,节点状态为LEADING
oa.writeRecord
QuorumPacket qp = new QuorumPacket();while (this.isRunning()) { readPacket(qp); processPacket(qp);}
processPacket(qp);
这里Data为null,因为数据之前已经同步给Follower了
1、输入流读取数据
1.3 leader发ACK
case Leader.PROPOSAL:
run()
committedRequests.add(request);
startSendingPackets();
p.addAck(sid);
switch (qp.getType())
又会发给所有Follower对应的LearnerHandler中的阻塞队列
2.3、leader 同步内存数据
2.1、leader收到follower返回的ack,如果满足半数机制,发送commit
1.5 follower发ACK
这里从队列中取出提议
1.4 follower 写本地事务日志文件
前面步骤见ZK服务端处理链
SendAckRequestProcessor
SyncRequestProcessor
服务端follower
追溯到集群启动源码,节点状态为FOLLOWING
readPacket(qp);
2、处理通信包:提议
queuedRequests.add(request);
syncProcessor.processRequest(request);
inform(p);
zk.commitProcessor.commit(p.request);
1.2 leader写本地事务日志文件
提议发送给从节点
sendPackets();
try { follower.followLeader(); } catch (Exception e) { LOG.warn(\"Unexpected exception\
2、
while (true)
如果是ACK
丢到队列
唤醒阻塞的线程,对应CommitProcessor run方法
服务端leader
p = queuedPackets.poll();
使用jute序列化从输入流里拿数据
notifyAll();
sendObserverPacket(qp);
2.2、通知observer同步数据
new QuorumPacket(font color=\"#f1ac6a\
1、
commit(zxid);
qp = new QuorumPacket(font color=\"#f1ac6a\
sendPacket(qp);
1.1 发起提议,准备发送给Follower
leader.lead();
0 条评论
下一页