zk 节点是一个 QuorumPeer,选举结束后,leader 和 follower 各自执行自己的逻辑:

org.apache.zookeeper.server.quorum.QuorumPeer#run

org.apache.zookeeper.server.quorum.QuorumPeer#setLeader
org.apache.zookeeper.server.quorum.Leader#lead org.apache.zookeeper.server.quorum.QuorumPeer#setFollower
org.apache.zookeeper.server.quorum.Follower#followLeader

不管是 leader 还是 follower,都封装了一个 QuorumPeer 对象,QuorumPeer.ServerCnxnFactory 监听端口,处理客户端 io 事件。
请求处理的入口:把请求交给 procesor 链的 firstProcessor

org.apache.zookeeper.server.ZooKeeperServer#processPacket

leader

构建 processor 链

// org.apache.zookeeper.server.quorum.LeaderZooKeeperServer#setupRequestProcessors
protected void setupRequestProcessors() {
RequestProcessor finalProcessor = new FinalRequestProcessor(this);
RequestProcessor toBeAppliedProcessor = new Leader.ToBeAppliedRequestProcessor(
finalProcessor, getLeader().toBeApplied);
commitProcessor = new CommitProcessor(toBeAppliedProcessor,
Long.toString(getServerId()), false,
getZooKeeperServerListener());
commitProcessor.start();
ProposalRequestProcessor proposalProcessor = new ProposalRequestProcessor(this,
commitProcessor);
proposalProcessor.initialize();
firstProcessor = new PrepRequestProcessor(this, proposalProcessor);
((PrepRequestProcessor)firstProcessor).start();
}

请求处理链:PrepRequestProcessor, ProposalRequestProcessor, CommitProcessor, ToBeAppliedRequestProcessor, FinalRequestProcessor

由 ProposalRequestProcessor 构造函数可,还有一条链:SyncRequestProcessor, AckRequestProcessor

public ProposalRequestProcessor(LeaderZooKeeperServer zks,
RequestProcessor nextProcessor) {
this.zks = zks;
this.nextProcessor = nextProcessor;
AckRequestProcessor ackProcessor = new AckRequestProcessor(zks.getLeader());
syncProcessor = new SyncRequestProcessor(zks, ackProcessor);
}

follower

构建 processor 链

org.apache.zookeeper.server.quorum.FollowerZooKeeperServer#setupRequestProcessors

链1:FollowerRequestProcessor, CommitProcessor, FinalRequestProcessor

链2:SyncRequestProcessor, SendAckRequestProcessor

两阶段写

leader 接收写请求,反序列化请求体

org.apache.zookeeper.server.PrepRequestProcessor#processRequest

leader 发送建议给 follower

// org.apache.zookeeper.server.quorum.ProposalRequestProcessor#processRequest
zks.getLeader().propose(request);

leader 发送建议给自身

// 由 leader 的 SyncRequestProcessor 把请求写入事务日志
syncProcessor.processRequest(request);

leader 的 AckRequestProcessor 返回 ack 给自身

org.apache.zookeeper.server.quorum.AckRequestProcessor#processRequest

follower 接收并处理 leader 发送的建议

org.apache.zookeeper.server.quorum.Follower#processPacket

follower 的 SyncRequestProcessor 写入事务日志

org.apache.zookeeper.server.SyncRequestProcessor#run

follower 的 SendAckRequestProcessor 发送 ACK 给 leader

org.apache.zookeeper.server.quorum.SendAckRequestProcessor#processRequest

leader 接收并处理 follower 的 ack

org.apache.zookeeper.server.quorum.LearnerHandler#run
org.apache.zookeeper.server.quorum.Leader#processAck

ack 超过半数,向 follower 发送提交事件(把数据放入发送队列),并把写操作应用到 DataTree

follower 提交写操作,把数据写入 DataTree

CommitProcessor 和 FinalRequestProcessor

数据写入的 2 个关键时机
写事务日志

// org.apache.zookeeper.server.SyncRequestProcessor
zks.getZKDatabase().append(si)

写 DataTree

// org.apache.zookeeper.server.FinalRequestProcessor
getZKDatabase().processTxn(hdr, txn)

异常情况一:follower 处理 propose 超时,leader 如何处理?
leader 定期发送 ping 给 follower

// org.apache.zookeeper.server.quorum.LearnerHandler#ping
public void ping() {
long id;
if (syncLimitCheck.check(System.nanoTime())) {
synchronized(leader) {
id = leader.lastProposed;
}
QuorumPacket ping = new QuorumPacket(Leader.PING, id, null, null);
queuePacket(ping);
} else {
LOG.warn("Closing connection to peer due to transaction timeout.");
shutdown();
}
}

