Etcd是CoreOS團隊於2013年6月基於Go語言發起的開源項目,它的目標是構建一個高可用強一致性的服務發現存儲的分佈式鍵值(key-value)數據庫。主要用途是共享配置和服務發現。Etcd已經在很多分佈式系統中得到廣泛的使用。
一、Etcd的提點有以下四點:
- 簡單:基於HTTP+JSON的API讓你用curl就可以輕鬆使用。
- 安全:可選SSL客戶認證機制。
- 快速:每個實例每秒支持一千次寫操作。
- 可信:使用Raft算法充分實現了分佈式。
二、Etcd的應用場景:
服務在分佈式系統中“服務發現”也是比較常見的問題:在同一個集群環境中不同的應用或服務,如何能夠找到對方並建立連接,來完成後續的行為。本質上來說,服務發現就是想要知道集群中是否有進程在監聽udp或tcp端口,並能通過名字就可以查找和連接。而要解決服務發現的問題,需要滿足如下三個方面,缺一不可。
- 強一致性、高可用的服務存儲目錄: 基於Raft算法的etcd天生就是這樣一個強一致性高可用的服務存儲目錄【安全的記錄集群中的應用或服務的信息(地址、端口等)】。
- 註冊服務和監控服務健康狀態的機制:用戶可以在etcd中註冊服務,並且對註冊的服務設置key TTL,定時保持服務的心跳以達到監控健康狀態的效果。【能夠完成新的應用或服務的註冊添加進來,同樣也能對現有的服務是否可用進行監控】
- 查找和連接服務的機制: 通過在etcd指定的主題下注冊的服務也能在對應的主題下查找到。為了確保連接,我們可以在每個服務機器上都部署一個Proxy模式的etcd,這樣就可以確保能訪問etcd集群的服務都能互相連接。【已有的服務當被使用能夠被找到並能連接】
如圖所示:
微服務協同工作架構中,服務動態添加。隨著Docker容器的流行,多種微服務共同協作,構成一個相對功能強大的架構的案例越來越多。透明化的動態添加這些服務的需求也日益強烈。通過服務發現機制,在etcd中註冊某個服務名字的目錄,在該目錄下存儲可用的服務節點的IP。在使用服務的過程中,只要從服務目錄下查找可用的服務節點去使用即可。
其他應用場景:
- 消息發佈與定義(非高頻)
- 分佈式鎖
- 分佈式消息隊列
- 分佈式進程心跳監控
三、Etcd主要分為四個部分:
通常,一個用戶的請求發送過來,會經由HTTP Server轉發給Store進行具體的事務處理,如果涉及到節點的修改,則交給Raft模塊進行狀態的變更、日誌的記錄,然後再同步給別的etcd節點以確認數據提交,最後進行數據的提交,再次同步。
四、Etcd原理:
Etcd群集是一個分佈式系統,由多個節點相互通信且構成一個整體對外提供服務,每一個節點存儲了完整的數據,並且通過Raft協議保證每節點維護的數據是一致的。
每一個Etcd節點都維護了一個狀態機,並且。任意時刻最多存在一個有效的主節點。主節點處理所有來自客戶端的寫操作,通過Raft協議保證寫操作對狀態機的修改都會可靠的同步到其他節點。
閱讀更多 DoDo在線 的文章