當前位置:編程學習大全網 - 源碼下載 - zk源碼閱讀37:ZooKeeperServer源碼分析

zk源碼閱讀37:ZooKeeperServer源碼分析

前面針對server啟動到選舉leader進行了壹個小結,現在進入leader和follower的啟動交互過程,需要先講ZooKeeperServer,

在之前源碼閱讀的25節裏面帶過了壹部分,這裏詳細講解ZooKeeperServer的源碼

繼承關系如下

本節主要講解內容如下

在源碼閱讀第24節講解了,這裏不贅述

是SessionTracker的內部接口

如下圖

除去log,jmx相關部分,源碼如下

ChangeRecord是ZooKeeperServer的內部類,下面會介紹

ServerStats,ZooKeeperServerListener都在25節的源碼介紹過

這個類並沒有調用,不用管

定義異常

這個數據結構為了促進PrepRequestProcessor以及FinalRequestProcessor的信息***享,講到調用鏈的時候再講。

其中,StatPersisted在源碼閱讀7中講DataNode的時候講過了

描述當前server所處的狀態

這裏列舉處兩個底層調用的構造函數

啟動涉及到db的數據加載,這裏也有集群和單機兩種,調用順序為

主要是集群的時候,server選完了leader,由leader才能調用數據加載loadData

下面按照單機版startdata函數展開

初始化zkDb完成數據加載

恢復session和數據,單機版啟動或者集群版leader選舉之後調用lead方法時,會調用該方法。

主要完成設置zxid以及把無效的session給kill掉的工作

這裏註意,為什麽需要幹這件事情,在下面思考中會說

裏面調用了setZxid(不展開)以及killSession函數

清除db中臨時會話記錄,會話跟蹤器也清除記錄

入口是ZooKeeperServer#startup,zkServer都是在上述加載了db的數據之後,調用startup來完成啟動

啟動的入口函數

調用了createSessionTracker等函數,介紹如下

createSessionTracker 完成會話跟蹤器的創建

這裏是默認的單機版實現,在集群版不同的角色有不同的實現,主要是參數sid不會傳1,而是配置中的sid

startSessionTracker 啟動會話跟蹤器

設置服務器運行狀態,對於ERROR和SHUTDOWN的state,進行對應的操作

源碼閱讀25:服務器異常報警,關閉機制 講過,這裏不贅述

安裝請求處理鏈路,是PrepRequestProcessor -> SyncRequestProcessor -> FinalRequestProcessor順序

具體在後面請求處理鏈路再講

兩個函數getServerId和expire

processConnectRequest用於處理client的連接請求,不展開

值得註意的地方是重連的調用

展開如下

重連的核心函數

驗證sessionId和傳遞來的密碼的正確性

根據sessionId生成密碼

在會話跟蹤器SessionTracker中判斷會話是否還有小

完成會話初始化,根據參數valid代表認證通過與否,用來判斷server是接收連接請求,還是發出closeConn的請求,不展開,重要部分如下

除去的get,set,jmx,shutdown相關函數,剩下重要函數如下

部分函數列舉如下

獲取下壹個server的zxid,調用方需要確保控制並發順序

上面ZooKeeperServer#expire調用了close函數,介紹如下

該函數用於提交壹個 關閉某個sessionId 的請求

這裏有兩個函數

之前在源碼21節 會話管理中講解了會話清除,在sessionTracker的記錄是馬上清除的,而DateTree中臨時會話的清除是通過調用鏈壹步步來的,也就是說兩個步驟不是同步的,所以如果中間服務器狀態改變了,會出現不壹致的情況

requestsInProcess代表正在處理的請求個數

就是說發出請求時,requestsInProcess+1,最後完成請求時,requestsInProcess-1.涉及到請求處理鏈。

ZooKeeperServer#checkPasswd調用

ZooKeeperServer#generatePasswd

就是sessionId要和sessionId^superSecret生成的第壹個隨機數相匹配即可

密碼不是client端設置的,是根據sessionId生成的

ZooKeeperServer#processConnectRequest 裏面調用reopenSession中

在上面已經講了,核心就是

這裏還沒有深入看,先存疑

比如思考中提到的loadData為什麽會出現數據不壹致,屬於某種異常情況的處理

為什麽不放到另外壹個類裏面去

  • 上一篇:支付寶搞小程序,前景怎樣和微信比有什麽差距?
  • 下一篇:我國主力坦克有那些?
  • copyright 2024編程學習大全網