如果发现上一条 propose 超时,则断开与 follower 的连接,follower 会 shutdown,然后重新创建对象,重连 leader,会发送 ack 消息

查看事务日志:

org.apache.zookeeper.server.LogFormatter#main 

参数 D:/zk_test/data1/version-2/log.100000001

zk 两阶段提交(待完善)的更多相关文章

  1. 分布式事务(一)两阶段提交及JTA

    原创文章,同步发自作者个人博客 http://www.jasongj.com/big_data/two_phase_commit/ 分布式事务 分布式事务简介 分布式事务是指会涉及到操作多个数据库(或 ...

  2. Atitit ACID解决方案2PC(两阶段提交)  跨越多个数据库实例的ACID保证

    Atitit ACID解决方案2PC(两阶段提交)  跨越多个数据库实例的ACID保证 1.1. ACID解决方案1 1.2. 数据库厂商在很久以前就认识到数据库分区的必要性,并引入了一种称为2PC( ...

  3. MySQL binlog 组提交与 XA(两阶段提交)

    1. XA-2PC (two phase commit, 两阶段提交 ) XA是由X/Open组织提出的分布式事务的规范(X代表transaction; A代表accordant?).XA规范主要定义 ...

  4. MySQL binlog 组提交与 XA(分布式事务、两阶段提交)【转】

    概念: XA(分布式事务)规范主要定义了(全局)事务管理器(TM: Transaction Manager)和(局部)资源管理器(RM: Resource Manager)之间的接口.XA为了实现分布 ...

  5. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究 转载

    1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...

  6. MySQL源码之两阶段提交

    在双1的情况下,两阶段提交的过程 环境准备:mysql 5.5.18, innodb 1.1 version配置: sync_binlog=1 innodb_flush_log_at_trx_comm ...

  7. 两阶段提交及JTA

    两阶段提交及JTA 分布式事务 分布式事务简介 分布式事务是指会涉及到操作多个数据库(或者提供事务语义的系统,如JMS)的事务.其实就是将对同一数据库事务的概念扩大到了对多个数据库的事务.目的是为了保 ...

  8. 分布式事务、XA、两阶段提交、一阶段提交

    本文原文连接:http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的分布式事务的规范 ...

  9. 分布式事务 & 两阶段提交 & 三阶段提交

    可以参考这篇文章: http://blog.csdn.net/whycold/article/details/47702133 两阶段提交保证了分布式事务的原子性,这些子事务要么都做,要么都不做. 而 ...

随机推荐

  1. 基于mini2440嵌入式Linux根文件系统制作(Initramfs和nfs两种跟文件系统)

    嵌入式系统由三部分构成: 1.bootoader---bootparameters---2.kernel 3.Root-filesysytem 一个内核可以挂载多个文件系统,但是有一个根文件系统所以叫 ...

  2. HTML5 App的代码注入攻击

    原文链接 摘要 基于HTML5的手机app(译者注:以下简称HTML5 app)越来越流行了, 在大多数情况下它比native应用更容易适配不同的移动操作系统.它开发起来很方便,可以使用标准的web技 ...

  3. ftp不能复制文件

    解决办法: ie->工具->internet选项->安全->自定义级别->下载->文件下载->启用

  4. 集合(三) HashMap

    三.Map 先来讲一下Map,Map和Collection完全不是一个系列的,按理说讲完Collection的List,应该接着讲Collection的Set,但是因为Set中很多实现是基于Map来实 ...

  5. React native 在mac下安裝 环境

    前言 春节回来上班第一天,配了mac ,然后在去年就有要弄mac 配置RN教程,好勒一上午,其中有遇到一些问题,都解决 了 当然你可以看官网的步骤啦 https://reactnative.cn/do ...

  6. iOS的navigationbar设置左边按钮文字

    实例代码: - (void)viewDidLoad { [super viewDidLoad]; [self setTitle:@"Test"]; //以下是主要实现代码 UIBu ...

  7. vue前端与django后端数据交互

    //把数据传到路径为/airCdt/的django后端函数进行数据处理 onSubmit(){ const dict={ 'floor': this.formLabelAlign.floor, 'ro ...

  8. [洛谷P4072] SDOI2016 征途

    问题描述 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路 ...

  9. Spring框架的七大模块

    转载于:https://www.cnblogs.com/Z-wen/p/11681211.html   Spring框架的七大模块 1. Spring Core:Core封装包是框架的最基础部分,提供 ...

  10. vs 2019 调试web项目 浏览器