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

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

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

Zookeeper数据是以文件形式存储在硬盘上的,以snapshot为主,txnlog为辅。因为当对内存数据进行变更的时候,会保证将事务操作记入log日志,而snapshot只是内存某一个时刻影像,为了性能takeSnapshot生成snapshot并不是实时的,而是由后台线程根据一定规则处理的来看看snapshot和txnlog在磁盘上的文件文件名是以log.或者snapshot.加上一串long的16进制数字组成,这个long值就是zxid服务器端事务idSnapshot文件名生成, FileTxnSnapLog.save方法中         long lastZxid = dataTree.lastProcessedZxid;    FilesnapshotFile = new File(snapDir, Util.makeSnapshotName(lastZxid));如上代码创建一个新的snapshot文件,工具Util用来用来创建文件名  

Zookeeper 2016-03-09