etcd
是一個高可用的分佈式 key-value(鍵值) 存儲系統。在暴漫咱們用他用來作配置管理和服務發現。html
這一次咱們主要介紹關於 etcd 集羣的搭建與管理。node
首先咱們須要理解,etcd
是一個分佈式的 key-value 存儲系統,因此其基本原理和前面咱們介紹過的
分佈式數據庫相關理論 是一致的。數據庫
值得注意的是,爲了方便使用,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 |
這裏說的搭建指「從無到有」搭建。關於在已有集羣中添加減小集羣節點,屬於下面"第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 |
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
集羣之後,你就不在須要這個參數或環境變量了。
不少時候,你只知道你要搭建一個多大(包含多少節點)的集羣,可是並不能事先知道這幾個節點的 ip,從而沒法使用 -initial-cluster
參數。
這個時候,你就須要使用 discovery
的方式來搭建 etcd
集羣。discovery 方式有兩種:etcd discovery
和 DNS discovery
。
這裏咱們先介紹下 etcd discovery
方式,etcd discovery
有兩種:自定義的 etcd discovery
和 公共 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
若是沒有已有的 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
節點。
這個方式沒有實踐,並且對於通常團隊實用性也不高,因此就不作分享了。
到這裏爲止,咱們已經有一個3節點的 etcd
集羣了,下一篇博客我會介紹如何進行 etcd
集羣的管理
--
更多文章歡迎關注自由風暴博客