001.etcd簡介及單節點使用
阿新 • • 發佈:2018-11-07
一 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提示: etcd為服務主檔案,etcdctl為命令客戶端,etcd-migrate負責進行遷移。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/
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
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)則永不超時
- 條件更新鍵值
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"若設定的鍵不存在,則建立一個新的鍵值,當鍵存在的時候,執行該命令會報錯。 選項:
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)則永不超時
- 刪除空目錄或鍵值
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
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"選項:
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"監測一個鍵值的變化,一旦鍵值發生更新,就執行給定命令。
1 選項: 2 --after-index '0' #在指定 index 之前一直監測 3 --recursive #返回所有的鍵值和子鍵值
- 一直監控
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。六 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 #每當到期將會續約