此次咱們來講說,有關於etcd原理的一些事情。以前咱們已經瞭解到了etcd是一個分佈式的k-v存儲,那麼它到底是如何保證數據是如何複製到每一個節點上面去的呢?又是如何保證在網絡分區的狀況下能正常工做下去?raft協議究竟是什麼?帶着這些問題咱們繼續往下看。服務器
咱們知道etcd使用raft協議來保證整個分佈式的節點網絡能正常的運轉而且能正確的將數據複製到每一個節點上面去。那麼什麼是raft協議嘞?網絡
首先咱們有這樣一個背景:raft是想維護整一個網絡,其中有一個領導人,這個領導人負責將收到的信息同步給網絡中的其餘全部節點,從而保證整個網絡數據一致。分佈式
若是你有必定的英文基礎,我建議直接查看下面這個網站,它用動畫很是清楚的描述了raft選舉的整個過程:http://thesecretlivesofdata.com/raft/動畫
這個其實已經說明的超級棒了,若是你還看不懂,我下面會用最簡單的幾個要點來進行最簡單的說明。網站
首先說明一個理論,叫作大多數理論,很簡單,舉個栗子:日誌
在etcd中的應用:blog
下面是一些選舉過程當中節點的狀態
leader 表示選舉最終產生的領導人
candidate 候選狀態,表示當前正在參與選舉
follower 表示選舉最終本身不是領導人,那本身就是從屬節點get
etcd是經過日誌複製來實現數據同步的
這個圖網上也不少,說明的是日誌複製的規則
每一個節點都有一份本身的日誌,有的節點多,有的節點少,日誌最多的確定是leader。
上圖還有幾個要點,我看別人沒提到,我就提一下:同步
raft之因此厲害由於即便出現一些特殊狀況,整個網絡在必定的時間以後也能自動恢復並正常工做。源碼
首先最多見的狀況就是一個節點出現異常,有多是這個節點的服務器掛了,或者別的什麼緣由。
還有一種異常狀況是因爲網絡致使的,網絡出現異常,致使節點之間的通訊存在異常,一部分節點與另外一部分之間沒有辦法訪問了。以下圖所示:
上面三個follower沒有辦法與下面的節點進行通訊。
總的來講,只要整個網絡中存在大多數節點正常運行,那麼etcd就是可用的,而且可以保證數據正確。當網絡恢復以後也能將數據調整到最新的狀態。 raft強大的地方在於它能自動的進行狀態的變化,自動進行選舉,而且選舉遵循必定的策略,進而保證整個網絡的正常運轉。同時保證數據的一致性。 瞭解etcd的這個原理有助於咱們後續的使用以及源碼的閱讀。