一 etcd集群概述 1.1 概述 靜態啟動etcd集群要求每個成員都知道集群中的另一個成員。Etcd運行在集群的每個coreos節點上,可以保證coreos集群的穩定,可靠的運行。當集群網路出現動蕩,或者當前master節點出現異常時,etcd可以進行master節點的選舉工作,同時恢復集群中損失 ...
一 etcd集群概述
1.1 概述
靜態啟動etcd集群要求每個成員都知道集群中的另一個成員。Etcd運行在集群的每個coreos節點上,可以保證coreos集群的穩定,可靠的運行。當集群網路出現動蕩,或者當前master節點出現異常時,etcd可以進行master節點的選舉工作,同時恢復集群中損失的數據。1.2 集群容錯能力
1.3 集群基礎
每個 etcd cluster 都由若幹個 member 組成的,每個 member 是一個獨立運行的 etcd 實例,單台機器上也可以運行多個 member。 在正常運行的狀態下,集群中會有一個 leader,其餘的 member 都是 followers。leader 向 followers 同步日誌,保證數據在各個 member 都有副本。leader 還會定時向所有的 member 發送心跳報文,如果在規定的時間里 follower 沒有收到心跳,就會重新進行選舉。 客戶端所有的請求都會先發送給 leader,leader 向所有的 followers 同步日誌,等收到超過半數的確認後就把該日誌存儲到磁碟,並返迴響應客戶端。 每個 etcd 服務有三大主要部分組成:raft 實現、WAL 日誌存儲、數據的存儲和索引。 WAL 會在本地磁碟(即 --data-dir)上存儲日誌內容(wal file)和快照(snapshot)。 提示:etcd 預設只保存 1000 個歷史事件,因此不適合有大量更新操作的場景,否則會導致數據的丟失。etcd 典型的應用場景是配置管理和服務發現,即讀多寫少的。1.4 引導機制
- 靜態的
- etcd Discovery
- DNS發現
二 集群部署-靜態
2.1 環境準備
ntp配置:略 #建議配置ntp服務,保證時間一致性 etcd版本:v3.3.9 防火牆及SELinux:關閉防火牆和SELinux1 # hostnamectl set-hostname etcd1.example.com 2 # hostnamectl set-hostname etcd2.example.com 3 # hostnamectl set-hostname etcd3.example.com 4 # vi /etc/hosts 5 #…… 6 172.24.8.31 etcd1.example.com 7 172.24.8.32 etcd2.example.com 8 172.24.8.33 etcd3.example.com提示:CentOS6.x則修改/etc/sysconfig/network。
2.2 安裝etcd
1 # ETCD_VER=v3.3.9 2 # GITHUB_URL=https://github.com/coreos/etcd/releases/download 3 # DOWNLOAD_URL=${GITHUB_URL} 4 # rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz 5 # rm -rf /tmp/etcd-download-test 6 # mkdir -p /tmp/etcd-download-test #創建下載保存目錄 7 # curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz 8 # tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1 9 # cp /tmp/etcd-download-test/etcd /usr/local/bin/ 10 # cp /tmp/etcd-download-test/etcdctl /usr/local/bin/ 11 # rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz 12 13 # rm -rf /tmp/etcd-download-test/ 14 # ETCDCTL_API=3 15 # etcd --version 16 # etcdctl --version #查看已安裝版本提示:所有節點均需要安裝etcd。
2.3 啟動前準備
1 # mkdir -p /var/log/etcd/ #建議創建etcd日誌保存目錄 2 # mkdir -p /data/etcd #建議創建單獨的etcd數據目錄
2.4 啟動集群
1 [root@etcd1 ~]# etcd --name etcd1 --data-dir /data/etcd \ 2 --initial-advertise-peer-urls http://172.24.8.31:2380 \ 3 --listen-peer-urls http://172.24.8.31:2380 \ 4 --listen-client-urls http://172.24.8.31:2379,http://127.0.0.1:2379 \ 5 --advertise-client-urls http://172.24.8.31:2379 \ 6 --initial-cluster-token etcd-cluster-1 \ 7 --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3=http://172.24.8.33:2380 \ 8 --initial-cluster-state new註意:第一臺啟動的 etcd 伺服器將會不斷等待其他集群成員完成初始化連接, 處於 waiting 狀態。
1 [root@etcd2 ~]# etcd --name etcd2 --data-dir /data/etcd \ 2 --initial-advertise-peer-urls http://172.24.8.32:2380 \ 3 --listen-peer-urls http://172.24.8.32:2380 \ 4 --listen-client-urls http://172.24.8.32:2379,http://127.0.0.1:2379 \ 5 --advertise-client-urls http://172.24.8.32:2379 \ 6 --initial-cluster-token etcd-cluster-1 \ 7 --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3=http://172.24.8.33:2380 \ 8 --initial-cluster-state new 9 10 [root@etcd3 ~]# etcd --name etcd3 --data-dir /data/etcd \ 11 --initial-advertise-peer-urls http://172.24.8.33:2380 \ 12 --listen-peer-urls http://172.24.8.33:2380 \ 13 --listen-client-urls http://172.24.8.33:2379,http://127.0.0.1:2379 \ 14 --advertise-client-urls http://172.24.8.33:2379 \ 15 --initial-cluster-token etcd-cluster-1 \ 16 --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3=http://172.24.8.33:2380 \ 17 --initial-cluster-state new提示:etcd可通過配置文件、命令行參數和環境變數進行配置,在命令行上設置的選項優先於來自環境的選項。如果提供了配置文件,則將忽略其他命令行參數和環境變數。例如,etcd --config-file etcd.conf.yml --data-dir /tmp將忽略該--data-dir標誌。即優先順序為:配置文件>命令行參數>環境變數。 配置文件為yml的文件,可參考《附001.etcd實例配置文件》 建議: 建議根據以下操作將啟動命令寫成固定腳本:
1 [root@etcd1 ~]# vi /root/startetcd.sh 2 #!/bin/sh 3 #****************************************************************# 4 # ScriptName: /root/startetcd.sh 5 # Author: Xiang Hongying 6 # Create Date: 2018-09-10 01:14 7 # Modify Author: Xiang Hongying 8 # E-Mail: [email protected] 9 # Version: 10 #***************************************************************# 11 LOGFILE=/var/log/etcd/etcd.log 12 /usr/local/bin/etcd --name etcd1 --data-dir /data/etcd \ 13 --initial-advertise-peer-urls http://172.24.8.31:2380 \ 14 --listen-peer-urls http://172.24.8.31:2380 \ 15 --listen-client-urls http://172.24.8.31:2379,http://127.0.0.1:2379 \ 16 --advertise-client-urls http://172.24.8.31:2379 \ 17 --initial-cluster-token etcd-cluster-1 \ 18 --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3=http://172.24.8.33:2380 \ 19 -initial-cluster-state new >> $LOGFILE 2>&1 & 20 [root@etcd1 ~]# chmod u+x startetcd.sh
2.5 集群健康檢測
1 [root@etcd1 ~]# etcdctl cluster-health
附錄:使用systemd管理etcd。
1 [root@etcd1 ~]# vi /lib/systemd/system/etcd.service 2 [Unit] 3 Description=etcd 4 Documentation=https://github.com/coreos/etcd 5 Conflicts=etcd.service 6 7 [Service] 8 Type=notify 9 Restart=always 10 RestartSec=5s 11 LimitNOFILE=40000 12 TimeoutStartSec=0 13 14 ExecStart=/usr/local/bin/etcd --name etcd1 --data-dir /data/etcd \ 15 --initial-advertise-peer-urls http://172.24.8.31:2380 \ 16 --listen-peer-urls http://172.24.8.31:2380 \ 17 --listen-client-urls http://172.24.8.31:2379,http://127.0.0.1:2379 \ 18 --advertise-client-urls http://172.24.8.31:2379 \ 19 --initial-cluster-token etcd-cluster-1 \ 20 --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3=http://172.24.8.33:2380 \ 21 --initial-cluster-state new 22 23 [Install] 24 WantedBy=multi-user.target 25 [root@etcd1 ~]# systemctl daemon-reload 26 [root@etcd1 ~]# systemctl start etcd.service 27 [root@etcd1 ~]# systemctl enable etcd.service提示:其他節點類似即可。
2.6 關閉集群
1 [root@etcd1 ~]# systemctl stop etcd
提示:
使用systemctl stop etcd 關閉集群, 在重新啟動集群, 之前 etcd 保存的資料不會丟失 要對 etcd 集群進行重置, 最簡單的方式是關閉集群後, 刪除了所有 etcd member 中ETCD_DATA_DIR 配置中定義的目錄下的所有子目錄,然後啟動所有 member 即可。
三 集群管理
3.1 集群成員檢測
1 [root@etcd1 ~]# etcdctl member list
3.2 更新成員url
若成員etcd2的IP地址有變動,需要更新url,則需要執行以下操作:1 [root@etcd3 ~]# ifconfig eth0 2 inet 172.24.8.40 3 [root@etcd3 ~]# vi /lib/systemd/system/etcd.service #將所有舊IP改為最新IP。提示:將所有IP修改為新的IP,若使用命令參數啟動,則在命令參數中修改此IP為新值即可。
1 [root@etcd3 ~]# systemctl restart etcd 2 [root@etcd1 ~]# etcdctl member list #在leader節點查看所有節點
1 [root@etcd1 ~]# etcdctl member update 14ff148c62a24fb2 http://172.24.8.40:2380 #更新對等url提示:錯誤更新的客戶端URL不會影響etcd群集的運行狀況。
3.3 添加新成員
1 [root@localhost ~]# hostnamectl set-hostname etcd4.example.com參考2.3步驟在etcd4.example.com節點安裝etcd。
1 [root@etcd1 ~]# etcdctl member add etcd4 http://172.24.8.34:2380
1 [root@etcd4 ~]# export ETCD_NAME="etcd4" 2 [root@etcd4 ~]# export ETCD_INITIAL_CLUSTER="etcd4=http://172.24.8.34:2380,etcd3=http://172.24.8.40:2380,etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380" 3 [root@etcd4 ~]# export ETCD_INITIAL_CLUSTER_STATE="existing" 4 [root@etcd4 ~]# etcd --listen-client-urls http://172.24.8.34:2379,http://127.0.0.1:2379 --advertise-client-urls http://172.24.8.34:2379 --listen-peer-urls http://172.24.8.34:2380 --initial-advertise-peer-urls http://172.24.8.34:2380 --data-dir /data/etcd 5 [root@etcd1 ~]# etcdctl member list 6 [root@etcd1 ~]# etcdctl cluster-health提示:當使用已刪除成員的數據目錄啟動etcd時,如果etcd連接到集群中的任何活動成員,它將自動退出,可通過以下方式刪除舊member的數據,然後重新啟動:
1 # rm -rf /var/lib/etcd/default.etcd/ 2 # systemctl start etcd
3.4 刪除成員
1 [root@etcd1 ~]# etcdctl member remove 5a6397499417250 2 Removed member 5a6397499417250 from cluster提示:刪除leader是安全的,但是當選出新領導者時,群集將處於非活動狀態。此持續時間通常是選舉超時和投票過程的時間段。