天天看點

雲原生存儲元件Etcd快速入門

2018年12月 etcd 作為孵化項目 CNCF(雲原生計算基金會),幾天前 CNCF 宣布 etcd 正式畢業,成為 CNCF 頂級項目。CNCF 官方表示 etcd 項目的采用率持續增加,也有穩定的治理流程,功能已達一定成熟度。

etcd 已經被許多公司用于實際生産,其中包括亞馬遜、百度、思科、EMC、谷歌、阿裡、華為、IBM、Red Hat、Uber、Verizon 等;而且其身影也出現在包括 Kubernetes、CoreDNS、M3、Rook 以及 TiKV 等項目當中。

前面的系列 etcd 文章已經部分介紹了 etcd。本文将會做一個快速入門的介紹,帶領大家十分鐘快速入門雲原生存儲元件 etcd,主要内容如下(本文較長,建議收藏):

  • etcd 簡介,以及其應用場景
  • etcd 的多種安裝模式及高可用運維
  • etcd v3 的架構解析
  • etcdctl 的實踐應用

1 etcd 介紹

2013 年 6 月,CoreOS 發起了 etcd 項目。etcd 使用 Go 語言實作,是分布式系統中重要的基礎元件,目前最新版本為 V3.4.9。etcd 可以用來建構高可用的分布式鍵值資料庫,根據官網介紹,總結來說有如下的特點:

  • 簡單:etcd 的安裝簡單,且為使用者提供了 HTTP API,使用者使用起來也很簡單
  • 存儲:etcd 的基本功能,資料分層存儲在檔案目錄中,類似于我們日常使用的檔案系統
  • Watch 機制:Watch 指定的鍵、字首目錄的更改,并對更改時間進行通知
  • 安全通信:SSL 證書驗證
  • 高性能:etcd 單執行個體可以支援 2k/s 讀操作,官方也有提供基準測試腳本
  • 一緻可靠:基于 Raft 共識算法,實作分布式系統資料的高可用性、一緻性
雲原生存儲元件Etcd快速入門

etcd 是一個分布式鍵值存儲資料庫,支援跨平台,擁有強大的社群。etcd 的 Raft 算法,提供了可靠的方式存儲分布式叢集涉及的資料。etcd 廣泛應用在微服務架構和 Kubernates 叢集中,不僅可以作為服務注冊與發現,還可以作為鍵值對存儲的中間件。從業務系統 Web 到 Kubernetes 叢集,都可以很友善地從 etcd 中讀取、寫入資料。

2 etcd 應用場景

etcd 在穩定性、可靠性和可伸縮性表現極佳,同時也為雲原生應用系統提供了協調機制。etcd 經常用于服務注冊與發現的場景,此外還有鍵值對存儲、消息釋出與訂閱、分布式鎖等場景。

2.1 鍵值對存儲

如下是官方對 etcd 的描述:

A highly-available key value store for shared configuration and service discovery.

一個用于配置共享和服務發現的鍵值存儲系統。

從其定義來看,etcd 是一個「鍵值存儲」的元件,存儲是 etcd 最基本的功能,其他應用場景都是建立在 etcd 的可靠存儲上。etcd 的存儲有如下特點:

  • 采用鍵值對資料存儲,讀寫性能一般高于關系型資料庫;
  • etcd 叢集分布式存儲,多節點叢集更加可靠;
  • etcd 的存儲采用類似檔案目錄的結構:
    • 葉子節點存儲資料,其他節點不存儲,這些資料相當于檔案;
    • 非葉節點一定是目錄,這些節點不能存儲資料。

比如 Kubernetes 将一些中繼資料存儲在 etcd 中,将存儲狀态資料的的複雜工作交給 etcd,Kubernetes 自身的功能和架構能夠更加專注。

2.2 服務注冊與發現

分布式環境中,業務服務多執行個體部署,這個時候涉及到服務之間調用,就不能簡單使用寫死的方式指定服務執行個體資訊。服務注冊與發現就是解決如何找到分布式叢集中的某一個服務(程序),并與之建立聯系。

服務注冊與發現涉及三個主要的角色:服務請求者、服務提供者和服務注冊中心。

雲原生存儲元件Etcd快速入門

三大支柱

服務提供者啟動的時候,在服務注冊中心進行注冊自己的服務名、主機位址、端口等資訊;服務請求者需要調用對應的服務時,一般通過服務名請求服務注冊中心,服務注冊中心傳回對應的執行個體位址和端口;服務請求者擷取到執行個體位址、端口之後,綁定對應的服務提供者,實作遠端調用。

etcd 基于 Raft 算法,能夠有力地保證分布式場景中的一緻性。各個服務啟動時注冊到 etcd 上,同時為這些服務配置鍵的 TTL 時間,定時保持服務的心跳以達到監控健康狀态的效果。通過在 etcd 指定的主題下注冊的服務也能在對應的主題下查找到。為了確定連接配接,我們可以在每個服務機器上都部署一個 Proxy 模式的 etcd,這樣就可以確定通路 etcd 叢集的服務都能夠互相連接配接。

2.3 消息釋出與訂閱

