2、etcd單機部署和集群部署

来源:https://www.cnblogs.com/huageyiyangdewo/archive/2023/05/07/17378748.html
-Advertisement-
Play Games

上一章我們認識了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視頻教程

徹底搞懂 etcd 系列文章(三):etcd 集群運維部署

搭建 etcd 集群--使用到了 tls

使用 StatefulSet 部署 etcd 集群


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在拍攝脊柱或胸片時,經常會遇到因設備高度不夠需要分段拍攝的情況, 對於影像科診斷查閱影像時希望將分段影像合併成一張影像,有助於更直觀的觀察病竈, 以下圖為例的兩個分段影像: 我們使用OpenCVSharp中的Stitcher類的Stitch方法,導入兩張圖像並拼接: 但結果卻失敗了,返回錯誤結果:E ...
  • 利用PowerPoint可以很方便的呈現多媒體信息,且信息形式多媒體化,表現力強。但難免在某些情況下我們會需要將PowerPoint轉換為HTML格式。因為HTML文檔能獨立於各種操作系統平臺(如Unix,Windows等)。並且它可以加入圖片、聲音、動畫、影視等內容,還能從一個文件跳轉到另一個文件 ...
  • 目錄 01項目環境準備 02代碼示例 03輸出示例 04總結 05源碼地址 01項目環境準備 A.開發使用的軟體:AutoCAD2016、VisualStudio2022 B.建立依賴的本地庫(提前從AutoCAD軟體安裝目錄拷貝開發時需要使用的庫,如:accoremgd.dll) C.創建新的類庫 ...
  • 支持.Net Core(2.0及以上)/.Net Framework(4.5及以上),可以部署在Docker, Windows, Linux, Mac。 http請求調用是開發中經常會用到的功能,因為,很多第三方功能介面往往是通過http地址的形式提供的,比如:ChatGpt、OpenAI、簡訊服務 ...
  • 就從頭開始吧 第一題 (ASCII) 一道簡單的ASCII碼轉換,直接用題目的提示代碼解就行了 ascii=[99, 114, 121, 112, 116, 111, 123, 65, 83, 67, 73, 73, 95, 112, 114, 49, 110, 116, 52, 98, 108, ...
  • 最近小編思維發散“Visual Studio可以集成chatgpt嗎?”,這樣不就可以讓chatgpt幫你寫代碼了嗎?尋覓了一圈,還真有這個東西,那就是一個Visual Studio的擴展插件:Visual chatGPT Studio,雖然不是官方的,部分功能也可以值得一用。本文將介紹Visual ...
  • 1、七種文件類型 普通文件類型 Linux中最多的一種文件類型, 包括 純文本文件(ASCII);二進位文件(binary);數據格式的文件(data);各種壓縮文件.第一個屬性為 [-] 目錄文件 就是目錄, 能用 # cd 命令進入的。第一個屬性為 [d],例如 [drwxrwxrwx] 塊設備 ...
  • 0、由於M系列晶元是arm架構,在使用brew安裝node時都是arm的node,但是[email protected]版本中不支持arm架構的出現如下報錯: Error: Node Sass does not yet support your current environment: OS X Un ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...