1. 程式人生 > >二進位制檔案安裝安裝etcd

二進位制檔案安裝安裝etcd

 

 

 利用二進位制檔案安裝安裝etcd

etcd元件作為一個高可用強一致性的服務發現儲存倉庫.

etcd作為一個受到ZooKeeper與doozer啟發而催生的專案,除了擁有與之類似的功能外,更專注於以下四點。

簡單:基於HTTP+JSON的API讓你用curl就可以輕鬆使用。

安全:可選SSL客戶認證機制。

快速:每個例項每秒支援一千次寫操作。

可信:使用Raft演算法充分實現了分散式。

場景一:服務發現(Service Discovery)

  1. 一個強一致性、高可用的服務儲存目錄。基於Raft演算法的etcd天生就是這樣一個強一致性高可用的服務儲存目錄。
  2. 一種註冊服務和監控服務健康狀態的機制。使用者可以在etcd中註冊服務,並且對註冊的服務設定key TTL,定時保持服務的心跳以達到監控健康狀態的效果。
  3. 一種查詢和連線服務的機制。通過在etcd指定的主題下注冊的服務也能在對應的主題下查詢到。為了確保連線,我們可以在每個服務機器上都部署一個Proxy模式的etcd,這樣就可以確保能訪問etcd叢集的服務都能互相連線。

微服務協同工作架構中,服務動態新增。隨著Docker容器的流行,多種微服務共同協作,構成一個相對功能強大的架構的案例越來越多。透明化的動態新增這些服務的需求也日益強烈。通過服務發現機制,在etcd中註冊某個服務名字的目錄,在該目錄下儲存可用的服務節點的IP。在使用服務的過程中,只要從服務目錄下查詢可用的服務節點去使用即可。

PaaS平臺中應用多例項與例項故障重啟透明化。PaaS平臺中的應用一般都有多個例項,通過域名,不僅可以透明的對這多個例項進行訪問,而且還可以做到負載均衡。但是應用的某個例項隨時都有可能故障重啟,這時就需要動態的配置域名解析(路由)中的資訊。通過etcd的服務發現功能就可以輕鬆解決這個動態配置的問題。

 

場景二:訊息釋出與訂閱

在分散式系統中,最適用的一種元件間通訊方式就是訊息釋出與訂閱。即構建一個配置共享中心,資料提供者在這個配置中心釋出訊息,而訊息使用者則訂閱他們關心的主題,一旦主題有訊息釋出,就會實時通知訂閱者。通過這種方式可以做到分散式系統配置的集中式管理與動態更新。

應用中用到的一些配置資訊放到etcd上進行集中管理。這類場景的使用方式通常是這樣:應用在啟動的時候主動從etcd獲取一次配置資訊,同時,在etcd節點上註冊一個Watcher並等待,以後每次配置有更新的時候,etcd都會實時通知訂閱者,以此達到獲取最新配置資訊的目的。

  • 分散式搜尋服務中,索引的元資訊和伺服器叢集機器的節點狀態存放在etcd中,供各個客戶端訂閱使用。使用etcd的key TTL功能可以確保機器狀態是實時更新的。
  • 分散式日誌收集系統。這個系統的核心工作是收集分佈在不同機器的日誌。收集器通常是按照應用(或主題)來分配收集任務單元,因此可以在etcd上建立一個以應用(主題)命名的目錄P,並將這個應用(主題相關)的所有機器ip,以子目錄的形式儲存到目錄P上,然後設定一個etcd遞迴的Watcher,遞迴式的監控應用(主題)目錄下所有資訊的變動。這樣就實現了機器IP(訊息)變動的時候,能夠實時通知到收集器調整任務分配。
  • 系統中資訊需要動態自動獲取與人工干預修改資訊請求內容的情況。通常是暴露出介面,例如JMX介面,來獲取一些執行時的資訊。引入etcd之後,就不用自己實現一套方案了,只要將這些資訊存放到指定的etcd目錄中即可,etcd的這些目錄就可以通過HTTP的介面在外部訪問

場景三:負載均衡

