ZK內部實現——Paxos到Zookeeper(二)

系統模型

數據模型

  • 一顆樹,每個節點稱爲ZNode。
  • 事務ID(ZXID),改變zk狀態的操作分配全局唯一的事務id。
    • 包括節點的增刪,節點數據修改,會話創建和失效等。

節點

  • 節點類型。
    • 持久節點。創建直到主動刪除。
    • 持久順序節點。zk中父節點維護第一級子節點順序,創建時該節點加上數字後綴,最大int最大值。
    • 臨時節點。 創建直到會話失效,只能作爲葉子節點
    • 臨時順序節點
  • 節點存儲內容。
    • 數據。
    • 狀態。
      200619.zknodestat.png

版本

  • 作用:CAS,修改數據前檢查版本號。
  • 分類:
    • version:數據內容的版本號。表示變更次數,-1標識不使用樂觀鎖。
    • cversion:子節點的版本號。
    • aversion:ACL變更版本號。

Watcher

  • 提供分佈式發佈訂閱功能。
    200619.watcher.png
  • 使用步驟:
    1. 客戶端註冊Watcher。初始化構造方法中傳入,getData、getChildern、exist方法傳入。
    2. 服務端處理Watcher。節點變更時。
    3. 封裝WatchedEvent。包括通知狀態、事件類型、節點路徑。
    4. 查詢Watcher。查詢節點下的Watcher並刪除。
    5. 觸發Watcher。向客戶端發送事件。
    6. 客戶端回調。
    7. 預處理。反序列化、chrootPath、對象轉換。
    8. 回調Watcher。加入EventThread線程,下一次輪訓週期回調。
  • 特點:
    • 一次性。Watcher觸發之後會移除,減少變更頻繁的節點的通知壓力。
    • 客戶端串行。保證順序同時注意阻塞。
    • 輕量。只發布事件本身,不攜帶節點數據,減小網絡和內存開銷。

ACL

  • 權限分類。增刪改查+管理(ACL)
  • 權限模式和授權對象。
    200621.acl.png

服務器角色

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。

服務器啓動

  1. server發出一個投票。投票包括自己的myid(啓動配置)和ZXID(初始爲0)。
  2. 接收各個服務器投票。校驗有效性包括:是否本輪投票、是否來自Looking狀態服務器。
  3. 處理投票。和其他投票PK並修正自己的投票。
    1. 優先比ZXID。大的爲Leader。
    2. 再比myid。大的爲Leader。
  4. 統計投票。大於半數達成一致,則選出Leader,否則重複2-4直到選出。
  5. 改變服務器狀態。Leading或者Following。

運行期間

  1. 變更服務器狀態。變爲Looking。
  2. 同啓動的1-5階段。只是ZXID爲本服務器的最大ZXID。

會話

  • 會話狀態轉換。
    200622.session.png
  • Leader管理會話。

創建

  1. 接收請求。
  2. 校驗:類型爲會話創建請求、客戶端ZXID不大於服務端、不是重連(帶sessionId直接打開會話)。
  3. 協商:會話超時時間——客戶端和服務端會話超時時間的交集。
  4. 創建會話。
  5. 分配sessionId,全局唯一。
  6. 註冊、激活會話。
  7. 生成會話密碼。會話轉移的憑證。
  8. 預處理。
  9. 創建請求。Follower會轉發給Leader。
  10. 註冊、激活會話。Leader本地註冊和激活。
  11. 事務處理。Proposal+Ack+Commit流程。
  12. 事務應用。事務日誌同步Leader的內存數據庫。
  13. 會話響應。

管理

  • 分桶策略。根據會話下次超時時間點分桶,方便定時會話激活和檢查。
    200622.sessionbucket.png
  • 會話激活。客戶端發出 ping,服務端收到後對未關閉的會話更新下次超時時間,遷移分桶。
  • 會話超時檢查。根據分桶批量檢查、批量清理,只涉及小部分會話

清理

  1. 標記會話爲關閉。清理期間即使收到客戶端請求也不處理。
  2. 發起關閉會話請求。廣播。
  3. 收集該會話相關需要清理的臨時節點。
    • 排除會話關閉請求前未提交刪除的節點。
    • 包含會話關閉請求前未提交創建的節點。
  4. 添加節點刪除事務。
  5. 刪除臨時節點。
  6. 移除會話
  7. 關閉連接。

重連

  • 連接斷開。
    • 等待客戶端從地址列表逐個選取服務器重連。
  • 會話失效。重連期間時間過長,超過會話超時時間。
    • 重新實例化客戶端。
  • 會話轉移。重連連上其他服務器。
    • 老服務器校驗會話的Owner,拋異常。
    • 新連接的服務器正常處理請求。

請求處理

會話創建

  • 見會話.創建

SetData

  1. 預處理。校驗請求類型、會話超時、ACL、數據版本。
  2. 事務處理。
  3. 事務應用。
  4. 請求響應

事務請求轉發

  • 所有非Leader接收事務請求需要轉發給Leader處理。

GetData

  1. 預處理。類型、會話檢查。
  2. 非事務處理。獲取節點數據,包括ACL校驗。
  3. 請求響應。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章