15.zookeeper原理解析-客户端与服务器端交互

作者:W.S.T 发布时间:March 17, 2016 分类:Zookeeper No Comments

Zookeeper集群中server数量总是确定的,所以集群中的server交互采用比较可靠的bio长连接模型;不同于集群中sever间交互zookeeper客户端其实数量是未知的,为了提高zookeeper并发性能,zookeeper客户端与服务器端交互采用nio模型。下面我们主要来讲讲zookeeper的服务器端与客户端的交互。读者对nio不了解的话不妨抽点时间去了解下,对于一些nio框架如netty,mina再如一些web容器如tomcat,jetty底层都实现一套nio框架,对于实现nio框架模型大家不妨去谷歌百度搜一下Doug Lea的scalable io in java 这个ppt。

阅读剩余部分...

14.zookeeper原理解析-服务器端处理流程之交互图

作者:W.S.T 发布时间:March 17, 2016 分类:Zookeeper No Comments

1. 下面就用一张图来说明Leader端的处理器链的交互过程

2. 下面就用一张图来说明Follower(Observer类似)端的处理器链的交互过程

阅读剩余部分...

13.zookeeper原理解析-服务器端处理流程之处理器详解

作者:W.S.T 发布时间:March 17, 2016 分类:Zookeeper No Comments

各个processor的主要功能

1) PrepRequestProcessor

         如名字这个处理器主要功能是对请求进行预处理, 将client向server请求二进制数据反序列化成sever中请求操作。

 

PrepRequestProcessor做为leader的第一个处理器,它的请求数据来源主要来自:

(1)    Leader做一个zk服务接收客户端请求提交到PrepRequestProcessor的队列中

(2)    作为集群的leader,在LearnerHanler.run方法中接收learner向leader发送的投票请求,消息类型为Leader.REQUEST

 

阅读剩余部分...

12.zookeeper原理解析-服务器端处理流程之处理器链

作者:W.S.T 发布时间:March 17, 2016 分类:Zookeeper No Comments

这部分内容我们主要讲解zookeeper请求在zookeeper server端的处理流程,对于不同角色的zookeeper具有不同的处理流程, ZookeepeerServer的start方法中会调用setupRequestProcessors()来初始化处理器链,它被子类覆写实现。

 

1.      LeaderZooKeeperServer

看如上代码主要建立了如下的两个处理器流链

(1)    PrepRequestProcessor(线程) => ProposalRequestProcessor(调initialize) =>CommitProcessor(线程) => Leader.ToBeAppliedRequestProcessor=>FinalRequestProcessor

(2)  ProposalRequestProcessor构造器设置另一处理器链, initialize方法启动SyncRequestProcessor线程 SyncRequestProcessor(线程)=> AckRequestProcessor

阅读剩余部分...

11.zookeeper原理解析-选举之数据同步

作者:W.S.T 发布时间:March 9, 2016 分类:Zookeeper No Comments



1.      Zookeeper集群一旦选举leader后,  leader跟follower,observer之间会进行一些列的交互产生epoch,数据同步操作, 以及后续操作的投票处理决策等操作,这些交互过程其实挺复杂的,zookeeper的代码个人觉的没有整理的很清晰导致深入细节的时候看起来很费劲,下面我就对他们之间的交互做整体并尽可能细致的介绍

3.1)如下图leader.lead()方法创建并启动LearnerCnxAcceptor线程用来侦听follower.followLeader()或者observer.observerLeader()中通过connectToLeader(addr)来连接leader, 每个连接会构建一个LearnerHandler线程对象来专门负责处理。

阅读剩余部分...