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集群启动的入口类是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
BinaryInputArchive& BinaryOutputArchive底层通信数据封装与操作 BinaryInputArchive是对于DataInput的封装,用于处理基于zookeeper协议的底层数据,其实是从DataInputStream输入中读取数据。 BinaryOutputArchive是对于DataOutput的封装,根据zookeeper协议将数据写入到DataOutputStream中去。 1. 读取int, boolean基本数据类型直接代理给DataInput执行
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数据是以文件形式存储在硬盘上的,以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用来用来创建文件名