上一章我們認(rèn)識(shí)了etcd
,簡(jiǎn)單的介紹了 etcd 的基礎(chǔ)概念,但是理解起來(lái)還是比較抽象的。這一章我們就一起來(lái)部署下 etcd 。這樣可以讓我們對(duì) etcd 有更加確切的認(rèn)識(shí)。
1、etcd單實(shí)例部署
對(duì)于平常的學(xué)習(xí),其實(shí)搭建一個(gè)單機(jī)節(jié)點(diǎn)是夠了的。接下來(lái)就講講怎么搭建單機(jī)節(jié)點(diǎn)。
本次部署是在 centos7 系統(tǒng),cpu 為amd64 上面進(jìn)行的。
部署是直接使用官方編譯好的二進(jìn)制文件,大家也可以直接看 ectd-releases 界面選擇需要的版本,進(jìn)行部署。
部署步驟如下:
1、下載官方編譯好的 二進(jìn)制文件。大家可以根據(jù)自己的系統(tǒng)和cpu架構(gòu)進(jìn)行選擇。
cd /opt
wget https://github.com/etcd-io/etcd/releases/download/v3.5.8/etcd-v3.5.8-linux-amd64.tar.gz
2、解壓下載好的文件
tar -zxvf etcd-v3.5.8-linux-amd64.tar.gz
3、啟動(dòng) etcd 服務(wù)
cd etcd-v3.5.8-linux-amd64
# 啟動(dòng)方式一:前臺(tái)啟動(dòng)
./etcd
# 啟動(dòng)方式二:后臺(tái)啟動(dòng),日志文件位置可隨意選擇,有權(quán)限讀寫(xiě)就可以了
nohup ./etcd > /root/etcd.log 2>&1 &
啟動(dòng)的 etcd 進(jìn)程默認(rèn)監(jiān)聽(tīng)的是 2379
端口。我們可以使用 etcdctl 來(lái)與 etcd server進(jìn)行交互。下面展示一個(gè)簡(jiǎn)單的使用案例:
./etcdctl --endpoints=localhost:2379 put foo bar
./etcdctl --endpoints=localhost:2379 get foo
我們也可以將 etcdctl 拷貝到 /usr/local/bin 下面,這樣使用 etcdctl 時(shí),就不用想上面這樣,必須指定 etcdctl 的位置了。
上面啟動(dòng) etcd 進(jìn)程的方式比較簡(jiǎn)單,大家也可以使用 systemd 來(lái)進(jìn)行管理,這樣可以實(shí)現(xiàn)開(kāi)啟自啟了。
編寫(xiě) etcd.service 文件:
cat > /usr/lib/systemd/system/etcd.service << EOF
[Unit]
Description=Etcd Server
After=network.target network-online.target
Wants=network-online.target
[Service]
Type=notify
ExecStart=/opt/etcd-v3.5.8-linux-amd64/etcd
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
啟動(dòng) etcd 服務(wù)以及設(shè)置為開(kāi)機(jī)自啟
# 重載腳本文件
systemctl daemon-reload
# 啟動(dòng) etcd 服務(wù)
systemctl start etcd.service
# 設(shè)置 etcd 服務(wù)為開(kāi)機(jī)自啟
systemctl enable etcd.service
# 停止 etcd 服務(wù)
systemctl stop etcd.service
上面就是 etcd 的單實(shí)例部署方式了。
2、etcd集群部署
在生產(chǎn)環(huán)境中,為了整個(gè)集群的高可用,etcd 正常都會(huì)集群部署,避免單點(diǎn)故障。接下來(lái)我們一起學(xué)習(xí)如何進(jìn)行 etcd 集群部署。引導(dǎo) etcd 集群的啟動(dòng)有以下三種機(jī)制:
- 靜態(tài)啟動(dòng)
預(yù)先已知etcd集群中有哪些節(jié)點(diǎn),在啟動(dòng)時(shí)通過(guò)--initial-cluster參數(shù)直接指定好etcd的各個(gè)節(jié)點(diǎn)地址
- etcd 動(dòng)態(tài)發(fā)現(xiàn)
靜態(tài)配置前提是在搭建集群之前已經(jīng)提前知道各節(jié)點(diǎn)的信息,而實(shí)際應(yīng)用中可能存在預(yù) 先并不知道各節(jié)點(diǎn)ip的情況,這時(shí)可通過(guò)已經(jīng)搭建的etcd來(lái)輔助搭建新的etcd集群。通過(guò) 已有的etcd集群作為數(shù)據(jù)交互點(diǎn),然后在擴(kuò)展新的集群時(shí),實(shí)現(xiàn)通過(guò)已有集群進(jìn)行服務(wù)發(fā) 現(xiàn)的機(jī)制。比如官方提供的:discovery.etcd.io
- DNS 發(fā)現(xiàn)
通過(guò)DNS查詢(xún)方式獲取其他節(jié)點(diǎn)地址信息
靜態(tài)啟動(dòng) etcd 集群要求每個(gè)成員都知道集群中的另一個(gè)成員,也就是在配置文件中寫(xiě)死每個(gè)集群成員的地址。 在實(shí)際情況下,群集成員的 IP 可能會(huì)提前未知。在這種情況下,我們可以使用 etcd 官方提供的動(dòng)態(tài)發(fā)現(xiàn)功能來(lái)幫助引導(dǎo) etcd 群集。
接下來(lái)我們看一看靜態(tài)啟動(dòng)、etcd 動(dòng)態(tài)發(fā)現(xiàn)
是如何部署的,DNS 發(fā)現(xiàn)
的部署方式,大家可以看看文章最后的參考連接,講解得比較詳細(xì)。
哈哈,因?yàn)?etcd 的部署方式,相對(duì)來(lái)說(shuō)還是比較容易的,所以這里偷個(gè)懶,大家想看怎么集群部署的話,看文章最后的參考連接。
2.1 單機(jī)多實(shí)例部署
平常大家自己搭建著玩的話,可以使用此方式來(lái)部署一個(gè)單機(jī)多實(shí)例的 etcd 集群,這樣管理維護(hù)都比較方便。
想要在一臺(tái)機(jī)器上部署 etcd 集群,我們可以借助 goreman
這個(gè)工具,goreman 是一個(gè) Go 語(yǔ)言編寫(xiě)的多進(jìn)程管理工具
,是對(duì) Ruby 下廣泛使用的 foreman 的重寫(xiě)(foreman 原作者也實(shí)現(xiàn)了一個(gè) Go 版本:forego,不過(guò)沒(méi)有 goreman 好用)。
使用goreman
部署集群,需要我們先按照 go的環(huán)境,按照好 go 的環(huán)境后,執(zhí)行下面的命令:
go install github.com/mattn/goreman@latest
注意,上面執(zhí)行的命令,會(huì)將 goreman 按照在 $GOPATH 下面,GOPATH 可以通過(guò) go env 查看。如果執(zhí)行上面命令后,使用 goreman 命令提示找不到命令,多半是沒(méi)有將 GOPATH 加入到環(huán)境變量中去。
簡(jiǎn)單的方式 vi /etc/profile。加入下面兩句話,然后報(bào)錯(cuò)即可。
export GOPATH= 自己的實(shí)際路徑
export PATH=$PATH:$GOPATH/bin
HostName | ip | 客戶(hù)端交互端口 | peer 通信端口 |
---|---|---|---|
infra1 | 127.0.0.1 | 12379 | 12380 |
infra2 | 127.0.0.1 | 22379 | 22380 |
infra3 | 127.0.0.1 | 32379 | 32380 |
執(zhí)行下面步驟之前,需要先將 官方文檔 編譯好的 etcd 二進(jìn)制文件下載解壓到本機(jī),然后將etcd、etcdctl
這兩個(gè)可執(zhí)行文件拷貝到 /usr/local/bin/
下面去。
etcd_cluster_procfile 腳本如下:
etcd1: etcd --name infra1 --listen-client-urls http://127.0.0.1:12379 --advertise-client-urls http://127.0.0.1:12379 --listen-peer-urls http://127.0.0.1:12380 --initial-advertise-peer-urls http://127.0.0.1:12380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr
etcd2: etcd --name infra2 --listen-client-urls http://127.0.0.1:22379 --advertise-client-urls http://127.0.0.1:22379 --listen-peer-urls http://127.0.0.1:22380 --initial-advertise-peer-urls http://127.0.0.1:22380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr
etcd3: etcd --name infra3 --listen-client-urls http://127.0.0.1:32379 --advertise-client-urls http://127.0.0.1:32379 --listen-peer-urls http://127.0.0.1:32380 --initial-advertise-peer-urls http://127.0.0.1:32380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr
配置項(xiàng)說(shuō)明:
參數(shù) | 說(shuō)明 |
---|---|
--name | etcd集群中的節(jié)點(diǎn)名,這里可以隨意,可區(qū)分且不重復(fù)就行 |
--initial-advertise-peer-urls | 建議用于節(jié)點(diǎn)之間通信的url,節(jié)點(diǎn)間將以該值進(jìn)行通信。 |
--initial-cluster | 也就是集群中所有的 initial-advertise-peer-urls 的合集。etcd啟動(dòng)的時(shí)候,通過(guò)這個(gè)配置找到其他etcd節(jié)點(diǎn)的列表。 |
--listen-peer-urls | 監(jiān)聽(tīng)的用于節(jié)點(diǎn)之間通信的url,可監(jiān)聽(tīng)多個(gè),集群內(nèi)部將通過(guò)這些url進(jìn)行數(shù)據(jù)交互(如選舉,數(shù)據(jù)同步等) |
--listen-client-urls | 監(jiān)聽(tīng)客戶(hù)端請(qǐng)求的地址列表url,可以監(jiān)聽(tīng)多個(gè),多個(gè)用逗號(hào)分割。 |
--advertise-client-urls | 建議使用的客戶(hù)端通信 url,該值用于 etcd 代理或 etcd 成員與 etcd 節(jié)點(diǎn)通信。 |
--initial-cluster-token | etcd-cluster-1,節(jié)點(diǎn)的 token 值,設(shè)置該值后集群將生成唯一 id,并為每個(gè)節(jié)點(diǎn)也生成唯一 id,當(dāng)使用相同配置文件再啟動(dòng)一個(gè)集群時(shí),只要該 token 值不一樣,etcd 集群就不會(huì)相互影響。 |
--initial-cluster-state | 初始化的時(shí)候,集群的狀態(tài):new 和 existing 兩種狀態(tài)。new代表新建的集群,existing 代表加入已經(jīng)存在的集群 |
注意上面的腳本,etcd 命令執(zhí)行時(shí)需要根據(jù)本地實(shí)際的安裝地址進(jìn)行配置。使用下面的命令啟動(dòng) etcd 集群。
goreman -f /opt/etcd_cluster_procfile start
使用如上的命令啟動(dòng)啟動(dòng) etcd 集群,啟動(dòng)完成之后查看集群內(nèi)的成員。
$ etcdctl --endpoints=http://localhost:22379 member list
8211f1d0f64f3269, started, infra1, http://127.0.0.1:12380, http://127.0.0.1:12379, false
91bc3c398fb3c146, started, infra2, http://127.0.0.1:22380, http://127.0.0.1:22379, false
fd422379fda50e48, started, infra3, http://127.0.0.1:32380, http://127.0.0.1:32379, false
上面我們使用單機(jī)部署了多個(gè)etcd實(shí)例,模擬一個(gè)etcd集群。我們?cè)趩?dòng)集群的時(shí)候,已經(jīng)知道了各個(gè)實(shí)例的地址,但是在實(shí)際環(huán)境中,集群成員的 ip 可能不會(huì)提前知道。這時(shí)候就需要采用動(dòng)態(tài)發(fā)現(xiàn)的機(jī)制。
2.2 動(dòng)態(tài)發(fā)現(xiàn)啟動(dòng) etcd 集群
下面的內(nèi)容全部來(lái)自 文章最后的參考連接,如有侵權(quán),請(qǐng)聯(lián)系刪除,謝謝。
參考連接還有 docker 部署以及 dns 部署,大家感興趣可以去看看。
如前面所述,在實(shí)際環(huán)境中,集群成員的 ip 可能不會(huì)提前知道。在這種情況下,需要使用自動(dòng)發(fā)現(xiàn)來(lái)引導(dǎo) etcd 集群,而不是指定靜態(tài)配置,這個(gè)過(guò)程被稱(chēng)為發(fā)現(xiàn)。我們啟動(dòng)三個(gè) etcd,具體對(duì)應(yīng)如下:
HostName | ip | 客戶(hù)端交互端口 | peer 通信端口 |
---|---|---|---|
etcd1 | 192.168.202.128 | 2379 | 2380 |
etcd2 | 192.168.202.129 | 2379 | 2380 |
etcd3 | 192.168.202.130 | 2379 | 2380 |
2.2.1 協(xié)議的原理
Discovery service protocol
幫助新的 etcd 成員使用共享 URL 在集群引導(dǎo)階段發(fā)現(xiàn)所有其他成員。
該協(xié)議使用新的發(fā)現(xiàn)令牌來(lái)引導(dǎo)一個(gè)唯一的 etcd 集群。一個(gè)發(fā)現(xiàn)令牌只能代表一個(gè) etcd 集群。只要此令牌上的發(fā)現(xiàn)協(xié)議啟動(dòng),即使它中途失敗,也不能用于引導(dǎo)另一個(gè) etcd 集群。
2.2.2 協(xié)議的工作流程
Discovery protocol 使用內(nèi)部 etcd 集群來(lái)協(xié)調(diào)新集群的引導(dǎo)程序。首先,所有新成員都與發(fā)現(xiàn)服務(wù)交互,并幫助生成預(yù)期的成員列表。之后,每個(gè)新成員使用此列表引導(dǎo)其服務(wù)器,該列表執(zhí)行與 --initial-cluster
標(biāo)志相同的功能,即設(shè)置所有集群的成員信息。
注意:
Discovery service protocol僅用于集群引導(dǎo)階段,不能用于運(yùn)行時(shí)重新配置或集群 監(jiān)視。
2.2.3 使用公共發(fā)現(xiàn)服務(wù)部署集群
當(dāng)我們本地沒(méi)有可用的 etcd 集群,etcd 官網(wǎng)提供了一個(gè)可以公網(wǎng)訪問(wèn)的 etcd 存儲(chǔ)地址。我們可以通過(guò)如下命令得到 etcd 服務(wù)的目錄,并把它作為 --discovery
參數(shù)使用。
公共發(fā)現(xiàn)服務(wù) discovery.etcd.io
以相同的方式工作,并提供針對(duì)過(guò)多請(qǐng)求的保護(hù)。公共發(fā)現(xiàn)服務(wù)在其上仍然使用 etcd 群集作為數(shù)據(jù)存儲(chǔ)。
1、創(chuàng)建集群發(fā)現(xiàn)
# 使用公共etcd發(fā)現(xiàn)服務(wù)
$ curl http://discovery.etcd.io/new?size=3
# 生成的url
http://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
2、部署前準(zhǔn)備工作
所有節(jié)點(diǎn)均需要安裝etcd。以及創(chuàng)建需要的目錄。
#創(chuàng)建單獨(dú)的etcd數(shù)據(jù)目錄
mkdir ‐p /opt/etcd/data
3、以動(dòng)態(tài)發(fā)現(xiàn)方式啟動(dòng)集群
每個(gè)成員必須指定不同的名稱(chēng)標(biāo)志,否則發(fā)現(xiàn)將因重復(fù)的名稱(chēng)而失敗
etcd 發(fā)現(xiàn)模式下,啟動(dòng) etcd 的命令如下:
# etcd1 啟動(dòng)
$ /opt/etcd/bin/etcd --name etcd1 --initial-advertise-peer-urls http://192.168.202.128:2380 \
--listen-peer-urls http://192.168.202.128:2380 \
--data-dir /opt/etcd/data \
--listen-client-urls http://192.168.202.128:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://192.168.202.128:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
# etcd2 啟動(dòng)
/opt/etcd/bin/etcd --name etcd2 --initial-advertise-peer-urls http://192.168.202.129:2380 \
--listen-peer-urls http://192.168.202.129:2380 \
--data-dir /opt/etcd/data \
--listen-client-urls http://192.168.202.129:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://192.168.202.129:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
# etcd3 啟動(dòng)
/opt/etcd/bin/etcd --name etcd3 --initial-advertise-peer-urls http://192.168.202.130:2380 \
--listen-peer-urls http://192.168.202.130:2380 \
--data-dir /opt/etcd/data \
--listen-client-urls http://192.168.202.130:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://192.168.202.130:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
需要注意的是,在我們完成了集群的初始化后,這些信息就失去了作用。當(dāng)需要增加節(jié)點(diǎn)時(shí),需要使用 etcdctl 進(jìn)行操作。為了安全,每次啟動(dòng)新 etcd 集群時(shí),都使用新的 discovery token 進(jìn)行注冊(cè)。另外,如果初始化時(shí)啟動(dòng)的節(jié)點(diǎn)超過(guò)了指定的數(shù)量,多余的節(jié)點(diǎn)會(huì)自動(dòng)轉(zhuǎn)化為 Proxy 模式的 etcd。
4、結(jié)果驗(yàn)證
集群?jiǎn)?dòng)好之后,進(jìn)行驗(yàn)證,我們看一下集群的成員:
$ /opt/etcd/bin/etcdctl member list
40e2ac06ca1674a7, started, etcd3, http://192.168.202.130:2380, http://192.168.202.130:2379, false
c532c5cedfe84d3c, started, etcd1, http://192.168.202.128:2380, http://192.168.202.128:2379, false
db75d3022049742a, started, etcd2, http://192.168.202.129:2380, http://192.168.202.129:2379, false
結(jié)果符合預(yù)期,再看下節(jié)點(diǎn)的健康狀態(tài):
$ /opt/etcd/bin/etcdctl --endpoints="http://192.168.202.128:2379,http://192.168.202.129:2379,http://192.168.202.130:2379" endpoint health
# 結(jié)果如下
http://192.168.202.128:2379 is healthy: successfully committed proposal: took = 3.157068ms
http://192.168.202.130:2379 is healthy: successfully committed proposal: took = 3.300984ms
http://192.168.202.129:2379 is healthy: successfully committed proposal: took = 3.263923ms
可以看到,集群中的三個(gè)節(jié)點(diǎn)都是健康的正常狀態(tài)。以動(dòng)態(tài)發(fā)現(xiàn)方式啟動(dòng)集群成功。
上面是使用公共服務(wù)來(lái)做服務(wù)發(fā)現(xiàn)的,如果我們有自己搭建好的etcd,可以使用自建的etcd作為服務(wù)發(fā)現(xiàn),搭建集群:
獲取令牌時(shí),必須指定群集大小。 發(fā)現(xiàn)服務(wù)使用該大小來(lái)了解何時(shí)發(fā)現(xiàn)了最初將組成集群的所有成員。
curl -X PUT http://10.0.10.10:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3
我們需要把該 url 地址 http://10.0.10.10:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83 作為 --discovery
參數(shù)來(lái)啟動(dòng) etcd。
節(jié)點(diǎn)會(huì)自動(dòng)使用 http://10.0.10.10:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83 目錄進(jìn)行 etcd 的注冊(cè)和發(fā)現(xiàn)服務(wù)。
參考鏈接:
bilibili視頻教程
徹底搞懂 etcd 系列文章(三):etcd 集群運(yùn)維部署
搭建 etcd 集群--使用到了 tls
使用 StatefulSet 部署 etcd 集群文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-482375.html
etcd配置文件詳解文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-482375.html
到了這里,關(guān)于2、etcd單機(jī)部署和集群部署的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!