zookeeper的讀寫流程
基本架構
節點數要求是奇數。
常用的接口是 get/set/create/getChildren.
讀寫流程
寫流程
客戶端連接到集群中某一個節點
客戶端發送寫請求
服務端連接節點,把該寫請求轉發給leader
leader處理寫請求,一半以上的從節點也寫成功,返回給客戶端成功。
讀流程
客戶端連接到集群中某一節點
讀請求,直接返回。
故障恢復 && leader選舉
當leader down掉時。
集群暫停服務,進行leader選舉,采用fast paxos協議
首先所有server,提交自己作為leader,log的ID(epoch+1),id作用交互數據
通過比較接收的日志事務Id和自身的事務ID。
等待一個周期,確定出最新的leader。
加載snapshot,執行log。
最終一致性
讀數據時,有可能會臟讀。比較推薦watch的方式,實現數據的及時生效。
各節點數據完全一致
各節點存儲了全量的數據。
存儲策略
持久化存儲是基於內存快照(snapshot)和事務日志(txlog)來存儲。
snapshot和txlog的存儲目錄定義在zoo.cfg中,txlog存儲磁盤和snapshot存儲磁盤分開,避免io爭奪。
txlog的刷盤閾值是1000。txlog是生成snapshot之后生成。
snapshot的保存數量和清理時間間隔配置在zoo.cfg中。
時間復雜度
zookeeper 使用concurrenthashmap進行存儲。鎖的粒度是segment,減少鎖競爭,segment里對應一個hashtable 的若干桶.
所以時間復雜度都是 O(1)