『網際網路架構』軟體架構-zookeeper之原始碼分析和運維總結(37)
今天主要是說原始碼的分析,客戶端啟動過程的原始碼分析和服務端啟動過程的原始碼分析。最後在說說zookeeper的運維和總結。原始碼:https://github.com/limingios/netFuture/原始碼/『網際網路架構』軟體架構-zookeeper之原始碼分析和運維總結(37)
(一)服務的啟動過程
-
初始化
> server1,server2,server3,不知道那個是leader,那個是follower,啟動完成
-
選舉演算法
> 選擇出來leader,follower和observer
如何選舉出來的,兩種方式
1.jps檢視
2.vim zkServer.sh

為了保證寫操作的一致性與可用性。
zookeeper專門設計了一種名為原子廣播(ZAB)的支援崩潰恢復的一致性協議,基於該協議,zookeeper實現了一種主從模式的系統架構來保持叢集中各個副本之間的資料一致性
根據ZAB協議,所有的寫操作都必須通過Leader完成,Leader寫入本地日常後再複製到所有的Follower節點。
一旦Leader節點無法工作,ZAB協議能夠自動從Follower節點中重新選出一個合適的替代者,即新的Leader,該過程即為領導選舉,該領導選舉過程,是ZAB協議中最為重要和複雜的過程。FastLeaderElection是Fast Paxos演算法實現。
3.檢視QuorumPeerMain

