搭建 etcd 集羣 - 暴走漫畫容器實踐系列 Part3

etcd 是一個高可用的分佈式 key-value(鍵值) 存儲系統。在暴漫咱們用他用來作配置管理和服務發現。html

這一次咱們主要介紹關於 etcd 集羣的搭建與管理。node

1. etcd 集羣概述

首先咱們須要理解,etcd 是一個分佈式的 key-value 存儲系統,因此其基本原理和前面咱們介紹過的
分佈式數據庫相關理論 是一致的。數據庫

兩種不一樣的 node(節點)

值得注意的是,爲了方便使用,etcd 引入了 proxy 的概念,因此 etcd 的節點分爲兩種:集羣節點代理節點curl

集羣節點代理節點 在使用上幾乎沒有任何區別。這使得咱們能夠在每臺機器上都安裝 etcd,進而把 etcd 看成本地服務來使用(經過 0.0.0.0)。
他們的區別在於:內部原理不一樣。
集羣節點是真正的 etcd 集羣的構成者,這些節點負責數據存取,集羣管理等等。
代理節點能夠理解爲一個反向代理,它只是簡單的接受請求,轉發請求給 etcd 集羣。分佈式

集羣大小與容錯

集羣的大小指集羣節點的個數。根據 etcd 的分佈式數據冗餘策略,集羣節點越多,容錯能力(Failure Tolerance)越強,同時寫性能也會越差。
因此關於集羣大小的優化,其實就是容錯和寫性能的一個平衡。性能

另外, etcd 推薦使用 奇數 做爲集羣節點個數。由於奇數個節點與和其配對的偶數個節點相比(好比 3節點和4節點對比),
容錯能力相同,卻能夠少一個節點。優化

因此綜合考慮性能和容錯能力,etcd 官方文檔推薦的 etcd 集羣大小是 3, 5, 7。至於到底選擇 3,5 仍是 7,根據須要的容錯能力而定。url

關於節點數和容錯能力對應關係,以下表所示:命令行

集羣大小 最大容錯
1 0
3 1
4 1
5 2
6 2
7 3
8 3
9 4

2. etcd 集羣的搭建(初始化一個 etcd 集羣)

這裏說的搭建指「從無到有」搭建。關於在已有集羣中添加減小集羣節點,屬於下面"第3節:etcd 集羣的管理"的內容。3d

etcd 集羣的搭建有三種方式,包括:static 方式,etcd discovery 方式 和 DNS discovery。

這裏,咱們以一個例子來說解 etcd 集羣各類方式的搭建。假設咱們須要搭建一個3節點的 etcd 集羣。這三個節點的 name(咱們須要給每一個節點取個名字)和 ip 分別是:

name ip
etcd0 10.0.0.10
etcd1 10.0.0.11
etcd2 10.0.0.12

2.1 static 方式

static 方式是最簡單的一種搭建 etcd 的方式。
不像其餘兩種方式, static 方式不須要任何額外的服務,只須要你知道你準備用來運行 etcd 的全部節點(的name和ip)。

本例中,咱們來看看如何在3個節點上構建 etcd 集羣。

首先咱們須要構造一個描述集羣全部節點的參數,這個參數能夠以命令行參數的方式傳給 etcd 程序,也能夠以環境變量的方式

若是用命令行參數,應該將下列參數附在 etcd 的啓動命令後面:

-initial-cluster etcd0=http://10.0.1.10:2380,etcd1=http://10.0.1.11:2380,etcd2=http://10.0.1.12:2380 \
  -initial-cluster-state new

其中 -initial-cluster-state new 表示這是在從無到有搭建 etcd 集羣。
-initial-cluster 參數描述了這個新集羣中總共有哪些節點,其中每一個節點用 name=ip的形式描述,節點之間用,分隔。

若是用環境變量,應該在啓動 etcd 時,加入以下環境變量:

ETCD_INITIAL_CLUSTER="etcd0=http://10.0.1.10:2380,etcd1=http://10.0.1.11:2380,etcd2=http://10.0.1.12:2380"
ETCD_INITIAL_CLUSTER_STATE=new

ETCD_INITIAL_CLUSTER 變量和 -initial-cluster 做用相同,
ETCD_INITIAL_CLUSTER_STATE 變量和 -initial-cluster-state 做用相同。

接着,分別在3個節點上啓動 etcd,以命令行參數方式啓動爲例:

$ etcd -name etcd0 -initial-advertise-peer-urls http://10.0.1.10:2380 \
  -listen-peer-urls http://10.0.1.10:2380 \
  -listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
  -advertise-client-urls http://10.0.1.10:2379 \
  -initial-cluster-token my-etcd-cluster \
  -initial-cluster etcd0=http://10.0.1.10:2380,etcd1=http://10.0.1.11:2380,etcd2=http://10.0.1.12:2380 \
  -initial-cluster-state new
