1. 程式人生 > >001.etcd簡介及單節點使用

001.etcd簡介及單節點使用

一 etcd簡介

1.1 概述

etcd 是 CoreOS 團隊發起的開源專案,是一個管理配置資訊和服務發現(service discovery)的專案,它的目標是構建一個高可用的分散式鍵值(key-value)資料庫,基於 Go 語言實現。 特點:
  • 簡單:支援 REST 風格的 HTTP+JSON API
  • 安全:支援 HTTPS 方式的訪問
  • 快速:支援併發 1k/s 的寫操作
  • 可靠:支援分散式結構,基於 Raft 的一致性演算法

延伸:ZooKeeper 是一套分散式系統中進行同步和一致性管理的工具,doozer 則是一個一致性分散式資料庫。Raft 是一套通過選舉主節點來實現分散式系統一致性的演算法。


1.2 互動

etcd 對外通過 HTTP API 對外提供服務,這種方式方便測試(通過 curl 或者其他工具就能和 etcd 互動),也很容易整合到各種語言中(每個語言封裝 HTTP API 實現自己的 client 就行)。

1.3 應用場景

一般情況下,使用者使用 etcd 可以在多個節點上啟動多個例項,並新增它們為一個叢集。同一個叢集中的 etcd 例項將會保持彼此資訊的一致性。 提示:更多使用場景見《002.etcd使用場景》。

二 etcd安裝及執行

2.1 下載並解壓

  1 [[email protected] ~]# wget https://github.com/coreos/etcd/releases/download/v3.3.9/etcd-v3.3.9-linux-amd64.tar.gz
2 [[email protected] ~]# tar xzvf etcd-v3.3.9-linux-amd64.tar.gz 3 [[email protected] ~]# cd etcd-v3.3.9-linux-amd64/ 4 [[email protected] etcd-v3.3.9-linux-amd64]# ls 5 [[email protected] etcd-v3.3.9-linux-amd64]# cp etcd* /usr/local/bin/
01 提示: etcd為服務主檔案,etcdctl為命令客戶端,etcd-migrate負責進行遷移。
提示:二進位制檔案及原始碼https://github.com/coreos/etcd。 也可使用yum安裝:
  1 [[email protected] ~]# yum -y install etcd
使用yum安裝其預設配置檔案為:/etc/etcd/etcd.conf

2.2 etcd執行

  1 [[email protected] ~]# etcd

三 etcd日常使用

3.1 etcd常見命令

  1 [[email protected] ~]# etcdctl set myname "xianghongying"			#設定鍵值
  2 xianghongying
  3 [[email protected] ~]# etcdctl get myname					#獲取鍵值
  4 xianghongying
  5 [[email protected] ~]# curl -L http://localhost:2379/v2/keys/myname	#通過HTTP API獲取

3.2 etcd資料庫操作

資料庫操作圍繞對鍵值和目錄的 CRUD (符合 REST 風格的一套操作:Create)完整生命週期的管理。 etcd 在鍵的組織上採用了層次化的空間結構(類似於檔案系統中目錄的概念),使用者指定的鍵可以為單獨的名字,如 myname,此時實際上放在根目錄 / 下面,也可以為指定目錄結構,如 cluster1/node2/testkey,則將建立相應的目錄結構。 提示:CRUD 即 Create, Read, Update, Delete,是符合 REST 風格的一套 API 操作。
  • 建立鍵值
  1 [[email protected] ~]# etcdctl set /etcdb/myself/name "Xiang HongYing"
  2 選項:
  3 --ttl '0'			#該鍵值的超時時間(單位為秒),不配置(預設為 0)則永不超時
  4 --swap-with-value value		#若該鍵現在的值是 value,則進行設定操作
  5 --swap-with-index '0'		#若該鍵現在的索引值是指定索引,則進行設定操作
  • 獲取鍵值
  1 [[email protected] ~]# etcdctl get /etcdb/myself/name
  2 選項:
  3 --sort				#對結果進行排序
  4 --consistent			#將請求發給主節點,保證獲取內容的一致性
  • 獲取鍵值,包含更詳細的元資料
  1 [[email protected] ~]# etcdctl get -o extended /etcdb/myself/name
  • 設定TTL
獲取ttl,過期後會自動刪除
  1 [[email protected] ~]# etcdctl set /etcdb/myself/name --ttl 5
  • 更新鍵值
  1 [[email protected] ~]# etcdctl update /etcdb/myself/name "Xiao XianNv"
  2 [[email protected] ~]# etcdctl get /etcdb/myself/name
  3 選項:
  4 --ttl '0'			#超時時間(單位為秒),不配置(預設為 0)則永不超時
  • 條件更新鍵值
如果/etcdb/myself/name鍵值為"Xiao XianNv",則更新為"Xiang HongYing"
  1 [[email protected] ~]# etcdctl set --swap-with-value "Xiao XianNv" /etcdb/myself/name "Xiang HongYing"
  • 更新ttl
  1 [[email protected] ~]# etcdctl update --ttl 3 /etcdb/myself/name "Xiao XianNv"
  • 刪除鍵值
  1 [[email protected] ~]# etcdctl rm /etcdb/myself/name
  2 選項:
  3 --dir			#如果鍵是個空目錄或者鍵值對則刪除
  4 --recursive			#刪除目錄和所有子鍵
  5 --with-value		#檢查現有的值是否匹配
  6 --with-index '0'		#檢查現有的 index 是否匹配
  • 條件刪除鍵值
  1 [[email protected] ~]# etcdctl rm --with-value "Xiao XianNv" /etcdb/myself/name
  • 條件建立鍵值
  1 [[email protected] ~]# etcdctl mk /etcdb/myself/age "25"
02 若設定的鍵不存在,則建立一個新的鍵值,當鍵存在的時候,執行該命令會報錯。 選項:
  1 --ttl '0'			#超時時間(單位為秒),不配置(預設為 0)則永不超時
  • 自動建立排序的 key
  1 [[email protected] ~]# etcdctl mk --in-order /etcdb/myself/member zhangsan
  2 [[email protected] ~]# etcdctl mk --in-order /etcdb/myself/member lisi
  • 建立目錄
  1 [[email protected] ~]# etcdctl setdir testetcd2
  2 選項:
  3 --ttl '0'			#超時時間(單位為秒),不配置(預設為 0)則永不超時
建立一個鍵目錄,無論存在與否。
  • 更新目錄
  1 [[email protected] ~]# etcdctl updatedir testetcd2
  2 --ttl '0'			#超時時間(單位為秒),不配置(預設為 0)則永不超時
  • 條件建立目錄
若設定的鍵不存在,則建立一個新的鍵值,當鍵存在的時候,執行該命令會報錯。
  1 [[email protected] ~]# etcdctl mkdir testetcd
  2 選項:
  3 --ttl '0'			#超時時間(單位為秒),不配置(預設為 0)則永不超時
03
  • 刪除空目錄或鍵值
  1 [[email protected] ~]# etcdctl rmdir /testetcd2		#刪除非空目錄
  2 [[email protected] ~]# etcdctl rmdir /etcdb/myself
  3 Error:  108: Directory not empty (/etcdb/myself) [16]
  4 [[email protected] ~]# etcdctl get /etcdb/myself/age	#刪除鍵值
提示:若目錄不空,會報錯。
  • 列出目錄或鍵
  1 [[email protected]st ~]# etcdctl ls
  2 [[email protected] ~]# etcdctl ls etcdb
04
  1 選項:
  2 --sort				#將輸出結果排序
  3 --recursive				#如果目錄下有子目錄,則遞迴輸出其中的內容
  4 -p					#對於輸出為目錄,在最後新增 `/` 進行區分