QuorumPeerConfig呼叫這個方法的parse方法
載入配置檔案FileInputStream,load
load 載入load0
在家配置檔案的時候,parseProperties,看到裡面獲取的關鍵字,是不是有點驚喜,是不是對應咱們的zoo.cfg檔案,獲取到之後給屬性賦值。
主類的start方法
1.loadDataBase 啟動時先從記憶體資料庫中恢復資料
2.cnxnFactrory.start() 通過NIO的方式讀和寫的操作,啟動socker程式設計
3.startLeaderElection 選舉演算法,選擇出來的leader
4.涉及到的演算法,zab和Paxos演算法,zab是實踐演算法(依賴了Paxos的思想做了簡化),Paxos屬於理論的演算法(美國總統競選的一個過程)。具體Paxos理論:參考原始碼:裡面的文件。start 就是啟動開始幹活了。
-
寫操作
1.客戶端想Leader發起寫請求
2.Leader將寫請求以Proposal(建議)的形式發給所有
3.Follower並等待ACK(確認)Follower收到Leader的Proposal後返回的ACK
4.Leader得到過辦數的ACK(Leader對自己預設有一個ACK)後向所有的Follower和Observer傳送Commint
5.Leader將處理結果返回給客戶端
注意
Leader 不需要得到所有Follower的ACK,只要收到過半的ACK即可,同時Leader本身對自己有的一個ACK Observer雖然沒有投票權,但仍須同步Leader的資料從而在處理讀請求時,可以返回竟可能新的資料。
預設的沒有observer 如何設定
在zoo.cfg中選擇一個節點後面新增:obServer
既然obServer沒有投票權,在實際使用中,如果機器比較多允許的話,建議增加一個obServer,不進行投票減少資源的消耗,還能負載減輕其他機器的壓力。這就是古代皇宮的太監,能幹活還放心,沒有話語權,只會幹活。
(二)客戶的啟動過程
- 客戶端的啟動流程
public ZooKeeper(String connectString,int sessionTimeout, Watcher watcher,boolean canBeReadOnly) throws IOException { LOG .info( "Initiating client connection, connectString=" + connectString +" sessionTimeout=" + sessionTimeout +" watcher=" + watcher); watchManager. defaultWatcher = watcher; ConnectStringParser connectStringParser =new ConnectStringParser( connectString); HostProvider hostProvider =new StaticHostProvider( connectStringParser.getServerAddresses());//拿到 ip 埠號 cnxn =new ClientCnxn(connectStringParser.getChrootPath(), hostProvider, sessionTimeout,this,watchManager, getClientCnxnSocket (), canBeReadOnly);//建立 ClientCnxn 物件 cnxn.start();//非 thread 執行緒啟動 }
- org.apache.zookeeper.ClientCnxn#ClientCnxn 初始化 啟動了兩個執行緒 send 和 event
public ClientCnxn(String chrootPath, HostProvider hostProvider,int sessionTimeout, ZooKeeper zooKeeper,ClientWatchManager watcher, ClientCnxnSocket clientCnxnSocket,long sessionId,byte[] sessionPasswd,boolean canBeReadOnly) { this. zooKeeper = zooKeeper; this. watcher = watcher; this. sessionId = sessionId; this. sessionPasswd = sessionPasswd; this. sessionTimeout = sessionTimeout; this. hostProvider = hostProvider; this. chrootPath = chrootPath; connectTimeout = sessionTimeout / hostProvider.size(); readTimeout = sessionTimeout * 2 / 3; readOnly = canBeReadOnly; sendThread =new SendThread(clientCnxnSocket); eventThread =new EventThread(); }
-
佇列包括3個佇列
>outgoingQueue,該佇列用於存放等待發送的資料包。
>pendingQueue,該佇列用於存放已傳送,等待服務端響應的資料包。
>waitingEvents,服務端的響應會封裝成事件放入該佇列中等待處理。
使用者傳送一個讀取資料節點的請求,該請求首先被封裝成一個相應型別的資料包放入outgoingQueue佇列中,sendThread會把資料包從佇列中取出然後發往服務端並把該資料包加入到pendingQueue中,當sendThread收到服務端響應時,會與pendingQueue佇列中的第一個資料包進行對比,判斷是否是期待的那個響應包(這裡可以看出資料包是序列處理的),最後把響應的資料包封裝成對應型別的事件加入到waitingEvents中,再由eventThread取出進行處理。
(三)運維相關
-
阿里雲zookeeper介面工具
>官網地址:https://github.com/alibaba/taokeeper/downloads
>因為太久沒更新了,瞭解下就可以了不建議使用
-
zkweb
>zookeeper web管理和監控介面,使用內建的H2資料庫,此版本基於淘寶大神yasenagat的zkWeb原始碼基礎之上進行了大幅升級和修改,主要新增了叢集監控和國際化功能,直接java -jar或將war包放入tomcat即可執行!
>官網地址:https://github.com/zhitom/zkweb
-
運維常用命令
>輸出server的詳細配置資訊
echo conf|nc localhost 2181
輸出指定server上所有客戶端連線的詳細資訊,包括客戶端IP,會話ID等
連線資訊的總覽,連線ip、埠號、該連線的發包數、該連線的收包數、連線的session Id、最後操作方式/命令、連線的時間戳、超時時間(未確認)、最後的zxid、最後、響應時間戳、連線的時間延時資訊等
echo cons|nc localhost 2181
功能性命令。重置所有連線的統計資訊
“` bash·
echo crst|nc localhost 2181
 >針對Leader執行,用於輸出所有等待佇列中的會話和臨時節點的資訊 ``` bash echo dump|nc localhost 2181
輸出server簡要狀態和連線的客戶端資訊
echo stat|nc localhost 2181
列出所有watcher資訊,以watcher的session為歸組單元排列,列出該會話訂閱了哪些path。
echo wchc|nc localhost 2181
輸出一些ZK執行時資訊
版本、延時、收包、發包、連線數、未完成客戶端請求數、leader/follower 狀態、znode 數、watch 數、臨時節點數、近似資料大小 應該是一個總和的值、開啟檔案描述符 數、最大檔案描述符數、fllower數等等
echo mntr | nc localhost 2181
PS:zookeeper就告一段落了,zookeeper網際網路的奠基石,這個一定要理解原理,有基本的使用,架構之路必須要翻越的一面牆
>>原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!
>>原文連結地址:上一篇:已是最新文章