? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Zookeeper開篇
? ? ?Zookeeper作為一個(gè)常見的集群一致性的工具牢贸,經(jīng)常用于主備谈火,分布式鎖等多個(gè)領(lǐng)域审胸,根據(jù)LINUX文件系統(tǒng)的思想做出的內(nèi)存樹形結(jié)構(gòu)(LINUX中文件系統(tǒng)的抽象是inode Zookeeper中的叫znode梭纹,插一句Hadoop的HDFS中的文件最基本抽象也叫INode)捺僻。zookeeper中有三種,群首恋技,跟隨者和參與者拇舀,后者不參與投票。
Zookeeper的Zab協(xié)議包括leader選舉和事物廣播蜻底,會(huì)在源碼中介紹骄崩。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?啟動(dòng)的過程
Zk的main方法在QuorumPeerMain中main方法中。
解析參數(shù)
調(diào)用initializeAndRun根據(jù)輸入?yún)?shù)解析存儲(chǔ)到QuorumPeerConfig這個(gè)對(duì)象朱躺,這個(gè)參數(shù)就是我們常見的zoo.cfg的路徑刁赖。QuorumPeerConfig會(huì)將zoo.cfg加載到一個(gè)Properties中然后去從中得到各個(gè)的屬性,這些參數(shù)后面會(huì)用到长搀。這里有一個(gè)dynamicConfigFile的屬性會(huì)被解析為dynamicConfigFileStr宇弛。
開啟清理任務(wù)
解析完畢,開啟一個(gè)清理任務(wù)的線程源请,系統(tǒng)運(yùn)行中會(huì)定時(shí)把內(nèi)存快照存在硬盤指定位置上枪芒,可以啟動(dòng)線程定時(shí)清理日志和快照彻况。
生成QuorumPeer
根據(jù)前面生成的QuorumPeerConfig啟動(dòng)server 主要是生成QuorumPeer對(duì)象,并根據(jù)QuorumPeerConfig的屬性為QuorumPeer賦值舅踪,QuorumPeer是一個(gè)ZK Server的抽象纽甘。
看一下啟動(dòng)方法start:
@Override
? ? public synchronized void start() {
? ? ? ? if (!getView().containsKey(myid)) {
? ? ? ? ? ? throw new RuntimeException("My id " + myid + " not in the peer list");
? ? ? ? }
? ? ? ? loadDataBase();//讀取本地文件 主要是快照文件
? ? ? ? startServerCnxnFactory();// 啟動(dòng)NIO的服務(wù)端TCP監(jiān)聽 Accept Select work Expire等
? ? ? ? try {
? ? ? ? ? ? adminServer.start();//起一個(gè)Jetty服務(wù) 端口8080
? ? ? ? } catch (AdminServerException e) {
? ? ? ? ? ? LOG.warn("Problem starting AdminServer", e);
? ? ? ? ? ? System.out.println(e);
? ? ? ? }
? ? ? ? startLeaderElection();//開啟快速選舉
? ? ? ? super.start();
? ? }
Jetty是一個(gè)輕量級(jí)的Servlet容器,很多框架都在內(nèi)部使用Jetty提供可視化UI抽碌,這是Jetty提供了一個(gè)CommonsServlet 顯示如下信息:
(其中還有動(dòng)態(tài)配置部分暫時(shí)未寫)
隨后開啟選主的過程悍赢,下一篇再寫