文章目錄
系統模型
數據模型
- 一顆樹,每個節點稱爲ZNode。
- 事務ID(ZXID),改變zk狀態的操作分配全局唯一的事務id。
- 包括節點的增刪,節點數據修改,會話創建和失效等。
節點
- 節點類型。
- 持久節點。創建直到主動刪除。
- 持久順序節點。zk中父節點維護第一級子節點順序,創建時該節點加上數字後綴,最大int最大值。
- 臨時節點。 創建直到會話失效,只能作爲葉子節點。
- 臨時順序節點。
- 節點存儲內容。
- 數據。
- 狀態。
版本
- 作用:CAS,修改數據前檢查版本號。
- 分類:
- version:數據內容的版本號。表示變更次數,-1標識不使用樂觀鎖。
- cversion:子節點的版本號。
- aversion:ACL變更版本號。
Watcher
- 提供分佈式發佈訂閱功能。
- 使用步驟:
- 客戶端註冊Watcher。初始化構造方法中傳入,getData、getChildern、exist方法傳入。
- 服務端處理Watcher。節點變更時。
- 封裝WatchedEvent。包括通知狀態、事件類型、節點路徑。
- 查詢Watcher。查詢節點下的Watcher並刪除。
- 觸發Watcher。向客戶端發送事件。
- 客戶端回調。
- 預處理。反序列化、chrootPath、對象轉換。
- 回調Watcher。加入EventThread線程,下一次輪訓週期回調。
- 特點:
- 一次性。Watcher觸發之後會移除,減少變更頻繁的節點的通知壓力。
- 客戶端串行。保證順序同時注意阻塞。
- 輕量。只發布事件本身,不攜帶節點數據,減小網絡和內存開銷。
ACL
- 權限分類。增刪改查+管理(ACL)
- 權限模式和授權對象。
服務器角色
Leader
- 事物請求的唯一調度執行者。保證事務順序性。
- 各個服務器的調度者。
Follower
- 處理非事務請求,轉發給Leader事務請求。
- 參與事務請求的Proposal投票。
- 參與Leader選舉。
Observer
- 類似Follower,處理非事務請求。
- 不參與Proposal和Leader選舉投票。
服務器間的通信類型
- 數據同步。
- 服務器初始化。
- 請求處理。
- Follower->Leader:轉發事務請求、ACK應答Proposal。
- Leader->Follower:發起Proposal投票、發起Commit提交。
- 會話管理。
- Follower->Leader:客戶端重連到Follower時校驗會話是否超時。
- Leader->Follower:獲取連接Follower的客戶端列表,激活會話。
Leader選舉
- 目的:選出最新數據的Leader。
- 時機:
- 啓動:集羣初始化。
- 運行期間:Leader掛掉,整個集羣不可用,需要重新選Leader。
服務器啓動
- server發出一個投票。投票包括自己的myid(啓動配置)和ZXID(初始爲0)。
- 接收各個服務器投票。校驗有效性包括:是否本輪投票、是否來自Looking狀態服務器。
- 處理投票。和其他投票PK並修正自己的投票。
- 優先比ZXID。大的爲Leader。
- 再比myid。大的爲Leader。
- 統計投票。大於半數達成一致,則選出Leader,否則重複2-4直到選出。
- 改變服務器狀態。Leading或者Following。
運行期間
- 變更服務器狀態。變爲Looking。
- 同啓動的1-5階段。只是ZXID爲本服務器的最大ZXID。
會話
- 會話狀態轉換。
- Leader管理會話。
創建
- 接收請求。
- 校驗:類型爲會話創建請求、客戶端ZXID不大於服務端、不是重連(帶sessionId直接打開會話)。
- 協商:會話超時時間——客戶端和服務端會話超時時間的交集。
- 創建會話。
- 分配sessionId,全局唯一。
- 註冊、激活會話。
- 生成會話密碼。會話轉移的憑證。
- 預處理。
- 創建請求。Follower會轉發給Leader。
- 註冊、激活會話。Leader本地註冊和激活。
- 事務處理。Proposal+Ack+Commit流程。
- 事務應用。事務日誌同步Leader的內存數據庫。
- 會話響應。
管理
- 分桶策略。根據會話下次超時時間點分桶,方便定時會話激活和檢查。
- 會話激活。客戶端發出 ping,服務端收到後對未關閉的會話更新下次超時時間,遷移分桶。
- 會話超時檢查。根據分桶批量檢查、批量清理,只涉及小部分會話
清理
- 標記會話爲關閉。清理期間即使收到客戶端請求也不處理。
- 發起關閉會話請求。廣播。
- 收集該會話相關需要清理的臨時節點。
- 排除會話關閉請求前未提交刪除的節點。
- 包含會話關閉請求前未提交創建的節點。
- 添加節點刪除事務。
- 刪除臨時節點。
- 移除會話
- 關閉連接。
重連
- 連接斷開。
- 等待客戶端從地址列表逐個選取服務器重連。
- 會話失效。重連期間時間過長,超過會話超時時間。
- 重新實例化客戶端。
- 會話轉移。重連連上其他服務器。
- 老服務器校驗會話的Owner,拋異常。
- 新連接的服務器正常處理請求。
請求處理
會話創建
- 見會話.創建
SetData
- 預處理。校驗請求類型、會話超時、ACL、數據版本。
- 事務處理。
- 事務應用。
- 請求響應
事務請求轉發
- 所有非Leader接收事務請求需要轉發給Leader處理。
GetData
- 預處理。類型、會話檢查。
- 非事務處理。獲取節點數據,包括ACL校驗。
- 請求響應。