$ etcd -name etcd1 -initial-advertise-peer-urls http://10.0.1.11:2380 \
  -listen-peer-urls http://10.0.1.11:2380 \
  -listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
  -advertise-client-urls http://10.0.1.11:2379 \
  -initial-cluster-token my-etcd-cluster \
  -initial-cluster etcd0=http://10.0.1.10:2380,etcd1=http://10.0.1.11:2380,etcd2=http://10.0.1.12:2380 \
  -initial-cluster-state new
$ etcd -name etcd2 -initial-advertise-peer-urls http://10.0.1.12:2380 \
  -listen-peer-urls http://10.0.1.12:2380 \
  -listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \
  -advertise-client-urls http://10.0.1.12:2379 \
  -initial-cluster-token my-etcd-cluster \
  -initial-cluster etcd0=http://10.0.1.10:2380,etcd1=http://10.0.1.11:2380,etcd2=http://10.0.1.12:2380 \
  -initial-cluster-state new

注意

值得注意的是,不管是 -initial-cluster參數,仍是對應的環境變量,只有在第一次啓動 etcd 的時候才起做用。
以後若是重啓 etcd,這個參數或環境變量會被自動忽略。因此當成功初始化了一個 etcd 集羣之後,你就不在須要這個參數或環境變量了。

2.2 etcd discovery 方式

不少時候,你只知道你要搭建一個多大(包含多少節點)的集羣,可是並不能事先知道這幾個節點的 ip,從而沒法使用 -initial-cluster 參數。
這個時候,你就須要使用 discovery 的方式來搭建 etcd 集羣。discovery 方式有兩種:etcd discoveryDNS discovery

這裏咱們先介紹下 etcd discovery 方式,etcd discovery 有兩種:自定義的 etcd discovery公共 etcd discovery

2.2.1 自定義的 etcd discovery 服務

這種方式就是利用一個已有的 etcd 集羣來提供 discovery 服務,從而搭建一個新的 etcd 集羣。

假設已有的 etcd 集羣的一個訪問地址是:myetcd.local,那麼咱們首先須要在已有 etcd 中建立一個特殊的 key,方法以下:

$ curl -X PUT https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3

其中 value=3 表示本集羣的大小,即: 有多少集羣節點。而 6c007a14875d53d9bf0ef5a6fc0257c817f0fb83 就是用來作 discovery 的 token。

接下來你在 3 個節點上分別啓動 etcd 程序,並加上剛剛的 token。
加 token 的方式一樣也有 命令行參數環境變量 兩種。

命令行參數:

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

環境變量

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

命令行參數啓動方式爲例:

$ etcd -name etcd0 -initial-advertise-peer-urls http://10.0.1.10:2380 \
  -listen-peer-urls http://10.0.1.10:2380 \
  -listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
  -advertise-client-urls http://10.0.1.10:2379 \
  -discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
$ etcd -name etcd1 -initial-advertise-peer-urls http://10.0.1.11:2380 \
  -listen-peer-urls http://10.0.1.11:2380 \
  -listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
  -advertise-client-urls http://10.0.1.11:2379 \
  -discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
$ etcd -name etcd2 -initial-advertise-peer-urls http://10.0.1.12:2380 \
  -listen-peer-urls http://10.0.1.12:2380 \
  -listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \
  -advertise-client-urls http://10.0.1.12:2379 \
  -discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83

2.2.2 公共 etcd discovery 服務

若是沒有已有的 etcd 集羣,也能夠用 etcd 提供的公共服務: discovery.etcd.io
步驟和 2.2.1 節基本一致。

你得先建立一個用於 discovery 的 token,建立方式以下:

$ curl https://discovery.etcd.io/new?size=3

返回:

https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de

返回值做爲啓動節點時的 -discovery 參數或者 ETCD_DISCOVERY環境變量的值。

環境變量啓動方式爲例:

$ ETCD_DISCOVERY=https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de \
etcd -name etcd0 -initial-advertise-peer-urls http://10.0.1.10:2380 \
  -listen-peer-urls http://10.0.1.10:2380 \
  -listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
  -advertise-client-urls http://10.0.1.10:2379 \
  -discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
$ ETCD_DISCOVERY=https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de \
etcd -name etcd1 -initial-advertise-peer-urls http://10.0.1.11:2380 \
  -listen-peer-urls http://10.0.1.11:2380 \
  -listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
  -advertise-client-urls http://10.0.1.11:2379 \
  -discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
$ ETCD_DISCOVERY=https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de \
etcd -name etcd2 -initial-advertise-peer-urls http://10.0.1.12:2380 \
  -listen-peer-urls http://10.0.1.12:2380 \
  -listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \
  -advertise-client-urls http://10.0.1.12:2379 \
  -discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de

2.2.3 注意點

值得注意的是:若是實際啓動的 etcd 節點個數大於 discovery token建立時指定的size
多餘的節點會自動變爲 proxy 節點。

2.3 DNS discovery 方式

這個方式沒有實踐,並且對於通常團隊實用性也不高,因此就不作分享了。

2.4 後續

到這裏爲止,咱們已經有一個3節點的 etcd 集羣了,下一篇博客我會介紹如何進行 etcd 集羣的管理

--

更多文章歡迎關注自由風暴博客

相關文章
相關標籤/搜索