徹底搞懂 etcd 系列文章(一):初識 etcd

0 專輯概述

etcd 是雲原生架構中重要的基礎組件,由 CNCF 孵化託管。etcd 在微服務和 Kubernates 集羣中不僅可以作爲服務註冊發現,還可以作爲 key-value 存儲的中間件。

《徹底搞懂 etcd 系列文章》將會從 etcd 的基本功能實踐、API 接口、實現原理、源碼分析,以及實現中的踩坑經驗等幾方面具體展開介紹 etcd。預計會有 20 篇左右的文章,筆者將會每週持續更新,歡迎關注。

1 etcd 介紹

etcd 是 CoreOS 團隊於 2013 年 6 月發起的開源項目,它的目標是構建一個高可用的分佈式鍵值(key-value)數據庫。具有以下特點:

  • 簡單:安裝配置簡單,而且提供了 HTTP API 進行交互,使用也很簡單

  • 鍵值對存儲:將數據存儲在分層組織的目錄中,如同在標準文件系統中

  • 監測變更:監測特定的鍵或目錄以進行更改,並對值的更改做出反應

  • 安全:支持 SSL 證書驗證

  • 快速:根據官方提供的 benchmark 數據,單實例支持每秒 2k+ 讀操作

  • 可靠:採用 raft 算法,實現分佈式系統數據的可用性和一致性

etcd 採用 Go 語言編寫,它具有出色的跨平臺支持,很小的二進制文件和強大的社區。etcd 機器之間的通信通過 Raft 算法處理。

etcd 是一個高度一致的分佈式鍵值存儲,它提供了一種可靠的方式來存儲需要由分佈式系統或機器集羣訪問的數據。它可以優雅地處理網絡分區期間的 leader 選舉,以應對機器的故障,即使是在 leader 節點發生故障時。

從簡單的 Web 應用程序到 Kubernetes 集羣,任何複雜的應用程序都可以從 etcd 中讀取數據或將數據寫入 etcd。

etcd 於 2018 年 12 月正式加入雲原生計算基金會(CNCF,全稱 Cloud Native Computing Foundation),並由 CNCF 支持。CNCF 是一個廠商中立的基金會、雲原生技術推廣和普及的領導者。

2 使用場景

etcd 比較多的應用場景是用於服務註冊與發現,除此之外,也可以用於鍵值對存儲,應用程序可以讀取和寫入 etcd 中的數據。

一個簡單的用例是將數據庫連接詳細信息或功能標誌存儲在 etcd 中作爲鍵值對。可以觀察這些值,使我們的應用在更改時可以重新配置自己。高級用法是利用 etcd 的一致性保證來實施數據庫 leader 選舉或在一組 follower 之間執行分佈式鎖定。

2.1 鍵值對存儲

A highly-available key value store for shared configuration and service discovery.
一個用於配置共享和服務發現的鍵值存儲系統。

歸根結底,etcd 是一個鍵值存儲的組件,其他的應用都是基於其鍵值存儲的功能展開。etcd 的存儲有如下特點:

  • 採用kv型數據存儲,一般情況下比關係型數據庫快。

  • 支持動態存儲(內存)以及靜態存儲(磁盤)。

  • 分佈式存儲,可集成爲多節點集羣。

  • 存儲方式,採用類似目錄結構。

    • 只有葉子節點才能真正存儲數據,相當於文件。

    • 葉子節點的父節點一定是目錄,目錄不能存儲數據。

etcd leader 的延遲是要跟蹤的最重要的指標,並且內置儀表板具有專用於此的視圖。在我們的測試中,嚴重的延遲會在羣集內造成不穩定,因爲 Raft 的速度僅與大多數機器中最慢的機器一樣快。我們可以通過適當地調整羣集來緩解此問題。etcd 已在具有高度可變網絡的雲提供商上進行了預調。

2.2 服務註冊與發現

服務註冊與發現(Service Discovery)要解決的是分佈式系統中最常見的問題之一,即在同一個分佈式集羣中的進程或服務如何才能找到對方並建立連接。從本質上說,服務發現就是要了解集羣中是否有進程在監聽 UDP 或者 TCP 端口,並且通過名字就可以進行查找和鏈接。

要解決服務發現的問題,需要下面三大支柱,缺一不可。

  • 強一致性、高可用的服務存儲目錄。
    基於 Raft 算法的 etcd 天生就是這樣一個強一致性、高可用的服務存儲目錄。

  • 一種註冊服務和服務健康狀況的機制。
    用戶可以在 etcd 中註冊服務,並且對註冊的服務配置 key TTL,定時保持服務的心跳以達到監控健康狀態的效果。

  • 一種查找和連接服務的機制。通過在 etcd 指定的主題下注冊的服務也能在對應的主題下查找到。爲了確保連接,我們可以在每個服務機器上都部署一個 Proxy 模式的 etcd,這樣就可以確保訪問 etcd 集羣的服務都能夠互相連接。

etcd2 中引入的 etcd/raft 庫,是目前最穩定、功能豐富的開源一致性協議之一。作爲 etcd、TiKV、CockcorachDB、Dgraph 等知名分佈式數據庫的核心數據複製引擎,etcd/raft 驅動了超過十萬個集羣,是被最爲廣泛採用一致性協議實現之一。etcd3 中引入的多版本控制、事務等功能,大大的簡化了分佈式應用的開發流程,提高了效率和穩定性。經過 5 年的演進,etcd 也已經成爲了各種容器編排系統的默認存儲選項。Kubernetes 是流行的容器平臺,運行在任何環境的 Kubernetes 集羣都依賴 etcd 來提供穩定而可靠的存儲服務。

2.3 消息發佈與訂閱

