《蹲坑學kubernetes》之8-1:Etcd架構詳解

Etcd是CoreOS團隊於2013年6月基於Go語言發起的開源項目,它的目標是構建一個高可用強一致性的服務發現存儲的分佈式鍵值(key-value)數據庫。主要用途是共享配置和服務發現。Etcd已經在很多分佈式系統中得到廣泛的使用。

《蹲坑學kubernetes》之8-1:Etcd架構詳解

圖1:Kubernetes之Log

一、Etcd的提點有以下四點:

  • 簡單:基於HTTP+JSON的API讓你用curl就可以輕鬆使用。
  • 安全:可選SSL客戶認證機制。
  • 快速:每個實例每秒支持一千次寫操作。
  • 可信:使用Raft算法充分實現了分佈式。

二、Etcd的應用場景:

服務在分佈式系統中“服務發現”也是比較常見的問題:在同一個集群環境中不同的應用或服務,如何能夠找到對方並建立連接,來完成後續的行為。本質上來說,服務發現就是想要知道集群中是否有進程在監聽udp或tcp端口,並能通過名字就可以查找和連接。而要解決服務發現的問題,需要滿足如下三個方面,缺一不可。

  • 強一致性、高可用的服務存儲目錄: 基於Raft算法的etcd天生就是這樣一個強一致性高可用的服務存儲目錄【安全的記錄集群中的應用或服務的信息(地址、端口等)】。
  • 註冊服務和監控服務健康狀態的機制:用戶可以在etcd中註冊服務,並且對註冊的服務設置key TTL,定時保持服務的心跳以達到監控健康狀態的效果。【能夠完成新的應用或服務的註冊添加進來,同樣也能對現有的服務是否可用進行監控】
  • 查找和連接服務的機制: 通過在etcd指定的主題下注冊的服務也能在對應的主題下查找到。為了確保連接,我們可以在每個服務機器上都部署一個Proxy模式的etcd,這樣就可以確保能訪問etcd集群的服務都能互相連接。【已有的服務當被使用能夠被找到並能連接】

如圖所示:

《蹲坑學kubernetes》之8-1:Etcd架構詳解

圖2:服務發現

微服務協同工作架構中,服務動態添加。隨著Docker容器的流行,多種微服務共同協作,構成一個相對功能強大的架構的案例越來越多。透明化的動態添加這些服務的需求也日益強烈。通過服務發現機制,在etcd中註冊某個服務名字的目錄,在該目錄下存儲可用的服務節點的IP。在使用服務的過程中,只要從服務目錄下查找可用的服務節點去使用即可。

《蹲坑學kubernetes》之8-1:Etcd架構詳解

圖3:微服務結構圖

其他應用場景:

  • 消息發佈與定義(非高頻)
  • 分佈式鎖
  • 分佈式消息隊列
  • 分佈式進程心跳監控

三、Etcd主要分為四個部分:

《蹲坑學kubernetes》之8-1:Etcd架構詳解

圖4:Etcd結構圖

  • HTTP Server:用於處理用戶發送的API請求以及其它etcd節點的同步與心跳信息請求。
  • Store:用於處理etcd支持的各類功能的事務,包括數據索引、節點狀態變更、監控與反饋、事件處理與執行等等,是etcd對用戶提供的大多數API功能的具體實現。
  • Raft:Raft強一致性算法的具體實現,是etcd的核心。
  • WAL:Write Ahead Log(預寫式日誌):是etcd的數據存儲方式。除了在內存中存有所有數據的狀態以及節點的索引以外,etcd就通過WAL進行持久化存儲。WAL中,所有的數據提交前都會事先記錄日誌。Snapshot是為了防止數據過多而進行的狀態快照;Entry表示存儲的具體日誌內容。
  • 通常,一個用戶的請求發送過來,會經由HTTP Server轉發給Store進行具體的事務處理,如果涉及到節點的修改,則交給Raft模塊進行狀態的變更、日誌的記錄,然後再同步給別的etcd節點以確認數據提交,最後進行數據的提交,再次同步。

    四、Etcd原理:

    Etcd群集是一個分佈式系統,由多個節點相互通信且構成一個整體對外提供服務,每一個節點存儲了完整的數據,並且通過Raft協議保證每節點維護的數據是一致的。

    《蹲坑學kubernetes》之8-1:Etcd架構詳解

    圖5:Etcd原理

    每一個Etcd節點都維護了一個狀態機,並且。任意時刻最多存在一個有效的主節點。主節點處理所有來自客戶端的寫操作,通過Raft協議保證寫操作對狀態機的修改都會可靠的同步到其他節點。



    分享到:


    相關文章: