摘要:搭建完集群后,接下來就是集群的管理了。集群的管理主要包括節(jié)點(diǎn)的重啟,監(jiān)控以及集群的運(yùn)行時(shí)更改。這樣,新節(jié)點(diǎn)就會(huì)運(yùn)行起來并且加入到已有的集群中了。
搭建完 etcd 集群后,接下來就是集群的管理了。集群的管理主要包括節(jié)點(diǎn)的重啟,監(jiān)控以及集群的運(yùn)行時(shí)更改(Runtime Reconfiguration)。
關(guān)于節(jié)點(diǎn)的重啟、監(jiān)控相對(duì)來說比較簡單,這里主要介紹下集群的運(yùn)行時(shí)更改。
1. 在什么情況下需要集群的運(yùn)行時(shí)更改?讓我們來看看需要集群的運(yùn)行時(shí)更改的幾個(gè)場景。他們中的絕大多數(shù)只需要運(yùn)用到重配置中的 “添加/刪除” 節(jié)點(diǎn)操作的組合。
如果你因?yàn)檫M(jìn)行諸如硬件升級(jí)或者斷網(wǎng)等計(jì)劃維護(hù),而需要移動(dòng)多個(gè)節(jié)點(diǎn)到新機(jī)器上,最好是逐個(gè)節(jié)點(diǎn)移動(dòng),一次操作一個(gè)。
移動(dòng) leader 節(jié)點(diǎn)是安全的,只不過 leader 節(jié)點(diǎn)下線后,需要耗費(fèi)更多的時(shí)間選舉新節(jié)點(diǎn),所以建議最后移動(dòng)。
如果你的集群有超過 50M 的數(shù)據(jù),最好進(jìn)行節(jié)點(diǎn)的遷移(見3.1節(jié) 遷移節(jié)點(diǎn)),而不要通過刪除舊節(jié)點(diǎn),增加新節(jié)點(diǎn)來實(shí)現(xiàn)節(jié)點(diǎn)的移動(dòng)。
如上一篇博客所說的,增加集群節(jié)點(diǎn)的個(gè)數(shù),容錯(cuò)能力越強(qiáng),讀性能也越好。不過相應(yīng)的,寫性能也會(huì)下降。減少集群節(jié)點(diǎn)的個(gè)數(shù),容錯(cuò)能力下降,不過寫性能也會(huì)提高。
更改集群大小也需要集群運(yùn)行時(shí)更改。
如果一個(gè)節(jié)點(diǎn)的機(jī)器因?yàn)橛布鲥e(cuò)而宕機(jī)了,那需要盡快用新機(jī)器替換。替換的操作就是簡單地分為兩步:(通過集群運(yùn)行時(shí)更改)先刪除壞掉的節(jié)點(diǎn),再添加新的節(jié)點(diǎn)(見2節(jié) 集群節(jié)點(diǎn)的操作)。不過,如果你的集群有超過 50M 的數(shù)據(jù),最好進(jìn)行節(jié)點(diǎn)遷移(見3.1節(jié) 遷移節(jié)點(diǎn))
如果你的集群出現(xiàn)了多數(shù)宕機(jī)(例如超過(N-1)/2的節(jié)點(diǎn)當(dāng)機(jī)),或者所有的節(jié)點(diǎn)都更改了 IP,你就需要手動(dòng)操作,重啟(恢復(fù))集群了?;静襟E包括:1.基于原先的數(shù)據(jù)創(chuàng)建新集群;2.強(qiáng)制讓一個(gè)節(jié)點(diǎn)成為 leader 節(jié)點(diǎn),并最終通過運(yùn)行時(shí)更改添加新節(jié)點(diǎn)的方式將其他節(jié)點(diǎn)添加到這個(gè)新的集群中。
2. 集群運(yùn)行時(shí)更改的操作知道了什么樣的情況下需要運(yùn)行時(shí)更改,下面讓我們來了解下具體的運(yùn)行時(shí)更改的操作。
一般來說,這些操作需要確保集群的多數(shù)節(jié)點(diǎn)是正常服務(wù)的,并且一次只操作一個(gè)節(jié)點(diǎn)。
升級(jí)單個(gè)節(jié)點(diǎn)的 peerURLs,需要執(zhí)行一個(gè)更新節(jié)點(diǎn)操作
替換一個(gè)節(jié)點(diǎn),需要先執(zhí)行一個(gè)添加節(jié)點(diǎn)操作,再執(zhí)行一個(gè)刪除節(jié)點(diǎn)操作
將集群大小從 3 更改到 5,需要執(zhí)行兩個(gè)添加節(jié)點(diǎn)操作
將集群大小從 5 降低到 3,需要執(zhí)行兩個(gè)刪除節(jié)點(diǎn)操作
下面的所有例子都是利用 etcdctl 命令實(shí)現(xiàn)操作,其本質(zhì)是調(diào)用 etcd 的 REST API。你也可以使用其他你習(xí)慣的客戶端。
如果你想更新一個(gè)節(jié)點(diǎn)的 IP(peerURLS),首先你需要知道那個(gè)節(jié)點(diǎn)的 ID。你可以列出所有節(jié)點(diǎn),找出對(duì)應(yīng)節(jié)點(diǎn)的 ID。
$ etcdctl member list 6e3bd23ae5f1eae0: name=node2 peerURLs=http://localhost:23802 clientURLs=http://127.0.0.1:23792 924e2e83e93f2560: name=node3 peerURLs=http://localhost:23803 clientURLs=http://127.0.0.1:23793 a8266ecf031671f3: name=node1 peerURLs=http://localhost:23801 clientURLs=http://127.0.0.1:23791
在本例中,我們假設(shè)要更新 ID 為 a8266ecf031671f3 的節(jié)點(diǎn)的 peerURLs 為:http://10.0.1.10:2380
$ etcdctl member update a8266ecf031671f3 http://10.0.1.10:2380 Updated member with ID a8266ecf031671f3 in cluster
假設(shè)我們要?jiǎng)h除 ID 為 a8266ecf031671f3 的節(jié)點(diǎn)
$ etcdctl member remove a8266ecf031671f3 Removed member a8266ecf031671f3 from cluster
執(zhí)行完后,目標(biāo)節(jié)點(diǎn)會(huì)自動(dòng)停止服務(wù),并且打印一行日志:
etcd: this member has been permanently removed from the cluster. Exiting.
如果刪除的是 leader 節(jié)點(diǎn),則需要耗費(fèi)額外的時(shí)間重新選舉 leader。
增加一個(gè)新的節(jié)點(diǎn)分為兩步:
通過 etcdctl 或?qū)?yīng)的 API 注冊新節(jié)點(diǎn)
使用恰當(dāng)?shù)膮?shù)啟動(dòng)新節(jié)點(diǎn)
先看第一步,假設(shè)我們要新加的節(jié)點(diǎn)取名為 infra3, peerURLs 是 http://10.0.1.13:2380
$ etcdctl member add infra3 http://10.0.1.13:2380 added member 9bf1b35fc7761a23 to cluster ETCD_NAME="infra3" ETCD_INITIAL_CLUSTER="infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380,infra3=http://10.0.1.13:2380" ETCD_INITIAL_CLUSTER_STATE=existing
etcdctl 在注冊完新節(jié)點(diǎn)后,會(huì)返回一段提示,包含3個(gè)環(huán)境變量。然后在第二部啟動(dòng)新節(jié)點(diǎn)的時(shí)候,帶上這3個(gè)環(huán)境變量即可。
$ export ETCD_NAME="infra3" $ export ETCD_INITIAL_CLUSTER="infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380,infra3=http://10.0.1.13:2380" $ export ETCD_INITIAL_CLUSTER_STATE=existing $ etcd -listen-client-urls http://10.0.1.13:2379 -advertise-client-urls http://10.0.1.13:2379 -listen-peer-urls http://10.0.1.13:2380 -initial-advertise-peer-urls http://10.0.1.13:2380 -data-dir %data_dir%
這樣,新節(jié)點(diǎn)就會(huì)運(yùn)行起來并且加入到已有的集群中了。
值得注意的是,如果原先的集群只有1個(gè)節(jié)點(diǎn),在新節(jié)點(diǎn)成功啟動(dòng)之前,新集群并不能正確的形成。因?yàn)樵鹊膯喂?jié)點(diǎn)集群無法完成leader的選舉。
直到新節(jié)點(diǎn)啟動(dòng)完,和原先的節(jié)點(diǎn)建立連接以后,新集群才能正確形成。
移動(dòng)節(jié)點(diǎn)有兩種方式:1. 刪除舊的節(jié)點(diǎn),增加新的節(jié)點(diǎn); 2. 遷移節(jié)點(diǎn)。當(dāng)集群的數(shù)據(jù)超過 50M 的時(shí)候,建議通過遷移節(jié)點(diǎn)的方式來移動(dòng)節(jié)點(diǎn)。
遷移節(jié)點(diǎn)的核心就是數(shù)據(jù)目錄的遷移。因?yàn)?etcd 的各個(gè)節(jié)點(diǎn)會(huì)將自己的 ID 存放在自己的數(shù)據(jù)目錄下面,所以遷移節(jié)點(diǎn)不會(huì)改變節(jié)點(diǎn)的 ID。
遷移節(jié)點(diǎn)的步驟簡單來說,包括以下幾步:
停止需要遷移的節(jié)點(diǎn)的服務(wù)
從老機(jī)器上拷貝數(shù)據(jù)目錄到新機(jī)器上
通過集群運(yùn)行時(shí)更改的更新操作,改變節(jié)點(diǎn)的 peerURLs 值為新機(jī)器的 IP:port
在新機(jī)器上指定拷貝過來的數(shù)據(jù)目錄,啟動(dòng) etcd 的節(jié)點(diǎn)服務(wù)
下面通過一個(gè)例子具體說明。
假設(shè)我們已有的集群是這樣的:
name | peerURLs |
---|---|
infra0 | 10.0.1.10:2380 |
infra1 | 10.0.1.11:2380 |
infra2 | 10.0.1.12:2380 |
$ etcdctl member list 84194f7c5edd8b37: name=infra0 peerURLs=http://10.0.1.10:2380 clientURLs=http://127.0.0.1:2379,http://10.0.1.10:2379 b4db3bf5e495e255: name=infra1 peerURLs=http://10.0.1.11:2380 clientURLs=http://127.0.0.1:2379,http://10.0.1.11:2379 bc1083c870280d44: name=infra2 peerURLs=http://10.0.1.12:2380 clientURLs=http://127.0.0.1:2379,http://10.0.1.12:2379
我們要移動(dòng) infra1 從 10.0.1.11 到 10.0.1.13
$ssh 10.0.1.11
$ kill `pgrep etcd`
$ tar -cvzf infra1.etcd.tar.gz %data_dir% $ scp infra1.etcd.tar.gz 10.0.1.13:~/
$ curl http://10.0.1.10:2379/v2/members/b4db3bf5e495e255 -XPUT -H "Content-Type: application/json" -d "{"peerURLs":["http://10.0.1.13:2380"]}"
或者利用 etcdctl
etcdctl member update b4db3bf5e495e255 http://10.0.1.13:2380
$ ssh 10.0.1.13 $ tar -xzvf infra1.etcd.tar.gz -C %data_dir% $ etcd -name infra1 > -listen-peer-urls http://10.0.1.13:2380 > -listen-client-urls http://10.0.1.13:2379,http://127.0.0.1:2379 > -advertise-client-urls http://10.0.1.13:2379,http://127.0.0.1:2379
總的來說,etcd 的集群還是相當(dāng)可靠的,但是也不能排除極端情況的出現(xiàn)。當(dāng)出現(xiàn)災(zāi)難性的多數(shù)節(jié)點(diǎn)宕機(jī),就不得不進(jìn)行災(zāi)難恢復(fù)了。
災(zāi)難恢復(fù)需要以下幾個(gè)步驟:
備份操作需要在一臺(tái)還"活著"的節(jié)點(diǎn)上進(jìn)行
$ etcdctl backup --data-dir %data_dir% --backup-dir %backup_data_dir%
這個(gè)命令會(huì)備份原數(shù)據(jù)到 %backup_data_dir% 目錄下,并重新相關(guān)的元數(shù)據(jù)(例如 節(jié)點(diǎn)的 id 和 集群的 id)。
這意味著在 %backup_data_dir% 中只包含原先的數(shù)據(jù),而不包含原先的身份信息。
接下來我們就可以基于備份的數(shù)據(jù)創(chuàng)建一個(gè)單節(jié)點(diǎn)的集群。
$ etcd -data-dir=%backup_data_dir% -force-new-cluster ...
...部分省略了其他相關(guān)的參數(shù),例如-peer-urls -client-urls 等等
這時(shí)候,應(yīng)該就成功創(chuàng)建了一個(gè)新的只包含一個(gè)節(jié)點(diǎn)的集群,并包含之前的所有數(shù)據(jù)。
當(dāng)你確認(rèn)新集群正常后,就可以刪除原來集群的數(shù)據(jù),暫停新集群,將新集群的數(shù)據(jù)目錄拷貝回原先數(shù)據(jù)的位置,并重新啟動(dòng)。
$ pkill etcd $ rm -rf %data_dir% $ mv %backup_data_dir% %data_dir% $ etcd -data-dir=%data_dir% ...
現(xiàn)在已經(jīng)有了一個(gè)擁有之前數(shù)據(jù)的單節(jié)點(diǎn)的集群了。接下來,你可以通過添加節(jié)點(diǎn)的操作,重建出一個(gè)同樣大小的集群。
值得注意的是,如果你還是使用之前的其他機(jī)器來重建這個(gè)新的集群,一定殺掉之前的etcd 進(jìn)程,并且清除掉之前的數(shù)據(jù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/7948.html
摘要:如果用命令行參數(shù),應(yīng)該將下列參數(shù)附在的啟動(dòng)命令后面其中表示這是在從無到有搭建集群。命令行參數(shù)環(huán)境變量以命令行參數(shù)啟動(dòng)方式為例公共服務(wù)如果沒有已有的集群,也可以用提供的公共服務(wù)。 etcd 是一個(gè)高可用的分布式 key-value(鍵值) 存儲(chǔ)系統(tǒng)。在暴漫我們用他用來做配置管理和服務(wù)發(fā)現(xiàn)。 這一次我們主要介紹關(guān)于 etcd 集群的搭建與管理。 1. etcd 集群概述 首先我們需要理解,...
摘要:容器云的背景伴隨著微服務(wù)的架構(gòu)的普及,結(jié)合開源的和等微服務(wù)框架,宜信內(nèi)部很多業(yè)務(wù)線逐漸了從原來的單體架構(gòu)逐漸轉(zhuǎn)移到微服務(wù)架構(gòu)。 容器云的背景 伴隨著微服務(wù)的架構(gòu)的普及,結(jié)合開源的Dubbo和Spring Cloud等微服務(wù)框架,宜信內(nèi)部很多業(yè)務(wù)線逐漸了從原來的單體架構(gòu)逐漸轉(zhuǎn)移到微服務(wù)架構(gòu)。應(yīng)用從有狀態(tài)到無狀態(tài),具體來說將業(yè)務(wù)狀態(tài)數(shù)據(jù)如:會(huì)話、用戶數(shù)據(jù)等存儲(chǔ)到中間件中服務(wù)中。 showI...
摘要:容器云的背景伴隨著微服務(wù)的架構(gòu)的普及,結(jié)合開源的和等微服務(wù)框架,宜信內(nèi)部很多業(yè)務(wù)線逐漸了從原來的單體架構(gòu)逐漸轉(zhuǎn)移到微服務(wù)架構(gòu)。 容器云的背景 伴隨著微服務(wù)的架構(gòu)的普及,結(jié)合開源的Dubbo和Spring Cloud等微服務(wù)框架,宜信內(nèi)部很多業(yè)務(wù)線逐漸了從原來的單體架構(gòu)逐漸轉(zhuǎn)移到微服務(wù)架構(gòu)。應(yīng)用從有狀態(tài)到無狀態(tài),具體來說將業(yè)務(wù)狀態(tài)數(shù)據(jù)如:會(huì)話、用戶數(shù)據(jù)等存儲(chǔ)到中間件中服務(wù)中。 showI...
摘要:容器云架構(gòu)方案。容器云架構(gòu)方案基于容器技術(shù),運(yùn)維技術(shù)團(tuán)隊(duì)開發(fā)了五阿哥網(wǎng)站的容器云平臺(tái)。多云對(duì)接私有云和公有云進(jìn)行統(tǒng)一托管,包含網(wǎng)絡(luò)區(qū)域配置,實(shí)例開通及的環(huán)境初始化配置等。技術(shù)選型及實(shí)踐鏡像標(biāo)準(zhǔn)眾所周知,的鏡像是分層的。 前言 五阿哥鋼鐵電商平臺(tái)(www.wuage.com)是由鋼鐵行業(yè)第一的中國五礦與互聯(lián)網(wǎng)第一的阿里巴巴聯(lián)手打造,并充分運(yùn)用雙方股東優(yōu)勢資源,即:阿里巴巴在大數(shù)據(jù)、電商運(yùn)...
摘要:大會(huì)是由國內(nèi)容器社區(qū)組織的專為一線開發(fā)者和運(yùn)維工程師設(shè)計(jì)的頂級(jí)容器技術(shù)會(huì)議,會(huì)議強(qiáng)調(diào)實(shí)踐和交流,話題設(shè)置圍繞容器運(yùn)維云計(jì)算等技術(shù)領(lǐng)域,力求全方位多角度為參會(huì)者解讀容器技術(shù)。 @Container大會(huì)是由國內(nèi)容器社區(qū) DockOne 組織的專為一線開發(fā)者和運(yùn)維工程師設(shè)計(jì)的頂級(jí)容器技術(shù)會(huì)議,會(huì)議強(qiáng)調(diào)實(shí)踐和交流,話題設(shè)置圍繞容器、運(yùn)維、云計(jì)算等技術(shù)領(lǐng)域,力求全方位、多角度為參會(huì)者解讀容器技術(shù)...
閱讀 1594·2021-09-02 15:41
閱讀 1001·2021-09-02 15:11
閱讀 1281·2021-07-28 00:15
閱讀 2311·2019-08-30 15:55
閱讀 1147·2019-08-30 15:54
閱讀 1696·2019-08-30 15:54
閱讀 2978·2019-08-30 14:02
閱讀 2526·2019-08-29 16:57