用一些圖示結合場景和文字輕鬆瞭解etcd,文章是針對etcd初學者的,目的是讓你們瞭解etcd是什麼、主要在什麼場景下使用、etcd集羣是怎麼工做的以及建立集羣時應該如何選擇集羣的節點數。算法
etcd 是一個高可用強一致性的鍵值倉庫在不少分佈式系統架構中獲得了普遍的應用,其最經典的使用場景就是服務發現。安全
做爲一個受到 ZooKeeper啓發而催生的項目,它除了擁有與之相似的功能外,更專一於如下四點。架構
etcd 的場景默認處理的數據都是系統中的控制數據。因此etcd在系統中的角色不是其餘NoSQL產品的替代品,更不能做爲應用的主要數據存儲。etcd中應該儘可能只存儲系統中服務的配置信息,對於應用數據只推薦把數據量很小,可是更新和訪問頻次都很高的數據存儲在etcd中。curl
服務發現要解決的是分佈式系統中最多見的問題之一,即在同一個分佈式集羣中的進程或服務,要如何才能找到對方並創建鏈接。本質上來講,服務發現就是想要了解集羣中是否有進程在監聽 udp 或 tcp 端口,而且經過名字就能夠查找和鏈接。要解決服務發現的問題,須要有下面三大支柱,缺一不可。tcp
一個強一致性、高可用的服務存儲目錄。基於 Raft 算法的 etcd 就是一個強一致性高可用的服務存儲目錄。分佈式
一種註冊服務和監控服務健康狀態的機制。用戶能夠在 etcd 中註冊服務,而且對註冊的服務設置 key TTL
,定時保持服務的心跳以達到監控健康狀態的效果。url
一種查找和鏈接服務的機制。經過在 etcd 指定的主題(由服務名稱構成的服務目錄)下注冊的服務也能在對應的主題下查找到。3d
從 etcd 的架構圖中咱們能夠看到,etcd 主要分爲四個部分。日誌
一般,一個用戶的請求發送過來,會經由 HTTP Server 轉發給 Store 進行具體的事務處理,若是涉及到節點的修改,則交給 Raft 模塊進行狀態的變動、日誌的記錄,而後再同步給別的 etcd 節點以確認數據提交,最後進行數據的提交,再次同步。code
爲了保證數據的強一致性,etcd集羣中全部的數據流向都是一個方向,從 Leader (主節點)流向 Follower,也就是全部 Follower 的數據必須與 Leader 保持一致,若是不一致會被覆蓋。
簡單點說就是,用戶能夠對etcd集羣中的全部節點進行讀寫,讀取很是簡單由於每一個節點保存的數據是強一致的。對於寫入來講,etcd集羣中的節點會選舉出Leader節點,若是寫入請求來自Leader節點便可直接寫入而後Leader節點會把寫入分發給全部Follower,若是寫入請求來自其餘Follower節點那麼寫入請求會給轉發給Leader節點,由Leader節點寫入以後再分發給集羣上的全部其餘節點。
下面的圖示中一、3節點都有寫入請求,節點1爲Leader因此3的寫入請求會轉發給1,寫入完成後再同步給全部節點。
假設集羣中有三個節點,集羣啓動之初節點中並無被選舉出的Leader。
Raft算法使用隨機Timer來初始化Leader選舉流程。好比說在上面三個節點上都運行了Timer(每一個Timer的持續時間是隨機的),第一個節點率先完成了Timer,隨後它就會向其餘兩個節點發送成爲Leader的請求,其餘節點接收到請求後會以投票迴應而後第一個節點被選舉爲Leader。
成爲Leader後,該節點會以固定時間間隔向其餘節點發送通知,確保本身還是Leader。有些狀況下當Follower們收不到Leader的通知後,好比說Leader節點宕機或者失去了鏈接,其餘節點會重複以前選舉過程選舉出新的Leader。
etcd認爲寫入請求被Leader節點處理並分發給了多數節點後,就是一個成功的寫入。如何界定多數節點呢?很簡單,假設總結點數是N,那麼多數節點 Majority=N/2+1
,不過在etcd中使用的術語是 Quorum
而不是 Majority
。因此界定多數節點的公式是 Quorum=N/2+1
。
關於如何肯定etcd集羣應該有多少個節點的問題,上圖的左側的圖表給出了集羣中節點總數(Instances)對應的Quorum數量,用Instances減去Quorom就是集羣中容錯節點(容許出故障的節點)的數量。
因此在集羣中推薦的最少節點數量是3個,由於1和2個節點的容錯節點數都是0,一旦有一個節點宕掉整個集羣就不能正常工做了。
當決定集羣中節點的數量時,強烈推薦奇數數量的節點,好比下圖表中高亮的那幾個選項。
具體來講,6個節點的集羣它的容錯能力並無比5個節點的好,他們的容錯節點數同樣,一旦容錯節點超過2後,因爲Quorum節點數小於4整個集羣也變爲不可用的狀態了。
因此在決定集羣中的節點數時,奇數要優於偶數。
因爲etcd以前接觸的很少網上成體系資料也比較少一開始理解起來有些困難,最近看了很多文章同時偶然在Youtube上發現了一個介紹etcd入門的視頻,以爲很好。文中的圖片大部分都是來自視頻的截圖,推薦能訪問油管的同窗都去看看,比看我這裏的文章更易懂。若是英語聽力不太好的同窗能夠先看看個人文章再去油管上看視頻。