一 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 [root@etcdhost ~]# wget https://github.com/coreos/etcd/releases/download/v3.3.9/etcd-v3.3.9-linux-amd64.tar.gz 2 [root@etcdhost ~]# tar xzvf etcd-v3.3.9-linux-amd64.tar.gz 3 [root@etcdhost ~]# cd etcd-v3.3.9-linux-amd64/ 4 [root@etcdhost etcd-v3.3.9-linux-amd64]# ls 5 [root@etcdhost etcd-v3.3.9-linux-amd64]# cp etcd* /usr/local/bin/
提示: etcd為服務主文件,etcdctl為命令客戶端,etcd-migrate負責進行遷移。
提示:二進制文件及源碼https://github.com/coreos/etcd。
也可使用yum安裝:
1 [root@etcdhost ~]# yum -y install etcd
使用yum安裝其默認配置文件為:/etc/etcd/etcd.conf
2.2 etcd運行
1 [root@etcdhost ~]# etcd
三 etcd日常使用
3.1 etcd常見命令
1 [root@etcdhost ~]# etcdctl set myname "xianghongying" #設置鍵值 2 xianghongying 3 [root@etcdhost ~]# etcdctl get myname #獲取鍵值 4 xianghongying 5 [root@etcdhost ~]# 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 [root@etcdhost ~]# etcdctl set /etcdb/myself/name "Xiang HongYing" 2 選項: 3 --ttl '0' #該鍵值的超時時間(單位為秒),不配置(默認為 0)則永不超時 4 --swap-with-value value #若該鍵現在的值是 value,則進行設置操作 5 --swap-with-index '0' #若該鍵現在的索引值是指定索引,則進行設置操作
- 獲取鍵值
1 [root@etcdhost ~]# etcdctl get /etcdb/myself/name 2 選項: 3 --sort #對結果進行排序 4 --consistent #將請求發給主節點,保證獲取內容的一致性
- 獲取鍵值,包含更詳細的元數據
1 [root@etcdhost ~]# etcdctl get -o extended /etcdb/myself/name
- 設置TTL
獲取ttl,過期后會自動刪除
1 [root@etcdhost ~]# etcdctl set /etcdb/myself/name --ttl 5
- 更新鍵值
1 [root@etcdhost ~]# etcdctl update /etcdb/myself/name "Xiao XianNv" 2 [root@etcdhost ~]# etcdctl get /etcdb/myself/name 3 選項: 4 --ttl '0' #超時時間(單位為秒),不配置(默認為 0)則永不超時
- 條件更新鍵值
如果/etcdb/myself/name鍵值為"Xiao XianNv",則更新為"Xiang HongYing"
1 [root@etcdhost ~]# etcdctl set --swap-with-value "Xiao XianNv" /etcdb/myself/name "Xiang HongYing"
- 更新ttl
1 [root@etcdhost ~]# etcdctl update --ttl 3 /etcdb/myself/name "Xiao XianNv"
- 刪除鍵值
1 [root@etcdhost ~]# etcdctl rm /etcdb/myself/name 2 選項: 3 --dir #如果鍵是個空目錄或者鍵值對則刪除 4 --recursive #刪除目錄和所有子鍵 5 --with-value #檢查現有的值是否匹配 6 --with-index '0' #檢查現有的 index 是否匹配
- 條件刪除鍵值
1 [root@etcdhost ~]# etcdctl rm --with-value "Xiao XianNv" /etcdb/myself/name
- 條件創建鍵值
1 [root@etcdhost ~]# etcdctl mk /etcdb/myself/age "25"
若設置的鍵不存在,則創建一個新的鍵值,當鍵存在的時候,執行該命令會報錯。
選項:
1 --ttl '0' #超時時間(單位為秒),不配置(默認為 0)則永不超時
- 自動創建排序的 key
1 [root@etcdhost ~]# etcdctl mk --in-order /etcdb/myself/member zhangsan 2 [root@etcdhost ~]# etcdctl mk --in-order /etcdb/myself/member lisi
- 創建目錄
1 [root@etcdhost ~]# etcdctl setdir testetcd2 2 選項: 3 --ttl '0' #超時時間(單位為秒),不配置(默認為 0)則永不超時
創建一個鍵目錄,無論存在與否。
- 更新目錄
1 [root@etcdhost ~]# etcdctl updatedir testetcd2 2 --ttl '0' #超時時間(單位為秒),不配置(默認為 0)則永不超時
- 條件創建目錄
若設置的鍵不存在,則創建一個新的鍵值,當鍵存在的時候,執行該命令會報錯。
1 [root@etcdhost ~]# etcdctl mkdir testetcd 2 選項: 3 --ttl '0' #超時時間(單位為秒),不配置(默認為 0)則永不超時
- 刪除空目錄或鍵值
1 [root@etcdhost ~]# etcdctl rmdir /testetcd2 #刪除非空目錄 2 [root@etcdhost ~]# etcdctl rmdir /etcdb/myself 3 Error: 108: Directory not empty (/etcdb/myself) [16] 4 [root@etcdhost ~]# etcdctl get /etcdb/myself/age #刪除鍵值
提示:若目錄不空,會報錯。
- 列出目錄或鍵
1 [root@etcdhost ~]# etcdctl ls 2 [root@etcdhost ~]# etcdctl ls etcdb
1 選項: 2 --sort #將輸出結果排序 3 --recursive #如果目錄下有子目錄,則遞歸輸出其中的內容 4 -p #對於輸出為目錄,在最后添加 `/` 進行區分
提示:列出目錄(默認為根目錄)下的鍵或者子目錄,默認不顯示子目錄中內容。
3.3 非數據庫操作
- 備份etcd數據庫
1 [root@etcdhost ~]# 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 [root@etcdhost ~]# etcdctl watch /etcdb/myself/name 2 [root@etcdhost ~]# etcdctl set /etcdb/myself/name "Xiang HongYing" 3 [root@etcdhost ~]# etcdctl update /etcdb/myself/name "Xiao XianNv"
選項:
1 --forever #一直監測,直到用戶按 `CTRL+C` 退出 2 --after-index '0' #在指定 index 之前一直監測 3 --recursive #返回所有的鍵值和子鍵值
- 條件監控鍵值
1 [root@etcdhost ~]# etcdctl exec-watch /etcdb/myself/name -- sh -c 'etcdctl ls' 2 [root@etcdhost ~]# etcdctl set /etcdb/myself/name "Xiang HongYing" 3 [root@etcdhost ~]# etcdctl update /etcdb/myself/name "Xiao XianNv"
監測一個鍵值的變化,一旦鍵值發生更新,就執行給定命令。
1 選項: 2 --after-index '0' #在指定 index 之前一直監測 3 --recursive #返回所有的鍵值和子鍵值
- 一直監控
一直監聽,除非 `CTL + C` 導致退出監聽
1 [root@etcdhost ~]# etcdctl watch --forever /etcdb/myself/name
3.4 成員管理
- 查看成員
1 [root@etcdhost ~]# etcdctl member list
- 添加成員
1 [root@etcdhost ~]# etcdctl member add node2 http://172.24.8.101:2380
- 刪除成員
1 [root@etcdhost ~]# etcdctl member remove 8e9e05c52164694d
- 更新成員peerURLS
1 [root@etcdhost ~]# etcdctl member update node2 http://172.24.8.102:2380
四 其他命令
1 [root@etcdhost ~]# etcdctl cluster-health #集群健康檢查 2 [root@etcdhost ~]# etcdctl --version #查看etcd版本 3 [root@etcdhost ~]# etcdctl --help #獲取幫助 4 [root@etcdhost ~]# 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。
提示:
所有以 --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 #每當到期將會續約