**:
zookeeper 是乙個典型的分布式資料一致性解決方案,分布式應用程式可以基於 zookeeper 實現諸如資料發布/訂閱、負載均衡、命名服務、分布式協調/通知、集群管理、master 選舉、分布式鎖和分布式佇列等功能。
zab 協議是為分布式協調服務zookeeper專門設計的一種支援崩潰恢復的一致性協議。基於該協議,zookeeper 實現了一種主從模式的系統架構來保持集群中各個副本之間的資料一致性。
之前看了下zab協議的**,也搞清楚了一些關鍵問題的解決思路,但是沒看**總有一種霧裡看花水中望月之感,本著不作死就不會死的精神,大概翻閱了zookeeper的zab模組實現,特總結與大家分享。
我會從「通訊協議」、「核心資料結構以及api」兩方面主要描述zookeeper中zab協議的具體實現,重點關注zab協議實現中抽象的物件以及物件之間的關聯。弱化請求處理流程,因為這些在描述zab協議中重點描述。
通訊協議
zab協議中節點之間通訊主要發生在leader和follower之間。他們之間主要的命令分為控制類和資料傳輸類。
其中控制類命令主要包含以下命令:
而資料傳輸類則主要包含:有乙個不太明白的是sync命令,好像在leader和follower之間正常的資料互動中不會有該命令的身影。
資料結構
learnerhandler
leader抽象出來的與follower節點進行資訊互動的物件。同時,該物件維護了leader與follower之間通訊狀態(如是否出現網路不通情況)。
follower節點啟動後,會主動連線leader,而leader會監聽follower的建立連線的請求。並為每個follower的tcp連線建立乙個learnerhandler物件,該物件會:
public class learnerhandler extends zookeeperthread
leaderleader抽象了集群當前的主節點,此類節點負責:
public class leader
}
leader物件對外提供一些重要api:
followerfollower抽象了集群的從節點,從節點負責:
public class follower extends learner
}
follower中最主要的功能是接受並處理leader發過來的命令,leader和follower之間的命令型別見「通訊協議」,每種命令的處理方法如下:
quorumpeerquorumpeer負責維護節點的選主狀態資訊,無論是leader還是follower,都需要記錄這些資訊。比如,當前節點的狀態,當前節點擊擇了誰作為主,等等等等。
其實,每個節點啟動時都是執行在quorumpeer的主迴圈之內,在迴圈內進行選主過程,完成選主後,根據選主結果決定本節點角色(leader/follower)。接下來就進入leader/follower的處理邏輯,直到該由於種種異常節點需要重新發起選主,便再一次進入quorumpeer的主迴圈了。
public class quorumpeer extends zookeeperthread implements quorumstats.provider
// 當前節點id
private long myid;
// 記錄當前投票資訊
volatile private vote currentvote;
// 記錄當前節點狀態,預設是looking
private serverstate state = serverstate.looking;
// 節點啟動入口
public synchronized void start()
// 節點執行主迴圈
@override
public void run()
// 開始選主咯
setcurrentvote(makelestrategy().lookforleader());
} catch (exception e)
break;
case observing:
// 觀察者角色,忽略
break;
case following:
// 變成follower,進入followleader()
try catch (exception e) finally
break;
case leading:
// 變成leader,進入lead()
try catch (exception e) finally
updateserverstate();
}break;
}start_fle = time.currentelapsedtime();
......}}
}
Zookeeper理解 ZAB協議
zab協議 協議介紹 關鍵字 過半數節點 訊息廣播 順序性保證 奔潰恢復 基本特性 leader選舉 資料同步 丟棄資料 結論 深入zab協議 系統模型 存在任意q q是 的子集 q,q 存在任意時候的q1 q2,他們的交集不等於空集合 此處的意義在於q1或q2 任意乙個都超過半數,應此不管如何去交...
Zookeeper集群搭建以及zab協議
單機環境下,jdk zookeeper安裝完畢,基於一台虛擬機器,進行zookeeper的偽集群搭建,zookeeper集群中包含三個節點,節點對外提供服務埠號分別為2181,2182,2183 基於zookeeper 3.4.10複製三份zookeeper安裝好的伺服器檔案,目錄名稱分別為zook...
zooKeeper和ZAB協議總結一下
zookeeper的主備同步和leader選舉是通過zab協議來完成的。寫一下能夠記得更牢一些。因為zk大多數是讀,少部分寫,所以讀都是讀follower。寫的是leader 資料同步的過程類似於二階段提交 client 寫資料到leader,leader為每乙個follower構建佇列,非同步將寫...