場景一中也提到了負載均衡,本文所指的負載均衡均為軟負載均衡。分散式系統中,為了保證服務的高可用以及資料的一致性,通常都會把資料和服務部署多份,以此達到對等服務,即使其中的某一個服務失效了,也不影響使用。由此帶來的壞處是資料寫入效能下降,而好處則是資料訪問時的負載均衡。因為每個對等服務節點上都存有完整的資料,所以使用者的訪問流量就可以分流到不同的機器上。

etcd本身分散式架構儲存的資訊訪問支援負載均衡。etcd叢集化以後,每個etcd的核心節點都可以處理使用者的請求。所以,把資料量小但是訪問頻繁的訊息資料直接儲存到etcd中也是個不錯的選擇,如業務系統中常用的二級程式碼表(在表中儲存程式碼,在etcd中儲存程式碼所代表的具體含義,業務系統呼叫查表的過程,就需要查詢表中程式碼的含義)。

利用etcd維護一個負載均衡節點表。etcd可以監控一個叢集中多個節點的狀態,當有一個請求發過來後,可以輪詢式的把請求轉發給存活著的多個狀態。類似KafkaMQ,通過ZooKeeper來維護生產者和消費者的負載均衡。同樣也可以用etcd來做ZooKeeper的工作。

 

場景四:分散式通知與協調

這裡說到的分散式通知與協調,與訊息釋出和訂閱有些相似。都用到了etcd中的Watcher機制,通過註冊與非同步通知機制,實現分散式環境下不同系統之間的通知與協調,從而對資料變更做到實時處理。實現方式通常是這樣:不同系統都在etcd上對同一個目錄進行註冊,同時設定Watcher觀測該目錄的變化(如果對子目錄的變化也有需要,可以設定遞迴模式),當某個系統更新了etcd的目錄,那麼設定了Watcher的系統就會收到通知,並作出相應處理。

通過etcd進行低耦合的心跳檢測。檢測系統和被檢測系統通過etcd上某個目錄關聯而非直接關聯起來,這樣可以大大減少系統的耦合性。

通過etcd完成系統排程。某系統有控制檯和推送系統兩部分組成,控制檯的職責是控制推送系統進行相應的推送工作。管理人員在控制檯作的一些操作,實際上是修改了etcd上某些目錄節點的狀態,而etcd就把這些變化通知給註冊了Watcher的推送系統客戶端,推送系統再作出相應的推送任務。

通過etcd完成工作彙報。大部分類似的任務分發系統,子任務啟動後,到etcd來註冊一個臨時工作目錄,並且定時將自己的進度進行彙報(將進度寫入到這個臨時目錄),這樣任務管理者就能夠實時知道任務進度。

 

場景五:分散式鎖

因為etcd使用Raft演算法保持了資料的強一致性,某次操作儲存到叢集中的值必然是全域性一致的,所以很容易實現分散式鎖。鎖服務有兩種使用方式,一是保持獨佔,二是控制時序。

保持獨佔即所有獲取鎖的使用者最終只有一個可以得到。etcd為此提供了一套實現分散式鎖原子操作CAS(CompareAndSwap)的API。通過設定prevExist值,可以保證在多個節點同時去建立某個目錄時,只有一個成功。而建立成功的使用者就可以認為是獲得了鎖。

控制時序,即所有想要獲得鎖的使用者都會被安排執行,但是獲得鎖的順序也是全域性唯一的,同時決定了執行順序。etcd為此也提供了一套API(自動建立有序鍵),對一個目錄建值時指定為POST動作,這樣etcd會自動在目錄下生成一個當前最大的值為鍵,儲存這個新的值(客戶端編號)。同時還可以使用API按順序列出所有當前目錄下的鍵值。此時這些鍵的值就是客戶端的時序,而這些鍵中儲存的值可以是代表客戶端的編號。

場景六:分散式佇列

分散式佇列的常規用法與場景五中所描述的分散式鎖的控制時序用法類似,即建立一個先進先出的佇列,保證順序。

另一種比較有意思的實現是在保證佇列達到某個條件時再統一按順序執行。這種方法的實現可以在/queue這個目錄中另外建立一個/queue/condition節點。

condition可以表示佇列大小。比如一個大的任務需要很多小任務就緒的情況下才能執行,每次有一個小任務就緒,就給這個condition數字加1,直到達到大任務規定的數字,再開始執行佇列裡的一系列小任務,最終執行大任務。