提示:列出目錄(預設為根目錄)下的鍵或者子目錄,預設不顯示子目錄中內容。

3.3 非資料庫操作

  • 備份etcd資料庫
  1 [[email protected] ~]# etcdctl backup --data-dir /var/lib/etcd/default.etcd --backup-dir /tmp
  2 選項:
  3 --data-dir				#etcd 的資料目錄
  4 --backup-dir			#備份到指定路徑
提示:etcd預設資料檔案儲存路徑為:/var/lib/etcd/default.etcd。
  • 監控鍵值
監測一個鍵值的變化,一旦鍵值發生更新,就會輸出最新的值並退出。
  1 [[email protected] ~]# etcdctl watch /etcdb/myself/name
  2 [[email protected] ~]# etcdctl set /etcdb/myself/name "Xiang HongYing"
  3 [[email protected] ~]# etcdctl update /etcdb/myself/name "Xiao XianNv"
05 選項:
  1 --forever				#一直監測,直到使用者按 `CTRL+C` 退出
  2 --after-index '0'			#在指定 index 之前一直監測
  3 --recursive				#返回所有的鍵值和子鍵值
  • 條件監控鍵值
  1 [[email protected] ~]# etcdctl exec-watch /etcdb/myself/name -- sh -c 'etcdctl ls'
  2 [[email protected] ~]# etcdctl set /etcdb/myself/name "Xiang HongYing"
  3 [[email protected] ~]# etcdctl update /etcdb/myself/name "Xiao XianNv"
06 監測一個鍵值的變化,一旦鍵值發生更新,就執行給定命令。
  1 選項:
  2 --after-index '0'			#在指定 index 之前一直監測
  3 --recursive				#返回所有的鍵值和子鍵值
  • 一直監控
一直監聽,除非 `CTL + C` 導致退出監聽
  1 [[email protected] ~]# etcdctl watch --forever /etcdb/myself/name

3.4 成員管理

  • 檢視成員
  1 [[email protected] ~]# etcdctl member list
  • 新增成員
  1 [[email protected] ~]# etcdctl member add node2 http://172.24.8.101:2380
  • 刪除成員
  1 [[email protected] ~]# etcdctl member remove 8e9e05c52164694d
  • 更新成員peerURLS
  1 [[email protected] ~]# etcdctl member update node2 http://172.24.8.102:2380

四 其他命令

  1 [[email protected] ~]# etcdctl cluster-health		#叢集健康檢查
  2 [[email protected] ~]# etcdctl --version		#檢視etcd版本
  3 [[email protected] ~]# etcdctl --help			#獲取幫助
  4 [[email protected] ~]# etcdctl cluster-health		#檢視叢集狀態
  • --debug #輸出 cURL 命令,顯示執行命令的時候發起的請求
  • --no-sync            #發出請求之前不同步叢集資訊
  • --output, -o 'simple' #輸出內容的格式 (simple 為原始資訊,json 為進行json格式解碼,易讀性更佳)
  • --peers, -C            #指定叢集中的同伴資訊,用逗號隔開 (預設為: “127.0.0.1:4001”)
  • --cert-file                   #HTTPS 下客戶端使用的 SSL 證書檔案
  • --key-file            #HTTPS 下客戶端使用的 SSL 金鑰檔案
  • --ca-file #服務端使用 HTTPS 時,使用 CA 檔案進行驗證
  • --help, -h            #顯示幫助命令資訊
  • --version, -v #列印版本資訊

五 常見配置

5.1 設定配置