在分佈式系統中,最適用的一種組件間通信方式就是消息發佈與訂閱。即構建一個配置共享中心,數據提供者在這個配置中心發佈消息,而消息使用者則訂閱他們關心的主題,一旦主題有消息發佈,就會實時通知訂閱者。通過這種方式可以做到分佈式系統配置的集中式管理與動態更新。


應用中用到的一些配置信息放到etcd上進行集中管理。這類場景的使用方式通常是這樣:應用在啓動的時候主動從etcd獲取一次配置信息,同時,在etcd節點上註冊一個Watcher並等待,以後每次配置有更新的時候,etcd都會實時通知訂閱者,以此達到獲取最新配置信息的目的。

分佈式搜索服務中,索引的元信息和服務器集羣機器的節點狀態存放在etcd中,供各個客戶端訂閱使用。使用etcd的key TTL功能可以確保機器狀態是實時更新的。

分佈式日誌收集系統。這個系統的核心工作是收集分佈在不同機器的日誌。收集器通常是按照應用(或主題)來分配收集任務單元,因此可以在etcd上創建一個以應用(主題)命名的目錄P,並將這個應用(主題相關)的所有機器ip,以子目錄的形式存儲到目錄P上,然後設置一個 etcd 遞歸的Watcher,遞歸式的監控應用(主題)目錄下所有信息的變動。這樣就實現了機器IP(消息)變動的時候,能夠實時通知到收集器調整任務分配。

系統中信息需要動態自動獲取與人工干預修改信息請求內容的情況。通常是暴露出接口,例如JMX接口,來獲取一些運行時的信息。引入etcd之後,就不用自己實現一套方案了,只要將這些信息存放到指定的etcd目錄中即可,etcd的這些目錄就可以通過HTTP的接口在外部訪問。

2.4 分佈式通知與協調

這裏說到的分佈式通知與協調,與消息發佈和訂閱有些相似。在分佈式系統中,最適用的一種組件間通信方式就是消息發佈與訂閱。即構建一個配置共享中心,數據提供者在這個配置中心發佈消息,而消息使用者則訂閱他們關心的主題,一旦主題有消息發佈,就會實時通知訂閱者。通過這種方式可以做到分佈式系統配置的集中式管理與動態更新。

這裏用到了etcd中的Watcher機制,通過註冊與異步通知機制,實現分佈式環境下不同系統之間的通知與協調,從而對數據變更做到實時處理。實現方式通常是這樣:不同系統都在etcd上對同一個目錄進行註冊,同時設置Watcher觀測該目錄的變化(如果對子目錄的變化也有需要,可以設置遞歸模式),當某個系統更新了etcd的目錄,那麼設置了Watcher的系統就會收到通知,並作出相應處理。

通過etcd進行低耦合的心跳檢測。檢測系統和被檢測系統通過etcd上某個目錄關聯而非直接關聯起來,這樣可以大大減少系統的耦合性。

通過etcd完成系統調度。某系統有控制檯和推送系統兩部分組成,控制檯的職責是控制推送系統進行相應的推送工作。管理人員在控制檯作的一些操作,實際上是修改了etcd上某些目錄節點的狀態,而etcd就把這些變化通知給註冊了Watcher的推送系統客戶端,推送系統再作出相應的推送任務。

通過etcd完成工作彙報。大部分類似的任務分發系統,子任務啓動後,到etcd來註冊一個臨時工作目錄,並且定時將自己的進度進行彙報(將進度寫入到這個臨時目錄),這樣任務管理者就能夠實時知道任務進度。

2.5 分佈式鎖

當在分佈式系統中,數據只有一份(或有限制),此時需要利用鎖的技術控制某一時刻修改數據的進程數。與單機模式下的鎖不僅需要保證進程可見,分佈式環境下還需要考慮進程與鎖之間的網絡問題。

分佈式鎖可以將標記存在內存,只是該內存不是某個進程分配的內存而是公共內存如 Redis、Memcache。至於利用數據庫、文件等做鎖與單機的實現是一樣的,只要保證標記能互斥就行。

因爲etcd使用Raft算法保持了數據的強一致性,某次操作存儲到集羣中的值必然是全局一致的,所以很容易實現分佈式鎖。鎖服務有兩種使用方式,一是保持獨佔,二是控制時序。

保持獨佔即所有獲取鎖的用戶最終只有一個可以得到。etcd爲此提供了一套實現分佈式鎖原子操作CAS(CompareAndSwap)的API。通過設置prevExist值,可以保證在多個節點同時去創建某個目錄時,只有一個成功。而創建成功的用戶就可以認爲是獲得了鎖。

控制時序,即所有想要獲得鎖的用戶都會被安排執行,但是獲得鎖的順序也是全局唯一的,同時決定了執行順序。etcd爲此也提供了一套API(自動創建有序鍵),對一個目錄建值時指定爲POST動作,這樣etcd會自動在目錄下生成一個當前最大的值爲鍵,存儲這個新的值(客戶端編號)。同時還可以使用API按順序列出所有當前目錄下的鍵值。此時這些鍵的值就是客戶端的時序,而這些鍵中存儲的值可以是代表客戶端的編號。

3. 小結

本章主要介紹了 etcd 的相關概念,以及 etcd 主要的使用場景。etcd 在分佈式環境中是一個利器,在一致性存儲方面有廣泛的應用。下一篇將會具體介紹 etcd 的安裝以及使用的實踐。

訂閱最新文章,歡迎關注我的公衆號

微信公衆號

優質圖書推薦

歡迎購買筆者的圖書,現已出版上市:

原創不易,希望大家多多支持,期待與各位的交流學習。

參考

https://etcd.io/docs/v3.4.0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章