condition可以表示某個任務在不在佇列。這個任務可以是所有排序任務的首個執行程式,也可以是拓撲結構中沒有依賴的點。通常,必須執行這些任務後才能執行佇列中的其他任務。

condition還可以表示其它的一類開始執行任務的通知。可以由控制程式指定,當condition出現變化時,開始執行佇列任務。

 

場景七:叢集監控與Leader競選

通過etcd來進行監控實現起來非常簡單並且實時性強。

前面幾個場景已經提到Watcher機制,當某個節點消失或有變動時,Watcher會第一時間發現並告知使用者。

節點可以設定TTL key,比如每隔30s傳送一次心跳使代表該機器存活的節點繼續存在,否則節點消失。

這樣就可以第一時間檢測到各節點的健康狀態,以完成叢集的監控要求。

另外,使用分散式鎖,可以完成Leader競選。這種場景通常是一些長時間CPU計算或者使用IO操作的機器,只需要競選出的Leader計算或處理一次,就可以把結果複製給其他的Follower。從而避免重複勞動,節省計算資源。

這個的經典場景是搜尋系統中建立全量索引。如果每個機器都進行一遍索引的建立,不但耗時而且建立索引的一致性不能保證。通過在etcd的CAS機制同時建立一個節點,建立成功的機器作為Leader,進行索引計算,然後把計算結果分發到其它節點。

場景八:為什麼用etcd而不用ZooKeeper?

ZooKeeper的部署維護複雜,管理員需要掌握一系列的知識和技能;

而etcd其優點也很明顯。

簡單。使用Go語言編寫部署簡單;使用HTTP作為介面使用簡單;使用Raft演算法保證強一致性讓使用者易於理解。

資料持久化。etcd預設資料一更新就進行持久化。

安全。etcd支援SSL客戶端安全認證。

 

# 安裝etcd  master node01 node02執行
mkdir -p /opt/kubernetes/{bin,cfg,ssl}
vim /opt/kubernetes/cfg/etcd.conf
#[menmber]
ETCD_NAME="etcd01" #分別修改為修改為master node01 ndoe02的名稱
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.1.251:2380"  #分別修改為修改為master node01 ndoe02的IP
ETCD_LISTEN_CLIENT_URLS="https://192.168.1.251:2379" #分別修改為修改為master node01 ndoe02的IP

#[clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.1.251:2380" #分別修改為修改為master node01 ndoe02的IP
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.1.251:2379" #分別修改為修改為master node01 ndoe02的IP
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.1.251:2380,etcd02=https://192.168.1.252:2380,etcd03=https://192.168.1.253:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
vim /opt/kubernetes/cfg/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=-/opt/kubernetes/cfg/etcd.conf
ExecStart=/opt/kubernetes/bin/etcd \
--name=${ETCD_NAME} \
--data-dir=${ETCD_DATA_DIR} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--initial-cluster=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-state=new \
--cert-file=/opt/kubernetes/ssl/server.pem \
--key-file=/opt/kubernetes/ssl/server-key.pem \
--peer-cert-file=/opt/kubernetes/ssl/server.pem \
--peer-key-file=/opt/kubernetes/ssl/server-key.pem \
--trusted-ca-file=/opt/kubernetes/ssl/ca.pem \
--peer-trusted-ca-file=/opt/kubernetes/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

#新增免密登入
ssh-keygen -t rsa
ssh-copy-id root@node01
ssh-copy-id root@node02
#新增啟動檔案
cp /opt/kubernetes/cfg/etcd.service /usr/lib/systemd/system/etcd.service
#安裝etcd
tar zxvf etcd-v3.2.24-linux-amd64.tar.gz
cp etcd-v3.2.24-linux-amd64/etcd* /opt/kubernetes/bin
#複製證書檔案到指定目錄
cp ca-key.pem server.pem ca.pem server-key.pem /opt/kubernetes/ssl
#啟動etcd
systemctl start etcd
systemctl enable etcd
#檢視日誌
tail -f /var/log/messages
#測試
etcdctl --ca-file=/opt/kubernetes/ssl/ca.pem --cert-file=/opt/kubernetes/ssl/server.pem --key-file=/opt/kubernetes/ssl/server-key.pem --endpoints="https://192.168.1.251:2379,https://192.168.1.252:2379,https://192.168.1.253:2379" cluster-health

 

&n