預設配置檔案為/etc/etcd/etcd.conf。
配置引數 引數說明
--name etcd叢集中的節點名,預設為 default,可自定義, 在叢集中該名稱必須唯一,建議使用 hostname。
--data-dir 服務執行資料儲存的路徑,儲存日誌和快照的目錄,預設為 ${name}.etcd。
--snapshot-count 指定有多少事務(transaction)被提交時,觸發擷取快照儲存到磁碟。
--heartbeat-interval leader 多久傳送一次心跳到 followers。預設值是 100ms。
--eletion-timeout 重新投票的超時時間,如果 follow 在該時間間隔沒有收到心跳包,會觸發重新投票,預設為 1000 ms。
--addr 公佈的ip地址和埠。 預設為127.0.0.1:2379
--bind-addr 用於客戶端連線的監聽地址,預設為-addr配置
--peers 叢集成員逗號分隔的列表,例如 127.0.0.1:2380,127.0.0.1:2381
--peer-addr 叢集服務通訊的公佈的IP地址,預設為 127.0.0.1:2380.
--peer-bind-addr 叢集服務通訊的監聽地址,預設為-peer-addr配置
--wal-dir 指定節點的was檔案的儲存目錄,若指定了該引數,wal檔案會和其他資料檔案分開儲存
--listen-client-urls 監聽的用於客戶端通訊的url,對外提供服務的地址,客戶端會連線到這裡和 etcd 互動,同樣可以監聽多個。
--listen-peer-urls 監聽的用於節點之間通訊的url,可監聽多個,叢集內部將通過這些url進行資料互動(如選舉,資料同步等),需要所有節點都能夠訪問,叢集中不能為localhost。
--initial-advertise-peer-urls 建議用於節點之間通訊的url,節點間將以該值進行通訊。
--advertise-client-urls 建議使用的客戶端通訊url,該值用於etcd代理或etcd成員與etcd節點通訊,即服務的url。
--initial-cluster-token 叢集的ID,建立叢集的 token,這個值每個叢集保持唯一。這樣的話,如果你要重新建立叢集,即使配置和之前一樣,也會再次生成新的叢集和節點 uuid;否則會導致多個叢集之間的衝突,造成未知的錯誤.
--initial-cluster 叢集中所有節點的資訊,即叢集中所有的initial-advertise-peer-urls 的合集。
--initial-cluster-state -initial-cluster-state=new 表示從無到有搭建etcd叢集。 新建叢集時,值為 new;若已經存在的叢集,值為 existing
--discovery-srv 用於DNS動態服務發現,指定DNS SRV域名。
--discovery 用於etcd動態發現,指定etcd發現服務的URL [https://discovery.etcd.io/],用環境變量表示。
提示: 所有以 --init 開頭的配置都是在 bootstrap 叢集的時候才會用到,後續節點的重啟會被忽略; 所有的引數也可以通過環境變數進行設定,如--my-flag 對應環境變數的 ETCD_MY_FLAG; 命令列指定的引數會覆蓋環境變數對應的值。

六 v2和v3的區別

  1 export ETCDCTL_API=3					#宣告API版本為v3
v3相關不一致命令如下:
  • 建立、更新key
  1 etcdctl put /etcdb/myself/name "Xiao XianNv"
  2 etcdctl put /etcdb/myself/name Xiang HongYing"
  • 刪除key
  1 etcdctl del /etcdb/myself/name
  2 etcdctl del  /etcdb/myself/name --prefix		#刪除所有name字首的節點
  • 查詢key
  1 etcdctl get /etcdb/myself/name
  2 etcdctl get /etcdb/myself/name --prefix			#查詢所有name字首的鍵值
  • 監控鍵值
  1 etcdctl watch  /etcdb/myself/name
  2 etcdctl watch  /etcdb/myself --prefix			#監聽子節點
  • 申請租約
  1 etcdctl lease grant 40					#從申請開始計算時間
  • 授權租約
  1 etcdctl put --lease=4e5e5b853f528859 /etcdb/myself/name Xiang HongYing"    #節點的生命伴隨著租約到期將會被DELETE
  • 撤銷租約
  1 etcdctl lease revoke 4e5e5b853f5286cc			#撤銷租約和租約到期一樣,節點都會被刪除
  • 租約續約
  1 etcdctl lease keep-alive 4e5e5b853f52892b		#每當到期將會續約