天天看點

ETCD系列之二:部署叢集

1. 概述

想必很多人都知道ZooKeeper,通常用作配置共享和服務發現。和它類似,ETCD算是一個非常優秀的後起之秀了。本文重點不在描述他們之間的不同點。首先,看看其官網關于ETCD的描述[1]:

A distributed, reliable key-value store for the most critical data of a distributed system.

在雲計算大行其道的今天,ETCD有很多典型的使用場景。常言道,熟悉一個系統先從部署開始。本文接下來将描述,如何部署ETCD叢集。

安裝官網說明文檔,提供了3種叢集啟動方式,實際上按照其實作原理分為2類:

  • 通過靜态配置方式啟動
  • 通過服務發現方式啟動

在部署叢集之前,我們需要考慮叢集需要配置多少個節點。這是一個重要的考量,不得忽略。

2. 叢集節點數量與網絡分割

ETCD使用RAFT協定保證各個節點之間的狀态一緻。根據RAFT算法原理,節點數目越多,會降低叢集的寫性能。這是因為每一次寫操作,需要叢集中大多數節點将日志落盤成功後,Leader節點才能将修改内部狀态機,并傳回将結果傳回給用戶端。

也就是說在等同配置下,節點數越少,叢集性能越好。顯然,隻部署1個節點是沒什麼意義的。通常,按照需求将叢集節點部署為3,5,7,9個節點。

這裡能選擇偶數個節點嗎? 最好不要這樣。原因有二:

  • 偶數個節點叢集不可用風險更高,表現在選主過程中,有較大機率或等額選票,進而觸發下一輪選舉。
  • 偶數個節點叢集在某些網絡分割的場景下無法正常工作。試想,當網絡分割發生後,将叢集節點對半分割開。此時叢集将無法工作。按照RAFT協定,此時叢集寫操作無法使得大多數節點同意,進而導緻寫失敗,叢集無法正常工作。

當網絡分割後,ETCD叢集如何處理的呢?

  • 當叢集的Leader在多數節點這一側時,叢集仍可以正常工作。少數節點那一側無法收到Leader心跳,也無法完成選舉。
  • 當叢集的Leader在少數節點這一側時,叢集仍可以正常工作,多數派的節點能夠選出新的Leader, 叢集服務正常進行。

當網絡分割恢複後,少數派的節點會接受叢集Leader的日志,直到和其他節點狀态一緻。

3. ETCD參數說明

這裡隻列舉一些重要的參數,以及其用途。

  • —data-dir 指定節點的資料存儲目錄,這些資料包括節點ID,叢集ID,叢集初始化配置,Snapshot檔案,若未指定—wal-dir,還會存儲WAL檔案;
  • —wal-dir 指定節點的was檔案的存儲目錄,若指定了該參數,wal檔案會和其他資料檔案分開存儲。
  • —name 節點名稱
  • —initial-advertise-peer-urls 告知叢集其他節點url.
  • — listen-peer-urls 監聽URL,用于與其他節點通訊
  • — advertise-client-urls 告知用戶端url, 也就是服務的url
  • — initial-cluster-token 叢集的ID
  • — initial-cluster 叢集中所有節點

4. 通過靜态配置方式啟動ETCD叢集

按照官網中的文檔,即可完成叢集啟動。這裡略。

5. 通過服務發現方式啟動ETCD叢集

ETCD還提供了另外一種啟動方式,即通過服務發現的方式啟動。這種啟動方式,依賴另外一個ETCD叢集,在該叢集中建立一個目錄,并在該目錄中建立一個

_config

的子目錄,并且在該子目錄中增加一個

size

節點,指定叢集的節點數目。

在這種情況下,将該目錄在ETCD中的URL作為節點的啟動參數,即可完成叢集啟動。使用

--discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83

 配置項取代靜态配置方式中的

--initial-cluster

 和

inital-cluster-state

參數。其中

https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83

是在依賴etcd中建立好的目錄url。

6. 節點遷移

在生産環境中,不可避免遇到機器硬體故障。當遇到硬體故障發生的時候,我們需要快速恢複節點。ETCD叢集可以做到在不丢失資料的,并且不改變節點ID的情況下,遷移節點。

具體辦法是:

  • 1)停止待遷移節點上的etc程序;
  • 2)将資料目錄打包複制到新的節點;
  • 3)更新該節點對應叢集中peer url,讓其指向新的節點;
  • 4)使用相同的配置,在新的節點上啟動etcd程序;