上一章我們認識了etcd,簡單的介紹了 etcd 的基礎概念,但是理解起來還是比較抽象的。這一章我們就一起來部署下 etcd 。這樣可以讓我們對 etcd 有更加確切的認識。 1、etcd單實例部署 對於平常的學習,其實搭建一個單機節點是夠了的。接下來就講講怎麼搭建單機節點。 本次部署是在 cent ...
上一章我們認識了etcd
,簡單的介紹了 etcd 的基礎概念,但是理解起來還是比較抽象的。這一章我們就一起來部署下 etcd 。這樣可以讓我們對 etcd 有更加確切的認識。
1、etcd單實例部署
對於平常的學習,其實搭建一個單機節點是夠了的。接下來就講講怎麼搭建單機節點。
本次部署是在 centos7 系統,cpu 為amd64 上面進行的。
部署是直接使用官方編譯好的二進位文件,大家也可以直接看 ectd-releases 界面選擇需要的版本,進行部署。
部署步驟如下:
1、下載官方編譯好的 二進位文件。大家可以根據自己的系統和cpu架構進行選擇。
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、啟動 etcd 服務
cd etcd-v3.5.8-linux-amd64
# 啟動方式一:前臺啟動
./etcd
# 啟動方式二:後臺啟動,日誌文件位置可隨意選擇,有許可權讀寫就可以了
nohup ./etcd > /root/etcd.log 2>&1 &
啟動的 etcd 進程預設監聽的是 2379
埠。我們可以使用 etcdctl 來與 etcd server進行交互。下麵展示一個簡單的使用案例:
./etcdctl --endpoints=localhost:2379 put foo bar
./etcdctl --endpoints=localhost:2379 get foo
我們也可以將 etcdctl 拷貝到 /usr/local/bin 下麵,這樣使用 etcdctl 時,就不用想上面這樣,必須指定 etcdctl 的位置了。
上面啟動 etcd 進程的方式比較簡單,大家也可以使用 systemd 來進行管理,這樣可以實現開啟自啟了。
編寫 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
啟動 etcd 服務以及設置為開機自啟
# 重載腳本文件
systemctl daemon-reload
# 啟動 etcd 服務
systemctl start etcd.service
# 設置 etcd 服務為開機自啟
systemctl enable etcd.service
# 停止 etcd 服務
systemctl stop etcd.service
上面就是 etcd 的單實例部署方式了。
2、etcd集群部署
在生產環境中,為了整個集群的高可用,etcd 正常都會集群部署,避免單點故障。接下來我們一起學習如何進行 etcd 集群部署。引導 etcd 集群的啟動有以下三種機制:
- 靜態啟動
預先已知etcd集群中有哪些節點,在啟動時通過--initial-cluster參數直接指定好etcd的各個節點地址
- etcd 動態發現
靜態配置前提是在搭建集群之前已經提前知道各節點的信息,而實際應用中可能存在預 先並不知道各節點ip的情況,這時可通過已經搭建的etcd來輔助搭建新的etcd集群。通過 已有的etcd集群作為數據交互點,然後在擴展新的集群時,實現通過已有集群進行服務發 現的機制。比如官方提供的:discovery.etcd.io
- DNS 發現
通過DNS查詢方式獲取其他節點地址信息
靜態啟動 etcd 集群要求每個成員都知道集群中的另一個成員,也就是在配置文件中寫死每個集群成員的地址。 在實際情況下,群集成員的 IP 可能會提前未知。在這種情況下,我們可以使用 etcd 官方提供的動態發現功能來幫助引導 etcd 群集。
接下來我們看一看靜態啟動、etcd 動態發現
是如何部署的,DNS 發現
的部署方式,大家可以看看文章最後的參考連接,講解得比較詳細。
哈哈,因為 etcd 的部署方式,相對來說還是比較容易的,所以這裡偷個懶,大家想看怎麼集群部署的話,看文章最後的參考連接。
2.1 單機多實例部署
平常大家自己搭建著玩的話,可以使用此方式來部署一個單機多實例的 etcd 集群,這樣管理維護都比較方便。
想要在一臺機器上部署 etcd 集群,我們可以藉助 goreman
這個工具,goreman 是一個 Go 語言編寫的多進程管理工具
,是對 Ruby 下廣泛使用的 foreman 的重寫(foreman 原作者也實現了一個 Go 版本:forego,不過沒有 goreman 好用)。
使用goreman
部署集群,需要我們先按照 go的環境,按照好 go 的環境後,執行下麵的命令:
go install github.com/mattn/goreman@latest
註意,上面執行的命令,會將 goreman 按照在 $GOPATH 下麵,GOPATH 可以通過 go env 查看。如果執行上面命令後,使用 goreman 命令提示找不到命令,多半是沒有將 GOPATH 加入到環境變數中去。
簡單的方式 vi /etc/profile。加入下麵兩句話,然後報錯即可。
export GOPATH= 自己的實際路徑
export PATH=$PATH:$GOPATH/bin
HostName | ip | 客戶端交互埠 | peer 通信埠 |
---|---|---|---|
infra1 | 127.0.0.1 | 12379 | 12380 |
infra2 | 127.0.0.1 | 22379 | 22380 |
infra3 | 127.0.0.1 | 32379 | 32380 |
執行下麵步驟之前,需要先將 官方文檔 編譯好的 etcd 二進位文件下載解壓到本機,然後將etcd、etcdctl
這兩個可執行文件拷貝到 /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
配置項說明:
參數 | 說明 |
---|---|
--name | etcd集群中的節點名,這裡可以隨意,可區分且不重覆就行 |
--initial-advertise-peer-urls | 建議用於節點之間通信的url,節點間將以該值進行通信。 |
--initial-cluster | 也就是集群中所有的 initial-advertise-peer-urls 的合集。etcd啟動的時候,通過這個配置找到其他etcd節點的列表。 |
--listen-peer-urls | 監聽的用於節點之間通信的url,可監聽多個,集群內部將通過這些url進行數據交互(如選舉,數據同步等) |
--listen-client-urls | 監聽客戶端請求的地址列表url,可以監聽多個,多個用逗號分割。 |
--advertise-client-urls | 建議使用的客戶端通信 url,該值用於 etcd 代理或 etcd 成員與 etcd 節點通信。 |
--initial-cluster-token | etcd-cluster-1,節點的 token 值,設置該值後集群將生成唯一 id,併為每個節點也生成唯一 id,當使用相同配置文件再啟動一個集群時,只要該 token 值不一樣,etcd 集群就不會相互影響。 |
--initial-cluster-state | 初始化的時候,集群的狀態:new 和 existing 兩種狀態。new代表新建的集群,existing 代表加入已經存在的集群 |
註意上面的腳本,etcd 命令執行時需要根據本地實際的安裝地址進行配置。使用下麵的命令啟動 etcd 集群。
goreman -f /opt/etcd_cluster_procfile start
使用如上的命令啟動啟動 etcd 集群,啟動完成之後查看集群內的成員。
$ 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
上面我們使用單機部署了多個etcd實例,模擬一個etcd集群。我們在啟動集群的時候,已經知道了各個實例的地址,但是在實際環境中,集群成員的 ip 可能不會提前知道。這時候就需要採用動態發現的機制。
2.2 動態發現啟動 etcd 集群
下麵的內容全部來自 文章最後的參考連接,如有侵權,請聯繫刪除,謝謝。
參考連接還有 docker 部署以及 dns 部署,大家感興趣可以去看看。
如前面所述,在實際環境中,集群成員的 ip 可能不會提前知道。在這種情況下,需要使用自動發現來引導 etcd 集群,而不是指定靜態配置,這個過程被稱為發現。我們啟動三個 etcd,具體對應如下:
HostName | ip | 客戶端交互埠 | 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 協議的原理
Discovery service protocol
幫助新的 etcd 成員使用共用 URL 在集群引導階段發現所有其他成員。
該協議使用新的發現令牌來引導一個唯一的 etcd 集群。一個發現令牌只能代表一個 etcd 集群。只要此令牌上的發現協議啟動,即使它中途失敗,也不能用於引導另一個 etcd 集群。
2.2.2 協議的工作流程
Discovery protocol 使用內部 etcd 集群來協調新集群的引導程式。首先,所有新成員都與發現服務交互,並幫助生成預期的成員列表。之後,每個新成員使用此列表引導其伺服器,該列表執行與 --initial-cluster
標誌相同的功能,即設置所有集群的成員信息。
註意:
Discovery service protocol僅用於集群引導階段,不能用於運行時重新配置或集群 監視。
2.2.3 使用公共發現服務部署集群
當我們本地沒有可用的 etcd 集群,etcd 官網提供了一個可以公網訪問的 etcd 存儲地址。我們可以通過如下命令得到 etcd 服務的目錄,並把它作為 --discovery
參數使用。
公共發現服務 discovery.etcd.io
以相同的方式工作,並提供針對過多請求的保護。公共發現服務在其上仍然使用 etcd 群集作為數據存儲。
1、創建集群發現
# 使用公共etcd發現服務
$ curl http://discovery.etcd.io/new?size=3
# 生成的url
http://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
2、部署前準備工作
所有節點均需要安裝etcd。以及創建需要的目錄。
#創建單獨的etcd數據目錄
mkdir ‐p /opt/etcd/data
3、以動態發現方式啟動集群
每個成員必須指定不同的名稱標誌,否則發現將因重覆的名稱而失敗
etcd 發現模式下,啟動 etcd 的命令如下:
# etcd1 啟動
$ /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 啟動
/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 啟動
/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
需要註意的是,在我們完成了集群的初始化後,這些信息就失去了作用。當需要增加節點時,需要使用 etcdctl 進行操作。為了安全,每次啟動新 etcd 集群時,都使用新的 discovery token 進行註冊。另外,如果初始化時啟動的節點超過了指定的數量,多餘的節點會自動轉化為 Proxy 模式的 etcd。
4、結果驗證
集群啟動好之後,進行驗證,我們看一下集群的成員:
$ /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
結果符合預期,再看下節點的健康狀態:
$ /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
# 結果如下
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
可以看到,集群中的三個節點都是健康的正常狀態。以動態發現方式啟動集群成功。
上面是使用公共服務來做服務發現的,如果我們有自己搭建好的etcd,可以使用自建的etcd作為服務發現,搭建集群:
獲取令牌時,必須指定群集大小。 發現服務使用該大小來瞭解何時發現了最初將組成集群的所有成員。
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
參數來啟動 etcd。
節點會自動使用 http://10.0.10.10:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83 目錄進行 etcd 的註冊和發現服務。
參考鏈接:
bilibili視頻教程