1.      Zookeeper集群一旦选举leader后,  leader跟follower,observer之间会进行一些列的交互产生epoch,数据同步操作, 以及后续操作的投票处理决策等操作,这些交互过程其实挺复杂的,zookeeper的代码个人觉的没有整理的很清晰导致深入细节的时候看起来很费劲,下面我就对他们之间的交互做整体并尽可能细致的介绍3.1)如下图leader.lead()方法创建并启动LearnerCnxAcceptor线程用来侦听follower.followLeader()或者observer.observerLeader()中通过connectToLeader(addr)来连接leader, 每个连接会构建一个LearnerHandler线程对象来专门负责处理。由于follower与observer的差别在于observer不参与选举投票其他都类似,所以下面我就以leader跟follower的交互进行讲解。3.2)leader通过投票获取个sever的lastAccpetEpoch决策出最新的3.2.1)leader构建LearnerCnxAcceptor

Zookeeper 2016-03-09

QuorumPeer的run方法中主要用来进行选举,以及选举后进入各角色,角色被打破重新再进行选举,下图大体流程2.1.1基本概念Logicalclock, currentEpoch,acceptedEpoch   epoch  zxid2.2.2选举算法创建         Zookeeper启动的时候,quorumPeer线程的start方法的调用startLeaderElection方法来创建选举算法, 创建过程如下:1) 选举算法的创建之前先创建QuorumCnxManager,QuorumCnxManager利用tcp协议来进行leader选举,每一对server之间都会保持一个tcp链接,每个zookeeper会打开一个tcp/ipj监听集群中的其他server。         1.1) receiveConnection(socket)方法用来建立连接                   1.1.1) 读取请求连接zookeeperserver的sid(myid)                   1.1.2)      对方sid小于自己sid, 立马关闭连接, 自

Zookeeper 2016-03-09

Zookeeper集群启动的入口类是QuorumPeerMain来加载配置启动QuorumPeer线程。首先我们来看下QuorumPeer, 谷歌翻译quorum是法定人数,定额的意思, peer是对等的意思,那么QuorumPeer中quorum代表的意思就是每个zookeeper集群启动的时候集群中zookeeper服务数量就已经确定了,在每个zookeeper的配置文件中配置集群中的所有机器server.1=127.0.0.1:2886:3886 server.2=127.0.0.1:2887:3887 server.3=127.0.0.1:2888:3888事实上着也确定zookeeper在运行中是不能动态扩容的,必须停下服务修改配置才可以;QuorumPeer中peer代表就是集中每个zookeeper角色是对等的没有主从之分,每个zookeeper服务都可以成为leader, follower,observer。1.      QuorumPeerMain加载1)  QuorumPeerConfig读取配置文件,如下面的zoo.cfg文件tickTime=2000initL

Zookeeper 2016-03-09

Record是zookeepr底层通信数据序列化与反序列化统一接口1. 继承结构子类以Request结尾的是Client向Server发起请求子类以Response结尾的是Server向Client发起响应子类以Txn结尾是Server向Server发起事务请求的子类以Packet结尾是…???其他如Id, ACL往往被其他对象持有,不会单独在网络传输2. 举例1)CreateRequest: 用于在客户端创建一个节点时向服务器端发送的请求序列化CreateRequest,archive对象是对DataOutput封装,顺序的将数据写入到DataOutputStream输出流中去反序列化CreateRequest,archive对象是对DataInput封装,顺序的从DataInputStream输入流中中读取数据

Zookeeper 2016-03-09

BinaryInputArchive& BinaryOutputArchive底层通信数据封装与操作    BinaryInputArchive是对于DataInput的封装,用于处理基于zookeeper协议的底层数据,其实是从DataInputStream输入中读取数据。    BinaryOutputArchive是对于DataOutput的封装,根据zookeeper协议将数据写入到DataOutputStream中去。        1.  读取int, boolean基本数据类型直接代理给DataInput执行 

Zookeeper 2016-03-09