一、環境搭建
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):集群啟動有選舉,單機啟動沒有選舉;