摘要:如果用命令行參數(shù),應(yīng)該將下列參數(shù)附在的啟動命令后面其中表示這是在從無到有搭建集群。命令行參數(shù)環(huán)境變量以命令行參數(shù)啟動方式為例公共服務(wù)如果沒有已有的集群,也可以用提供的公共服務(wù)。
etcd 是一個高可用的分布式 key-value(鍵值) 存儲系統(tǒng)。在暴漫我們用他用來做配置管理和服務(wù)發(fā)現(xiàn)。
這一次我們主要介紹關(guān)于 etcd 集群的搭建與管理。
1. etcd 集群概述首先我們需要理解,etcd 是一個分布式的 key-value 存儲系統(tǒng),所以其基本原理和前面我們介紹過的
分布式數(shù)據(jù)庫相關(guān)理論 是一致的。
值得注意的是,為了方便使用,etcd 引入了 proxy 的概念,所以 etcd 的節(jié)點(diǎn)分為兩種:集群節(jié)點(diǎn)和代理節(jié)點(diǎn)。
集群節(jié)點(diǎn) 和 代理節(jié)點(diǎn) 在使用上幾乎沒有任何區(qū)別。這使得我們可以在每臺機(jī)器上都安裝 etcd,進(jìn)而把 etcd 當(dāng)作本地服務(wù)來使用(通過 0.0.0.0)。
他們的區(qū)別在于:內(nèi)部原理不同。
集群節(jié)點(diǎn)是真正的 etcd 集群的構(gòu)成者,這些節(jié)點(diǎn)負(fù)責(zé)數(shù)據(jù)存取,集群管理等等。
代理節(jié)點(diǎn)可以理解為一個反向代理,它只是簡單的接受請求,轉(zhuǎn)發(fā)請求給 etcd 集群。
集群的大小指集群節(jié)點(diǎn)的個數(shù)。根據(jù) etcd 的分布式數(shù)據(jù)冗余策略,集群節(jié)點(diǎn)越多,容錯能力(Failure Tolerance)越強(qiáng),同時寫性能也會越差。
所以關(guān)于集群大小的優(yōu)化,其實就是容錯和寫性能的一個平衡。
另外, etcd 推薦使用 奇數(shù) 作為集群節(jié)點(diǎn)個數(shù)。因為奇數(shù)個節(jié)點(diǎn)與和其配對的偶數(shù)個節(jié)點(diǎn)相比(比如 3節(jié)點(diǎn)和4節(jié)點(diǎn)對比),
容錯能力相同,卻可以少一個節(jié)點(diǎn)。
所以綜合考慮性能和容錯能力,etcd 官方文檔推薦的 etcd 集群大小是 3, 5, 7。至于到底選擇 3,5 還是 7,根據(jù)需要的容錯能力而定。
關(guān)于節(jié)點(diǎn)數(shù)和容錯能力對應(yīng)關(guān)系,如下表所示:
集群大小 | 最大容錯 |
---|---|
1 | 0 |
3 | 1 |
4 | 1 |
5 | 2 |
6 | 2 |
7 | 3 |
8 | 3 |
9 | 4 |
這里說的搭建指“從無到有”搭建。關(guān)于在已有集群中添加減少集群節(jié)點(diǎn),屬于下面"第3節(jié):etcd 集群的管理"的內(nèi)容。
etcd 集群的搭建有三種方式,包括:static 方式,etcd discovery 方式 和 DNS discovery。
這里,我們以一個例子來講解 etcd 集群各種方式的搭建。假設(shè)我們需要搭建一個3節(jié)點(diǎn)的 etcd 集群。這三個節(jié)點(diǎn)的 name(我們需要給每個節(jié)點(diǎn)取個名字)和 ip 分別是:
name | ip |
---|---|
etcd0 | 10.0.0.10 |
etcd1 | 10.0.0.11 |
etcd2 | 10.0.0.12 |
static 方式是最簡單的一種搭建 etcd 的方式。
不像其他兩種方式, static 方式不需要任何額外的服務(wù),只需要你知道你準(zhǔn)備用來運(yùn)行 etcd 的所有節(jié)點(diǎn)(的name和ip)。
本例中,我們來看看如何在3個節(jié)點(diǎn)上構(gòu)建 etcd 集群。
首先我們需要構(gòu)造一個描述集群所有節(jié)點(diǎn)的參數(shù),這個參數(shù)可以以命令行參數(shù)的方式傳給 etcd 程序,也可以以環(huán)境變量的方式。
如果用命令行參數(shù),應(yīng)該將下列參數(shù)附在 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 參數(shù)描述了這個新集群中總共有哪些節(jié)點(diǎn),其中每個節(jié)點(diǎn)用 name=ip的形式描述,節(jié)點(diǎn)之間用,分隔。
如果用環(huán)境變量,應(yīng)該在啟動 etcd 時,加入如下環(huán)境變量:
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個節(jié)點(diǎn)上啟動 etcd,以命令行參數(shù)方式啟動為例:
$ 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參數(shù),還是對應(yīng)的環(huán)境變量,只有在第一次啟動 etcd 的時候才起作用。
之后如果重啟 etcd,這個參數(shù)或環(huán)境變量會被自動忽略。所以當(dāng)成功初始化了一個 etcd 集群以后,你就不在需要這個參數(shù)或環(huán)境變量了。
很多時候,你只知道你要搭建一個多大(包含多少節(jié)點(diǎn))的集群,但是并不能事先知道這幾個節(jié)點(diǎn)的 ip,從而無法使用 -initial-cluster 參數(shù)。
這個時候,你就需要使用 discovery 的方式來搭建 etcd 集群。discovery 方式有兩種:etcd discovery 和 DNS discovery。
這里我們先介紹下 etcd discovery 方式,etcd discovery 有兩種:自定義的 etcd discovery 和 公共 etcd discovery
這種方式就是利用一個已有的 etcd 集群來提供 discovery 服務(wù),從而搭建一個新的 etcd 集群。
假設(shè)已有的 etcd 集群的一個訪問地址是:myetcd.local,那么我們首先需要在已有 etcd 中創(chuàng)建一個特殊的 key,方法如下:
$ curl -X PUT https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3
其中 value=3 表示本集群的大小,即: 有多少集群節(jié)點(diǎn)。而 6c007a14875d53d9bf0ef5a6fc0257c817f0fb83 就是用來做 discovery 的 token。
接下來你在 3 個節(jié)點(diǎn)上分別啟動 etcd 程序,并加上剛剛的 token。
加 token 的方式同樣也有 命令行參數(shù) 和 環(huán)境變量 兩種。
命令行參數(shù):
-discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
環(huán)境變量
ETCD_DISCOVERY=https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
以命令行參數(shù)啟動方式為例:
$ 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 提供的公共服務(wù): discovery.etcd.io。
步驟和 2.2.1 節(jié)基本一致。
你得先創(chuàng)建一個用于 discovery 的 token,創(chuàng)建方式如下:
$ curl https://discovery.etcd.io/new?size=3
返回:
https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
返回值作為啟動節(jié)點(diǎn)時的 -discovery 參數(shù)或者 ETCD_DISCOVERY環(huán)境變量的值。
以環(huán)境變量啟動方式為例:
$ 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 注意點(diǎn)
值得注意的是:如果實際啟動的 etcd 節(jié)點(diǎn)個數(shù)大于 discovery token創(chuàng)建時指定的size,
多余的節(jié)點(diǎn)會自動變?yōu)?proxy 節(jié)點(diǎn)。
這個方式?jīng)]有實踐,而且對于一般團(tuán)隊實用性也不高,所以就不做分享了。
2.4 后續(xù)到這里為止,我們已經(jīng)有一個3節(jié)點(diǎn)的 etcd 集群了,下一篇博客我會介紹如何進(jìn)行 etcd 集群的管理
--
更多文章歡迎關(guān)注自由風(fēng)暴博客
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/7923.html
摘要:搭建完集群后,接下來就是集群的管理了。集群的管理主要包括節(jié)點(diǎn)的重啟,監(jiān)控以及集群的運(yùn)行時更改。這樣,新節(jié)點(diǎn)就會運(yùn)行起來并且加入到已有的集群中了。 搭建完 etcd 集群后,接下來就是集群的管理了。集群的管理主要包括節(jié)點(diǎn)的重啟,監(jiān)控以及集群的運(yùn)行時更改(Runtime Reconfiguration)。 關(guān)于節(jié)點(diǎn)的重啟、監(jiān)控相對來說比較簡單,這里主要介紹下集群的運(yùn)行時更改。 1. 在什么...
摘要:最近被業(yè)務(wù)折騰的死去活來,實在沒時間發(fā)帖,花了好多個晚上才寫好這篇帖子,后續(xù)會加油的利用技術(shù)棧打造個人私有云系列文章目錄利用技術(shù)棧打造個人私有云連載之初章利用技術(shù)棧打造個人私有云連載之集群搭建利用技術(shù)棧打造個人私有云連載之環(huán)境理解和練手利用 showImg(https://segmentfault.com/img/remote/1460000013077799); 最近被業(yè)務(wù)折騰的死...
摘要:最近被業(yè)務(wù)折騰的死去活來,實在沒時間發(fā)帖,花了好多個晚上才寫好這篇帖子,后續(xù)會加油的利用技術(shù)棧打造個人私有云系列文章目錄利用技術(shù)棧打造個人私有云連載之初章利用技術(shù)棧打造個人私有云連載之集群搭建利用技術(shù)棧打造個人私有云連載之環(huán)境理解和練手利用 showImg(https://segmentfault.com/img/remote/1460000013077799); 最近被業(yè)務(wù)折騰的死...
摘要:是集群的數(shù)據(jù)核心,最嚴(yán)重的情況是,當(dāng)出問題徹底無法恢復(fù)的時候,解決問題的辦法可能只有重新搭建一個環(huán)境。因此圍繞相關(guān)的運(yùn)維知識就比較重要,可以容器化部署,也可以在宿主機(jī)自行搭建,以下內(nèi)容是通用的。 etcd 是 Kubernetes 集群的數(shù)據(jù)核心,最嚴(yán)重的情況是,當(dāng) etcd 出問題徹底無法恢復(fù)的時候,解決問題的辦法可能只有重新搭建一個環(huán)境。因此圍繞 etcd 相關(guān)的運(yùn)維知識就比較重要...
摘要:是集群的數(shù)據(jù)核心,最嚴(yán)重的情況是,當(dāng)出問題徹底無法恢復(fù)的時候,解決問題的辦法可能只有重新搭建一個環(huán)境。因此圍繞相關(guān)的運(yùn)維知識就比較重要,可以容器化部署,也可以在宿主機(jī)自行搭建,以下內(nèi)容是通用的。 etcd 是 Kubernetes 集群的數(shù)據(jù)核心,最嚴(yán)重的情況是,當(dāng) etcd 出問題徹底無法恢復(fù)的時候,解決問題的辦法可能只有重新搭建一個環(huán)境。因此圍繞 etcd 相關(guān)的運(yùn)維知識就比較重要...
閱讀 1690·2021-11-15 11:37
閱讀 3424·2021-09-28 09:44
閱讀 1678·2021-09-07 10:15
閱讀 2802·2021-09-03 10:39
閱讀 2698·2019-08-29 13:20
閱讀 1306·2019-08-29 12:51
閱讀 2215·2019-08-26 13:44
閱讀 2137·2019-08-23 18:02