etcd 常用操作介紹

KevinYan發表於2019-11-28

安裝

最簡單的安裝方法是直接去etcd GitHub的Release頁下載預編譯好的二進位制檔案。etcd官方為各個系統提供了不同的二進位制檔案,供開發者根據自己的系統去下載。

下載地址:https://github.com/etcd-io/etcd/releases

下載完成解壓後,目錄中有兩個二進位制檔案,etcd以及etcdctl。其中etcd就是執行etcd服務的二進位制檔案,etcdctl是官方提供的命令列etcd客戶端,使用etcdctl可以在命令列中訪問etcd服務。

etcdetcdctl這兩個檔案軟鏈到系統環境變數$PATH對應的目錄下,方便服務啟動,當然試驗目的直接把工作目錄切換到剛才下載的目錄直接執行兩個檔案即可。

我從GitHub上下載了MacOS對應的etcd檔案,執行下面的命令可以看到etcd的版本

➜  etcd-v3.3.17-darwin-amd64 ./etcd --version
etcd Version: 3.3.17
Git SHA: 6d8052314
Go Version: go1.12.9
Go OS/Arch: darwin/amd64
➜  etcd-v3.3.17-darwin-amd64 

執行

直接執行etcd指令在電腦上啟動和執行etcd服務

......
2019-10-22 13:15:32.244300 I | embed: listening for peers on http://localhost:2380
2019-10-22 13:15:32.244466 I | embed: listening for client requests on localhost:2379
......

透過啟動命令的輸出日誌中可以找到兩行關鍵的資訊,etcd服務啟動後提供給外部客戶端通訊的埠是2379,而etcd服務中成員間的通訊埠是2380(Peer是對同一個 etcd 叢集中另外一個 Member 的稱呼)。

啟動命令時比較重要的options:

-name 節點名稱,預設是UUID
-data-dir 儲存日誌和快照的目錄,預設為當前工作目錄
-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配置

上述配置也可以設定配置檔案,預設為/etc/etcd/etcd.conf

使用etcd

etcdctl是一個命令列的客戶端,它提供了一下簡潔的命令,可以方便我們在對服務進行測試或者手動修改資料庫內容。建議剛剛接觸etcd的同學可以先透過etcdctl來熟悉相關操作。這些操作跟etcd提供的HTTP API是對應的。

透過-h選項可以看到etcdctl支援的操作。

➜  etcd-v3.3.17-darwin-amd64 ./etcdctl -h
NAME:
   etcdctl - A simple command line client for etcd.
......

VERSION:
   3.3.17

COMMANDS:
     backup          backup an etcd directory
     cluster-health  check the health of the etcd cluster
     mk              make a new key with a given value
     mkdir           make a new directory
     rm              remove a key or a directory
     rmdir           removes the key if it is an empty directory or a key-value pair
     get             retrieve the value of a key
     ls              retrieve a directory
     set             set the value of a key
     setdir          create a new directory or update an existing directory TTL
     update          update an existing key with a given value
     updatedir       update an existing directory
     watch           watch a key for changes
     exec-watch      watch a key for changes and exec an executable
     member          member add, remove and list subcommands
     user            user add, grant and revoke subcommands
     role            role add, grant and revoke subcommands
     auth            overall auth controls
     help, h         Shows a list of commands or help for one command

這些操作命令基本上分為鍵值庫操作命令和行為控制命令。

鍵值庫操作

set

設定鍵(或者叫主題)的值

➜  etcd-v3.3.17-darwin-amd64 ./etcdctl set /root/test/keyOne "Hello etcd"
Hello etcd
➜  etcd-v3.3.17-darwin-amd64 

支援的選項包括:

--ttl '0'            該鍵值的超時時間(單位為秒),不配置(預設為 0)則永不超時
--swap-with-value value 若該鍵現在的值是 value,則進行設定操作
--swap-with-index '0'    若該鍵現在的索引值是指定索引,則進行設定操作

get

獲取給定鍵的值

➜  etcd-v3.3.17-darwin-amd64 ./etcdctl get /root/test/keyOne          
Hello etcd
➜  etcd-v3.3.17-darwin-amd64 

