Zookeeper开篇
Zookeeper作为一个常见的集群一致性的工具,经常用于主备,分布式锁等多个领域,根据LINUX文件系统的思想做出的内存树形结构(LINUX中文件系统的抽象是inode Zookeeper中的叫znode,插一句Hadoop的HDFS中的文件最基本抽象也叫INode)。zookeeper中有三种,群首,跟随者和参与者,后者不参与投票。
Zookeeper的Zab协议包括leader选举和事物广播,会在源码中介绍。
启动的过程
Zk的main方法在QuorumPeerMain中main方法中。
解析参数
调用initializeAndRun根据输入参数解析存储到QuorumPeerConfig这个对象,这个参数就是我们常见的zoo.cfg的路径。QuorumPeerConfig会将zoo.cfg加载到一个Properties中然后去从中得到各个的属性,这些参数后面会用到。这里有一个dynamicConfigFile的属性会被解析为dynamicConfigFileStr。
开启清理任务
解析完毕,开启一个清理任务的线程,系统运行中会定时把内存快照存在硬盘指定位置上,可以启动线程定时清理日志和快照。
生成QuorumPeer
根据前面生成的QuorumPeerConfig启动server 主要是生成QuorumPeer对象,并根据QuorumPeerConfig的属性为QuorumPeer赋值,QuorumPeer是一个ZK Server的抽象。
看一下启动方法start:
@Override
public synchronized void start() {
if (!getView().containsKey(myid)) {
throw new RuntimeException("My id " + myid + " not in the peer list");
}
loadDataBase();//读取本地文件 主要是快照文件
startServerCnxnFactory();// 启动NIO的服务端TCP监听 Accept Select work Expire等
try {
adminServer.start();//起一个Jetty服务 端口8080
} catch (AdminServerException e) {
LOG.warn("Problem starting AdminServer", e);
System.out.println(e);
}
startLeaderElection();//开启快速选举
super.start();
}
Jetty是一个轻量级的Servlet容器,很多框架都在内部使用Jetty提供可视化UI,这是Jetty提供了一个CommonsServlet 显示如下信息:
(其中还有动态配置部分暂时未写)
随后开启选主的过程,下一篇再写