在分布式系統中,服務之間還可以通過消息通信,即消息的釋出與訂閱。通過建構一個消息中間件,服務提供者釋出對應主題的消息,而消費者則訂閱他們關心的主題,一旦對應的主題有消息釋出,即會産生訂閱事件,消息中間件就會通知該主題所有的訂閱者。

雲原生存儲元件Etcd快速入門

如微服務架構中的認證鑒權服務,Auth 服務的執行個體位址、端口和執行個體節點的狀态存放在 etcd 中,用戶端應用訂閱對應的主題,而 etcd 設定 key TTL 可以确儲存儲的服務執行個體的健康狀态。

2.4 分布式鎖

分布式系統中涉及到多個服務執行個體,存在跨程序之間資源調用,對于資源的協調配置設定,單體架構中的鎖已經無法滿足需要,需要引入分布式鎖的概念。分布式鎖可以将資源标記存儲,這裡的存儲不是單純屬于某個程序,而是公共存儲,諸如 Redis、Memcache、關系型資料庫、檔案等。

etcd 基于 Raft 算法,實作分布式叢集的一緻性,存儲到 etcd 叢集中的值必然是全局一緻的,是以基于 etcd 很容易實作分布式鎖。分布式鎖有兩種使用方式:保持獨占和控制時序。

雲原生存儲元件Etcd快速入門

保持獨占,從字面可以知道,所有擷取資源的請求,隻有一個成功。etcd 通過分布式鎖原子操作 CAS 的 API,設定 prevExist 值,進而保證在多個節點同時去建立某個目錄時,最後隻有一個成功,建立成功的請求擷取到鎖。

控制時序,有點類似于隊列緩沖,所有的請求都會被安排配置設定資源,但是獲得鎖的順序也是全局唯一的,執行按照先後的順序。etcd 提供了一套自動建立有序鍵的 API,對一個目錄的建值操作,這樣 etcd 會自動生成一個目前最大的值為鍵,并存儲該值。同時還可以使用 API 按順序列出目前目錄下的所有鍵值。

3 etcd 的多種安裝方法

etcd 的安裝非常簡單,我們在本小節實踐 etcd 單機和叢集的幾種安裝方式。

3.1 etcd 概念詞彙表

下文的安裝實踐可能會涉及到 etcd 相關的概念詞彙,是以我們首先了解下 etcd 的概念詞彙表,以便于下文的了解。

  • Raft:分布式一緻性算法;
  • Node:Raft 狀态機執行個體;
  • Member:管理着 Node 的 etcd 執行個體,為用戶端請求提供服務;
  • Cluster:etcd 叢集,由多個 Member 構成;
  • Peer:同一個 etcd 叢集中的另一個 Member;
  • Client:用戶端,向 etcd 發送 HTTP 請求;
  • WAL:持久化存儲的日志格式,預寫式日志;
  • Snapshot:etcd 資料快照,防止 WAL 檔案過多而設定的快照。

在了解了 etcd 的常用術語之後,我們下面開始介紹 etcd v3 的架構。

etcd 的安裝有多種方式,筆者以 Centos 7 和 MacOS 10.15 為例,可以通過 yum install etcd 和 brew install etcd進行安裝。

然而通過系統工具安裝的 etcd 版本比較滞後,如果需要安裝最新版本的 etcd ,我們可以通過二進制包、源碼編譯以及 docker 容器安裝。

3.2 etcd 單機安裝部署

3.2.1 二進制安裝

在 macOS 下,安裝 3.4.5,指定 etcd 版本,執行如下的腳本:

ETCD_VER=v3.4.5
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GITHUB_URL}

rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test

curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64

/tmp/etcd-download-test/etcd --version
/tmp/etcd-download-test/etcdctl version
           

執行完上面的腳本,控制台即可輸出如下的結果:

etcd Version: 3.4.5
Git SHA: c65a9e2dd
Go Version: go1.12.12
Go OS/Arch: darwin/amd64
           

根據控制台的顯示,etcd 安裝成功,版本為 etcd 3.4.5,基于的 Go 語言版本為 1.12.12。

Linux 上的操作也類似,Centos 7 系統執行的腳本可以參考 etcd 官方提供的腳本。

我們在這一小節示範了單機 etcd 在 macOS 和 Linux 上的安裝。etcd 在 Windows 系統的安裝比較簡單,下載下傳可執行檔案,其中 etcd.exe 是 etcd Server,etcdctl.exe 指令行工具。

雲原生存儲元件Etcd快速入門
3.2.2 源碼安裝

對于那些想嘗試最新版本的同學,可以從 master 分支建構 etcd。使用源碼安裝,首先需要確定本地的 Go 語言環境。如未安裝,請參考 https://golang.org/doc/install。需要 Go 版本為 1.13+,來建構最新版本的 etcd。本地的 Go 版本為:

$ go version

go version go1.14.2 darwin/amd64
           

基于 master 分支建構 etcd,腳本如下:

git clone https://github.com/etcd-io/etcd.git
cd etcd
./build
           

安裝完記得執行測試指令,確定 etcd 源碼編譯安裝成功。

繼續閱讀