當嘗試獲取不存的值時會報錯

➜  etcd-v3.3.17-darwin-amd64 ./etcdctl get /root/test/keyTwo
Error:  100: Key not found (/root/test/keyTwo) [11]
➜  etcd-v3.3.17-darwin-amd64 

支援的選項為

--sort    對結果進行排序
--consistent 將請求發給主節點,保證獲取內容的一致性

update

更新給定鍵中儲存的值

➜  etcd-v3.3.17-darwin-amd64 ./etcdctl update /root/test/keyOne "Hello World"
Hello World
➜  etcd-v3.3.17-darwin-amd64 

同樣嘗試更新不存在的值時會報錯

➜  etcd-v3.3.17-darwin-amd64 ./etcdctl update /root/test/keyTwo "Hello World"
Error:  100: Key not found (/root/test/keyTwo) [11]

支援的選項為

--ttl '0'    超時時間(單位為秒),不配置(預設為 0)則永不超時

rm

刪除給定的鍵,如果命令引數中給定的鍵不存在則會報錯

➜  etcd-v3.3.17-darwin-amd64 ./etcdctl rm /root/test/keyOne              
PrevNode.Value: Hello World
➜  etcd-v3.3.17-darwin-amd64 
--dir        如果鍵是個空目錄或者鍵值對則刪除
--recursive        刪除目錄和所有子鍵
--with-value     檢查現有的值是否匹配
--with-index '0'    檢查現有的 index 是否匹配

setdir

建立一個目錄,無論存在與否。

支援的選項為

--ttl '0'    超時時間(單位為秒),不配置(預設為 0)則永不超時

updatedir

更新一個已經存在的目錄。 支援的選項為

--ttl '0'    超時時間(單位為秒),不配置(預設為 0)則永不超時

ls

列出目錄(預設為根目錄)下的鍵或者子目錄,預設不顯示子目錄中內容。

支援的選項包括

--sort    將輸出結果排序
--recursive    如果目錄下有子目錄,則遞迴輸出其中的內容
-p        對於輸出為目錄,在最後新增 `/` 進行區分

行為操作

backup

備份 etcd 的資料。

支援的選項包括

--data-dir         etcd 的資料目錄
--backup-dir     備份到指定路徑

watch

監測一個鍵值的變化,一旦鍵值發生更新,就會輸出最新的值並退出。

例如

➜  etcd-v3.3.17-darwin-amd64 ./etcdctl set root/test/KeyThree "Hello etcd"
Hello etcd // 設定root/test/KeyThree的值
// 監控root/test/KeyThree,在其他會話裡將它的值改為"Hello World" 這裡就能收到更新後的結果
➜  etcd-v3.3.17-darwin-amd64 ./etcdctl watch  root/test/KeyThree --forever
Hello World

支援的選項包括

--forever        一直監測,直到使用者按 `CTRL+C` 退出
--after-index '0'    在指定 index 之前一直監測
--recursive        返回所有的鍵值和子鍵值

exec-watch

監測一個鍵值的變化,一旦鍵值發生更新,就執行給定命令。

例如,使用者更新 testkey 鍵值。

➜ etcd-v3.3.17-darwin-amd64 ./etcdctl exec-watch testkey -- sh -c 'ls'
default.etcd
Documentation
etcd
etcdctl
etcd-migrate
README-etcdctl.md
README.md

支援的選項包括

--after-index '0'    在指定 index 之前一直監測
--recursive        返回所有的鍵值和子鍵值

member

透過 list、add、remove 命令列出、新增、刪除 etcd 例項到 etcd 叢集中。

例如本地啟動一個 etcd 服務例項後,可以用如下命令進行檢視。

➜  etcd-v3.3.17-darwin-amd64 ./etcdctl member list
8e9e05c52164694d: name=default peerURLs=http://localhost:2380 clientURLs=http://localhost:2379 isLeader=true
➜  etcd-v3.3.17-darwin-amd64 
本作品採用《CC 協議》,轉載必須註明作者和本文連結
公眾號:網管叨bi叨 | Golang、Laravel、Docker、K8s等學習經驗分享

相關文章