10.zookeeper原理解析-选举之选举流程

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



QuorumPeer的run方法中主要用来进行选举,以及选举后进入各角色,角色被打破重新再进行选举,下图大体流程


2.1.1基本概念

Logicalclock, currentEpoch,acceptedEpoch   epoch  zxid

2.2.2选举算法创建

         Zookeeper启动的时候,quorumPeer线程的start方法的调用startLeaderElection方法来创建选举算法, 创建过程如下:

1) 选举算法的创建之前先创建QuorumCnxManager,QuorumCnxManager利用tcp协议来进行leader选举,每一对server之间都会保持一个tcp链接,每个zookeeper会打开一个tcp/ipj监听集群中的其他server。

阅读剩余部分...

9.zookeeper原理解析-选举之QuorumPeerMain加载

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



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。

 

阅读剩余部分...

8.zookeeper原理解析-序列化之Record接口

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



Record是zookeepr底层通信数据序列化与反序列化统一接口

1. 继承结构


子类以Request结尾的是Client向Server发起请求

子类以Response结尾的是Server向Client发起响应

子类以Txn结尾是Server向Server发起事务请求的

子类以Packet结尾是…???

其他如Id, ACL往往被其他对象持有,不会单独在网络传输


阅读剩余部分...

7.zookeeper原理解析-序列化之底层通信数据封装与操作

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



BinaryInputArchive& BinaryOutputArchive底层通信数据封装与操作

    BinaryInputArchive是对于DataInput的封装,用于处理基于zookeeper协议的底层数据,其实是从DataInputStream输入中读取数据。

    BinaryOutputArchive是对于DataOutput的封装,根据zookeeper协议将数据写入到DataOutputStream中去。

  

      

1.  读取int, boolean基本数据类型直接代理给DataInput执行

 

阅读剩余部分...

6.zookeeper原理解析-数据存储小结

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



Zookeeper数据是以文件形式存储在硬盘上的,以snapshot为主,txnlog为辅。因为当对内存数据进行变更的时候,会保证将事务操作记入log日志,而snapshot只是内存某一个时刻影像,为了性能takeSnapshot生成snapshot并不是实时的,而是由后台线程根据一定规则处理的

来看看snapshot和txnlog在磁盘上的文件

文件名是以log.或者snapshot.加上一串long的16进制数字组成,这个long值就是zxid服务器端事务id

Snapshot文件名生成, FileTxnSnapLog.save方法中

         long lastZxid = dataTree.lastProcessedZxid;

    FilesnapshotFile = new File(snapDir, Util.makeSnapshotName(lastZxid));

如上代码创建一个新的snapshot文件,工具Util用来用来创建文件名

         public static String makeSnapshotName(long zxid) {

        return "snapshot." +Long.toHexString(zxid);

}

 

阅读剩余部分...