Zookeeper的源码环境的搭建和源码解读
一、环境搭建
1、安装ant,并添加环境变量
(1)下载地址:https://ant.apache.org/bindownload.cgi
(2)下载版本:1.10.7,zip包;
(3)解压,配置环境变量ANT_HOME=D:\apache-ant-1.10.7-bin\apache-ant-1.10.7;
(4)编辑Path,增加%ANT_HOME%\bin;
(5)编辑classpath,增加%ANT_HOME%\lib;
2、替换build.xml文件内容
把
http://downloads.sourceforge.net/project/ant-eclipse/ant-eclipse/1.0/ant-eclipse-1.0.bin.tar.bz2
替换为:
http://ufpr.dl.sourceforge.net/project/ant-eclipse/ant-eclipse/1.0/ant-eclipse-1.0.bin.tar.bz2
3、ivy.xml文件中加入如下配置
<dependency org="commons-collections" name="commons-collections" rev="3.0"/>
<dependency org="org.apache.zookeeper" name="zookeeper" rev="3.5.8"/>
4、编译为eclipse工程
进入到zookeeper源码的根目录,执行命令: ant eclipse
二、源码的解读
1、项目介绍
- zookeeper-recipes: 示例源码;
- zookeeper-client: C语言客户端;
- zookeeper-server:主体源码;
2、服务的启动
Zookeeper的代码分为单机版启动和集群版启动;
2.1 启动前的准备
a. 在启动之前,先将项目的 pom.xml 文件的 scope 配置为 provided 注释了;
b. 配置conf 下的配置文件,拷贝 zoo_sample.cfg 文件为 zoo.cfg,并修改 dataDir 的路径 修改为 windows 系统的路径;
c. 将 conf 下的 log4j.properties 文件拷贝到 target 下的 class 目录下:
2.2 单机版启动
服务端:ZookeeperServerMain
客户端:ZookeeperMain
2.3 集群版启动
服务端:QuorumPeerMain
2.4 启动的基本流程
- 加载配置文件去初始化(QuorumPeerMain 或 ZookeeperServerMain)
- 初始化对外服务(ServerCnxnFactory):初始化网路编程相关的服务;默认使用java NIO,官网推荐使用 Netty;
- 初始化内存数据库(ZkDatabase):Zookeeper的数据存放在内存中的,所以不能存储大规模的数据;内存的数据也要保存到硬盘的文件中的,服务启动的时候再见数据从硬盘中加载到内存中。文件有2种,快照文件和日志文件;快照文件是某一个快照文件保存的是某一段时间节点的所有的数据;内存文件并不是一修改就去保存到文件中,若将数据刚刚写入服务就挂掉了,还没有保存的快照文件中,可以从日志文件中恢复数据到内存中。
- 初始化会话管理器(SessionTrackerImpl):客户端连接到服务端的时候有一个会话管理器;会话管理器会定时的去扫描会话,看有没有会话过期,过期了之后就会清除这个会话对应的临时节点数据也清除掉;zookeeper会将所有的会话按照过期时间去划分到一个个的桶中,桶中有一个过期的时间点,会话管理器会去扫描一个一个的桶,若桶过期,则说明该桶中的所有会话都过期了。
- 初始选举(FastLeaderElection):集群启动有选举,单机启动没有选举;