docker etcd


Etcd 簡介

Etcd CoreOS 團隊於 2013 年6月發起的開源項目,它的目標是構建一個高可用的分布式鍵值( key-value )倉庫,遵循 Apache v2許可,基於 Go 語言實現,接觸過分布式系統的讀者應該知道,分布式系統中最基本的問題之一就是實現信息的共識,在此基礎上才能實現對服務配置信息的管理、服務的發現、更新、同步,等等 而要解決這些問題,往往需要利用一套能保證一致性的分布式數據庫系統,比如經典的 Apache ZooKeeper 項目 ,采用了 Paxos 算法來實現數據的強一致性。

Etcd 專門為集群環境設計,采用了更為簡潔的 Raft 共識算法,Raft 是一套通過選舉主節點來實現分布式系統一致性的算法,同樣可以實現數據強一致性,並支持集群節點狀態管理和服務自動發現等

 

Etcd 在進行設計的時候重點考慮了下面四個要素:

口簡單:支持 RESTfulAPI和gRPCAPI;

口安全: 基於 TLS 式實 安全連接訪

口快速: 支持每 一萬次 並發寫操作,超時控制在毫秒量級

口可靠: 支持分布式結構 基於 Raft 算法實現一致性

通常情況下,用戶使用 Etcd 可以在多個節點上啟動多個實例,並將它們添加為 個集群。同一個集群中的 Etcd 實例將會自動保持彼此信息的一致性,這意味着分布在各個節點上的應用也將獲取到一致的信息。

 

 

安裝和使用 Etcd

 

第一步:下載

https://github.com/etcd-io/etcd/releases

 

第二步:解壓

[root@ken2 ~]# tar xf etcd-v3.3.1-linux-amd64.tar.gz [root@ken2 ~]# cp etcd-v3.3.1-linux-amd64/etcd* /usr/local/bin 

 

 

其中 etcd 是服務主文件, etcdctl 是提供給用戶的命令客戶端,其他都是文檔文件

 

使用etcd

 

下面將先以單節點 式為例講解 Etcd 支持的功能和操作

1.可通過如下命令查看 etcd 的版本信息:

[root@ken2 ~]# etcdctl --version etcdctl version: 3.3.1 API version: 2 

 

 

2.接下來,直接執行 Etcd 命令,將啟動 個服務節點,監昕在本地的 2379 (客戶端端口)和 2380 (其他節點連 端口

顯示類似如下的信息:

[root@ken2 ~]# etcd [WARNING] Deprecated '--logger=capnslog' flag is set; use '--logger=zap' flag instead 2019-09-10 14:24:00.393171 I | etcdmain: etcd Version: 3.4.0 2019-09-10 14:24:00.393235 I | etcdmain: Git SHA: 898bd1351 2019-09-10 14:24:00.393242 I | etcdmain: Go Version: go1.12.9 2019-09-10 14:24:00.393253 I | etcdmain: Go OS/Arch: linux/amd64 2019-09-10 14:24:00.393262 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4 2019-09-10 14:24:00.393273 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd [WARNING] Deprecated '--logger=capnslog' flag is set; use '--logger=zap' flag instead 2019-09-10 14:24:00.492487 I | embed: name = default 2019-09-10 14:24:00.492507 I | embed: data dir = default.etcd 2019-09-10 14:24:00.492513 I | embed: member dir = default.etcd/member 2019-09-10 14:24:00.492518 I | embed: heartbeat = 100ms 2019-09-10 14:24:00.492522 I | embed: election = 1000ms 2019-09-10 14:24:00.492526 I | embed: snapshot count = 100000 2019-09-10 14:24:00.492540 I | embed: advertise client URLs = http://localhost:2379 2019-09-10 14:24:00.500959 I | etcdserver: starting member 8e9e05c52164694d in cluster cdf818194e3a8c32 raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d switched to configuration voters=() raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d became follower at term 0 raft2019/09/10 14:24:00 INFO: newRaft 8e9e05c52164694d [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0] raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d became follower at term 1 raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d switched to configuration voters=(10276657743932975437) 2019-09-10 14:24:00.512116 W | auth: simple token is not cryptographically signed 2019-09-10 14:24:00.514290 I | etcdserver: starting server... [version: 3.4.0, cluster version: to_be_decided] 2019-09-10 14:24:00.516603 I | etcdserver: 8e9e05c52164694d as single-node; fast-forwarding 9 ticks (election ticks 10) raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d switched to configuration voters=(10276657743932975437) 2019-09-10 14:24:00.524693 I | etcdserver/membership: added member 8e9e05c52164694d [http://localhost:2380] to cluster cdf818194e3a8c32 2019-09-10 14:24:00.529322 I | embed: listening for peers on 127.0.0.1:2380 raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d is starting a new election at term 1 raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d became candidate at term 2 raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 2 raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d became leader at term 2 raft2019/09/10 14:24:01 INFO: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 2 2019-09-10 14:24:01.307817 I | etcdserver: setting up the initial cluster version to 3.4 2019-09-10 14:24:01.310805 I | etcdserver: published {Name:default ClientURLs:[http://localhost:2379]} to cluster cdf818194e3a8c32 2019-09-10 14:24:01.333900 I | embed: ready to serve client requests 2019-09-10 14:24:01.334870 N | etcdserver/membership: set the initial cluster version to 3.4 2019-09-10 14:24:01.335022 I | etcdserver/api: enabled capabilities for version 3.4 2019-09-10 14:24:01.353146 N | embed: serving insecure client requests on 127.0.0.1:2379, this is strongly discouraged! 

 

 

此時,可以通過 REST API 直接查看集群健康狀態:

[root@ken2 ~]# curl -L 127.0.0.1:2379/health {"health":"true"}

 

當然,也可以使用自帶的 etcdctl 命令進行查看(實際上是封裝了REST API 調用):

 

[root@ken1 ~]# etcdctl cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://localhost:2379 cluster is healthy 

 

3.通過 etcdctl 設置和獲取值也十分方便,例如設置鍵值對name : ken

 

[root@ken1 ~]# etcdctl set name ken ken [root@ken1 ~]# etcdctl get name ken 

 

說明鍵值對已經設 成功了

 

數據目錄

 

作為數據庫,最重要的自 然是數據存放位置 Etcd 認創建的本地數據目錄為 ${name}.etcd ,其中${ name }為節點別名 默認情況下本地數據路徑為 default.etcd,

[root@ken1 ~]# ls 192.168.64.6 anaconda-ks.cfg default.etcd etcd-v3.3.1-linux-amd64 etcd-v3.3.1-linux-amd64.tar.gz n1.etcd 
[root@ken1 ~]# tree default.etcd/ default.etcd/ └── member ├── snap │   └── db └── wal ├── 0000000000000000-0000000000000000.wal └── 0.tmp 3 directories, 3 files 

 

其中, snap 目錄下將定期記錄節點的狀態快照信息, wal 目錄下則記錄數據庫的操作日志信息、(可以通過 wal-dir 參數來指定存放到特定目錄)

用戶也可以通過一data-dir 選項來指定本地數據存放的位置

 

 

 

 

使用客戶端命令

 

etcdctl是Etcd官方提供的命令行客戶端, 它支持一些基於 HTTP API 封裝好的命令,供用戶直接跟Etcd服務打交道, 而無須基千 API 的方式。 當然, 這些命令跟API 實際上是對應的, 最終效果上並無不同之處。某些情況下使用etcdctl十分方便。 例如用戶需要對Etcd服務進行簡單測試或者手動來修改數據庫少量內容;也推薦在剛接觸Etcd時通過etcdctl命令來熟悉服務相關功能。Etcd項目二進制發行包中已經包含了etcdctl.

 

etcdctl的命令格式為:

etcdctl  [全局選項]命令[命令選項] [命令參數]

 

全局選項參數如下:

 

支持的命令大體上分為:數據類操作和非數據類操作

 

非數據類操作命令見下, 主要是 Etcd 提供的系統配置、 權限管理等

 

 

下面分別來看各個操作的主要用法和功能

數據類操作

數據類操作圍繞對鍵值和目錄的CRUD (符合REST風格的一套操作:Create)完整生命周期的管理。Etcd在鍵的組織上十分靈活。用戶指定的鍵可以為只有一級的名字,如name, 此時實際上都直接放在根目錄/下面,也可以為指定層次化目錄結構(類似於ZooKeeper), 如:clusster1/node2/ name, 則將創建相應的目錄結構。

CRUD即Create, Read, Update, Delete , 是符合REST風格的一套API操作規范。

 

 

1.設置某個鍵的值為給定值

 

[root@ken1 ~]# etcdctl set age 18 18 

 

2.獲取指定鍵的值

[root@ken1 ~]# etcdctl get age 18 

 

3.更新鍵值

[root@ken1 ~]# etcdctl update age 20 20 [root@ken1 ~]# etcdctl get age 20 

 

4.mk 如果給定的鍵不存在, 則創建一個新的鍵值。

[root@ken1 ~]# etcdctl mk address jiangsu jiangsu [root@ken1 ~]# etcdctl get address jiangsu 

 

5.rm刪除某個鍵值

[root@ken1 ~]# etcdctl rm address PrevNode.Value: jiangsu [root@ken1 ~]# etcdctl get address Error: 100: Key not found (/address) [8] 

 

 

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

[root@ken1 ~]# etcdctl watch name ken1 

 

7.exec-watch

監測一個鍵值的變化, 一旦鍵值發生更新, 就執行給定命令。 這個功能十分強大, 很多時候可以用於實時根據鍵值更新本地服務的配置信息, 並重新加載服務。 可以實現分布式應用配置的自動分發。

例如, 一旦檢測到鍵值被更新, 則執行ls命令:

[root@ken1 ~]# etcdctl exec-watch name -- sh -c "ls" anaconda-ks.cfg default.etcd etcd-v3.3.1-linux-amd64 etcd-v3.3.1-linux-amd64.tar.gz 

 

8.1s

列出目錄(默認為根目錄)下的鍵或者子目錄, 默認不顯示子目錄中內容。 例如:

[root@ken1 ~]# etcdctl set key hi hi [root@ken1 ~]# etcdctl set ken/key hi1 hi1 [root@ken1 ~]# etcdctl ls /name /age /key /ken [root@ken1 ~]# etcdctl ls ken /ken/key 

 

9.mkdir

如果給定的鍵目錄不存在, 則創建一個新的鍵目錄。 例如:

[root@ken1 ~]# etcdctl mkdir test [root@ken1 ~]# etcdctl ls /name /age /key /ken /test 

 

10.rmdir

刪除一個空目錄, 或者鍵值對。若目錄不空, 會報錯, 例如:

[root@ken1 ~]# etcdctl rmdir test [root@ken1 ~]# etcdctl rmdir ken Error: 108: Directory not empty (/ken) [14] 

 

 

11.setdir

創建一個鍵目錄, 無論存在與否。 實際上, 目前版本當目錄已經存在的時候會報錯,

例如:

[root@ken1 ~]# etcdctl setdir test [root@ken1 ~]# etcdctl ls /name /age /key /ken /test 

 

12.updatedir

更新一個已經存在的目錄的屬性(目前只有存活時間), 例如:

[root@ken1 ~]# etcdctl mkdir test1 --ttl 100 [root@ken1 ~]# etcdctl updatedir test1 --ttl 200 

支待的選項為—ttlvalue: 超時時間(單位為秒),默認值為0, 意味着永不超時。

 

非數據類操作

 

非數據類操作不直接對數據本身進行管理, 而是負責圍繞集群自身的一些配置。

 

1.cluster-health

查看Etcd集群的健康狀態。 例如:

[root@ken1 ~]# etcdctl cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://localhost:2379 cluster is healthy 

 

2.member

通過list、add、remove等子命令列出、 添加、 刪除Etcd實例到Etcd集群中。 例如, 本

地啟動一個Etcd服務實例后, 可以用如下命令進行查看 默認的實例成員:

[root@ken1 ~]# etcdctl member list 8e9e05c52164694d: name=default peerURLs=http://localhost:2380 clientURLs=http://localhost:2379 isLeader=true 

 

3.user

對用戶進行管理, 包括一系列子命令:

add: 添加一個用戶;

get:查詢用戶細節;

list: 列出所有用戶;

remove: 刪除用戶;

grant:添加用戶到角色;

revoke: 刪除用戶的角色;

passwd: 修改用戶的密碼。

默認情況下, 需要先創建(啟用) root用戶作為etcd集群的最高權限管理員:

會要求輸入密碼

[root@ken1 ~]# etcdctl user add root New password: User root created 

分配某些已有角色給用戶

[root@ken1 ~]# etcdctl user grant root --roles root auth: Granting duplicate role root for user root 

 

 

 

4.role

對用戶角色進行管理,包括一系列子命令:

add :添加一個角色;

get :查詢角色細節;

list 列出所有用戶角色;

remove :刪除用戶角色;

grant 添加路徑到角色控制,可以為 read write 或者 readwrite;

revoke 刪除某路徑的用戶角色信息

默認帶有 root,guest 兩種角色,前者為全局最高權限,后者為不帶驗證情況下的用戶

例如

[root@ken1 ~]# etcdctl role add testrole Role testrole created [root@ken1 ~]# etcdctl role list root testrole 
[root@ken1 ~]# etcdctl role grant testrole --path='/ken/*' --rw Role testrole updated 

 

5.auth

是否啟用訪問驗證 enable 為啟用, disable 禁用。例如,在 root 用戶創建后,啟用

認證:

[root@ken1 ~]# etcdctl auth enable Authentication Enabled 

 

 

Etcd 集群管理

tcd 集群也采用了典型的“主一從”模型,通過 Raft 協議來保證在 段時間內有一個節點為主節點 ,其 節點為從節點 一旦主節點發生故障其他節點可以自動再重新選舉出新的主節點。與其他分布式系統類似,集群中節點個數推薦為奇數個,最少為3個,此時 quorum為2,越多節點個數自然能提供更多的冗余’性 ,但同時會帶來寫數據性能的下降

在分布式系統中有一個很重要的概念 quorum ,意味着一個集群正常工作需要能參加投票的節點個數的最小值

 

構建集群

構建集群無非是讓節點們知道自己加入了哪個集群,其他對等節點的訪問信息是啥。

Etcd 支持兩種模式來構建集群:靜態配 和動態發現

.靜態配置集群信息

顧名思義, 靜態配置就是提取寫好集群中的有關信息。接下來演示使用三個節點創建集群

 

 

第一步:首先在各個 點上將地址和別名信息添加到 etc/hosts

[root@ken1 ~]# cat /etc/hosts localhost 127.0.0.1 ken1 192.168.64.5 ken2 192.168.64.6 ken3 192.168.64.7 

 

第二步:需要在每個節點安裝etcd

 

第三步:可以通過如下命令來啟動各個節點上 etcd 服務 ,分別命名為 nl n2 n3

在節點1上,執行如下命令:

[root@ken1 ~]# etcd --name n1 --initial-cluster-token cluster1 --initial-cluster-state new --listen-client-urls http://192.168.64.5:2379,http://127.0.0.1:2379 --listen-peer-urls http://192.168.64.5:2380 --advertise-client-urls http://192.168.64.5:2379 --initial-advertise-peer-urls http://ken1:2380 --initial-cluster n1=http://ken1:2380,n2=http://ken2:2380,n3=http://ken3:2380 

 

參數分析
-name 節點名稱
-initial-advertise-peer-urls 通知其他 Etcd 實例地址
-listen-peer-urls 監聽其他 Etcd 實例的地址
-initial-cluster-token 初始化集群 token
-initial-cluster 初始化集群內節點地址
-initial-cluster-state 初始化集群狀態,new 表示新建

 

在節點2上執行如下的命令:

[root@ken2 ~]# etcd --name n2 --initial-cluster-token cluster1 --initial-cluster-state new --listen-client-urls http://192.168.64.6:2379,http://127.0.0.1:2379 --listen-peer-urls http://192.168.64.6:2380 --advertise-client-urls http://192.168.64.6:2379 --initial-advertise-peer-urls http://ken2:2380 --initial-cluster n1=http://ken1:2380,n2=http://ken2:2380,n3=http://ken3:2380 

 

在節點3上執行如下的命令:

[root@ken3 ~]# etcd --name n3 --initial-cluster-token cluster1 --initial-cluster-state new --listen-client-urls http://192.168.64.7:2379,http://127.0.0.1:2379 --listen-peer-urls http://192.168.64.7:2380 --advertise-client-urls http://192.168.64.7:2379 --initial-advertise-peer-urls http://ken3:2380 --initial-cluster n1=http://ken1:2380,n2=http://ken2:2380,n3=http://ken3:2380 

 

成功后,可以在任一節點上通過 et cdctl 來查看當前集群中的成員信息:

[root@ken1 ~]# etcdctl member list 906a78458065a88a: name=n2 peerURLs=http://ken2:2380 clientURLs=http://192.168.64.6:2379 isLeader=false c41dc5eb2046fd27: name=n3 peerURLs=http://ken3:2380 clientURLs=http://192.168.64.7:2379 isLeader=true c7ce0761a258afbd: name=n1 peerURLs=http://ken1:2380 clientURLs=http://192.168.64.5:2379 isLeader=false 

 

測試:在任意一台主機創建鍵值

[root@ken1 ~]# etcdctl set name1 ken1 ken1 

 

可以在另外節點查看該鍵值

[root@ken2 ~]# etcdctl get name1

Etcd 簡介

Etcd CoreOS 團隊於 2013 年6月發起的開源項目,它的目標是構建一個高可用的分布式鍵值( key-value )倉庫,遵循 Apache v2許可,基於 Go 語言實現,接觸過分布式系統的讀者應該知道,分布式系統中最基本的問題之一就是實現信息的共識,在此基礎上才能實現對服務配置信息的管理、服務的發現、更新、同步,等等 而要解決這些問題,往往需要利用一套能保證一致性的分布式數據庫系統,比如經典的 Apache ZooKeeper 項目 ,采用了 Paxos 算法來實現數據的強一致性。

Etcd 專門為集群環境設計,采用了更為簡潔的 Raft 共識算法,Raft 是一套通過選舉主節點來實現分布式系統一致性的算法,同樣可以實現數據強一致性,並支持集群節點狀態管理和服務自動發現等

 

Etcd 在進行設計的時候重點考慮了下面四個要素:

口簡單:支持 RESTfulAPI和gRPCAPI;

口安全: 基於 TLS 式實 安全連接訪

口快速: 支持每 一萬次 並發寫操作,超時控制在毫秒量級

口可靠: 支持分布式結構 基於 Raft 算法實現一致性

通常情況下,用戶使用 Etcd 可以在多個節點上啟動多個實例,並將它們添加為 個集群。同一個集群中的 Etcd 實例將會自動保持彼此信息的一致性,這意味着分布在各個節點上的應用也將獲取到一致的信息。

 

 

安裝和使用 Etcd

 

第一步:下載

https://github.com/etcd-io/etcd/releases

 

第二步:解壓

[root@ken2 ~]# tar xf etcd-v3.3.1-linux-amd64.tar.gz [root@ken2 ~]# cp etcd-v3.3.1-linux-amd64/etcd* /usr/local/bin 

 

 

其中 etcd 是服務主文件, etcdctl 是提供給用戶的命令客戶端,其他都是文檔文件

 

使用etcd

 

下面將先以單節點 式為例講解 Etcd 支持的功能和操作

1.可通過如下命令查看 etcd 的版本信息:

[root@ken2 ~]# etcdctl --version etcdctl version: 3.3.1 API version: 2 

 

 

2.接下來,直接執行 Etcd 命令,將啟動 個服務節點,監昕在本地的 2379 (客戶端端口)和 2380 (其他節點連 端口

顯示類似如下的信息:

[root@ken2 ~]# etcd [WARNING] Deprecated '--logger=capnslog' flag is set; use '--logger=zap' flag instead 2019-09-10 14:24:00.393171 I | etcdmain: etcd Version: 3.4.0 2019-09-10 14:24:00.393235 I | etcdmain: Git SHA: 898bd1351 2019-09-10 14:24:00.393242 I | etcdmain: Go Version: go1.12.9 2019-09-10 14:24:00.393253 I | etcdmain: Go OS/Arch: linux/amd64 2019-09-10 14:24:00.393262 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4 2019-09-10 14:24:00.393273 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd [WARNING] Deprecated '--logger=capnslog' flag is set; use '--logger=zap' flag instead 2019-09-10 14:24:00.492487 I | embed: name = default 2019-09-10 14:24:00.492507 I | embed: data dir = default.etcd 2019-09-10 14:24:00.492513 I | embed: member dir = default.etcd/member 2019-09-10 14:24:00.492518 I | embed: heartbeat = 100ms 2019-09-10 14:24:00.492522 I | embed: election = 1000ms 2019-09-10 14:24:00.492526 I | embed: snapshot count = 100000 2019-09-10 14:24:00.492540 I | embed: advertise client URLs = http://localhost:2379 2019-09-10 14:24:00.500959 I | etcdserver: starting member 8e9e05c52164694d in cluster cdf818194e3a8c32 raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d switched to configuration voters=() raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d became follower at term 0 raft2019/09/10 14:24:00 INFO: newRaft 8e9e05c52164694d [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0] raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d became follower at term 1 raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d switched to configuration voters=(10276657743932975437) 2019-09-10 14:24:00.512116 W | auth: simple token is not cryptographically signed 2019-09-10 14:24:00.514290 I | etcdserver: starting server... [version: 3.4.0, cluster version: to_be_decided] 2019-09-10 14:24:00.516603 I | etcdserver: 8e9e05c52164694d as single-node; fast-forwarding 9 ticks (election ticks 10) raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d switched to configuration voters=(10276657743932975437) 2019-09-10 14:24:00.524693 I | etcdserver/membership: added member 8e9e05c52164694d [http://localhost:2380] to cluster cdf818194e3a8c32 2019-09-10 14:24:00.529322 I | embed: listening for peers on 127.0.0.1:2380 raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d is starting a new election at term 1 raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d became candidate at term 2 raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 2 raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d became leader at term 2 raft2019/09/10 14:24:01 INFO: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 2 2019-09-10 14:24:01.307817 I | etcdserver: setting up the initial cluster version to 3.4 2019-09-10 14:24:01.310805 I | etcdserver: published {Name:default ClientURLs:[http://localhost:2379]} to cluster cdf818194e3a8c32 2019-09-10 14:24:01.333900 I | embed: ready to serve client requests 2019-09-10 14:24:01.334870 N | etcdserver/membership: set the initial cluster version to 3.4 2019-09-10 14:24:01.335022 I | etcdserver/api: enabled capabilities for version 3.4 2019-09-10 14:24:01.353146 N | embed: serving insecure client requests on 127.0.0.1:2379, this is strongly discouraged! 

 

 

此時,可以通過 REST API 直接查看集群健康狀態:

[root@ken2 ~]# curl -L 127.0.0.1:2379/health {"health":"true"}

 

當然,也可以使用自帶的 etcdctl 命令進行查看(實際上是封裝了REST API 調用):

 

[root@ken1 ~]# etcdctl cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://localhost:2379 cluster is healthy 

 

3.通過 etcdctl 設置和獲取值也十分方便,例如設置鍵值對name : ken

 

[root@ken1 ~]# etcdctl set name ken ken [root@ken1 ~]# etcdctl get name ken 

 

說明鍵值對已經設 成功了

 

數據目錄

 

作為數據庫,最重要的自 然是數據存放位置 Etcd 認創建的本地數據目錄為 ${name}.etcd ,其中${ name }為節點別名 默認情況下本地數據路徑為 default.etcd,

[root@ken1 ~]# ls 192.168.64.6 anaconda-ks.cfg default.etcd etcd-v3.3.1-linux-amd64 etcd-v3.3.1-linux-amd64.tar.gz n1.etcd 
[root@ken1 ~]# tree default.etcd/ default.etcd/ └── member ├── snap │   └── db └── wal ├── 0000000000000000-0000000000000000.wal └── 0.tmp 3 directories, 3 files 

 

其中, snap 目錄下將定期記錄節點的狀態快照信息, wal 目錄下則記錄數據庫的操作日志信息、(可以通過 wal-dir 參數來指定存放到特定目錄)

用戶也可以通過一data-dir 選項來指定本地數據存放的位置

 

 

 

 

使用客戶端命令

 

etcdctl是Etcd官方提供的命令行客戶端, 它支持一些基於 HTTP API 封裝好的命令,供用戶直接跟Etcd服務打交道, 而無須基千 API 的方式。 當然, 這些命令跟API 實際上是對應的, 最終效果上並無不同之處。某些情況下使用etcdctl十分方便。 例如用戶需要對Etcd服務進行簡單測試或者手動來修改數據庫少量內容;也推薦在剛接觸Etcd時通過etcdctl命令來熟悉服務相關功能。Etcd項目二進制發行包中已經包含了etcdctl.

 

etcdctl的命令格式為:

etcdctl  [全局選項]命令[命令選項] [命令參數]

 

全局選項參數如下:

 

支持的命令大體上分為:數據類操作和非數據類操作

 

非數據類操作命令見下, 主要是 Etcd 提供的系統配置、 權限管理等

 

 

下面分別來看各個操作的主要用法和功能

數據類操作

數據類操作圍繞對鍵值和目錄的CRUD (符合REST風格的一套操作:Create)完整生命周期的管理。Etcd在鍵的組織上十分靈活。用戶指定的鍵可以為只有一級的名字,如name, 此時實際上都直接放在根目錄/下面,也可以為指定層次化目錄結構(類似於ZooKeeper), 如:clusster1/node2/ name, 則將創建相應的目錄結構。

CRUD即Create, Read, Update, Delete , 是符合REST風格的一套API操作規范。

 

 

1.設置某個鍵的值為給定值

 

[root@ken1 ~]# etcdctl set age 18 18 

 

2.獲取指定鍵的值

[root@ken1 ~]# etcdctl get age 18 

 

3.更新鍵值

[root@ken1 ~]# etcdctl update age 20 20 [root@ken1 ~]# etcdctl get age 20 

 

4.mk 如果給定的鍵不存在, 則創建一個新的鍵值。

[root@ken1 ~]# etcdctl mk address jiangsu jiangsu [root@ken1 ~]# etcdctl get address jiangsu 

 

5.rm刪除某個鍵值

[root@ken1 ~]# etcdctl rm address PrevNode.Value: jiangsu [root@ken1 ~]# etcdctl get address Error: 100: Key not found (/address) [8] 

 

 

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

[root@ken1 ~]# etcdctl watch name ken1 

 

7.exec-watch

監測一個鍵值的變化, 一旦鍵值發生更新, 就執行給定命令。 這個功能十分強大, 很多時候可以用於實時根據鍵值更新本地服務的配置信息, 並重新加載服務。 可以實現分布式應用配置的自動分發。

例如, 一旦檢測到鍵值被更新, 則執行ls命令:

[root@ken1 ~]# etcdctl exec-watch name -- sh -c "ls" anaconda-ks.cfg default.etcd etcd-v3.3.1-linux-amd64 etcd-v3.3.1-linux-amd64.tar.gz 

 

8.1s

列出目錄(默認為根目錄)下的鍵或者子目錄, 默認不顯示子目錄中內容。 例如:

[root@ken1 ~]# etcdctl set key hi hi [root@ken1 ~]# etcdctl set ken/key hi1 hi1 [root@ken1 ~]# etcdctl ls /name /age /key /ken [root@ken1 ~]# etcdctl ls ken /ken/key 

 

9.mkdir

如果給定的鍵目錄不存在, 則創建一個新的鍵目錄。 例如:

[root@ken1 ~]# etcdctl mkdir test [root@ken1 ~]# etcdctl ls /name /age /key /ken /test 

 

10.rmdir

刪除一個空目錄, 或者鍵值對。若目錄不空, 會報錯, 例如:

[root@ken1 ~]# etcdctl rmdir test [root@ken1 ~]# etcdctl rmdir ken Error: 108: Directory not empty (/ken) [14] 

 

 

11.setdir

創建一個鍵目錄, 無論存在與否。 實際上, 目前版本當目錄已經存在的時候會報錯,

例如:

[root@ken1 ~]# etcdctl setdir test [root@ken1 ~]# etcdctl ls /name /age /key /ken /test 

 

12.updatedir

更新一個已經存在的目錄的屬性(目前只有存活時間), 例如:

[root@ken1 ~]# etcdctl mkdir test1 --ttl 100 [root@ken1 ~]# etcdctl updatedir test1 --ttl 200 

支待的選項為—ttlvalue: 超時時間(單位為秒),默認值為0, 意味着永不超時。

 

非數據類操作

 

非數據類操作不直接對數據本身進行管理, 而是負責圍繞集群自身的一些配置。

 

1.cluster-health

查看Etcd集群的健康狀態。 例如:

[root@ken1 ~]# etcdctl cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://localhost:2379 cluster is healthy 

 

2.member

通過list、add、remove等子命令列出、 添加、 刪除Etcd實例到Etcd集群中。 例如, 本

地啟動一個Etcd服務實例后, 可以用如下命令進行查看 默認的實例成員:

[root@ken1 ~]# etcdctl member list 8e9e05c52164694d: name=default peerURLs=http://localhost:2380 clientURLs=http://localhost:2379 isLeader=true 

 

3.user

對用戶進行管理, 包括一系列子命令:

add: 添加一個用戶;

get:查詢用戶細節;

list: 列出所有用戶;

remove: 刪除用戶;

grant:添加用戶到角色;

revoke: 刪除用戶的角色;

passwd: 修改用戶的密碼。

默認情況下, 需要先創建(啟用) root用戶作為etcd集群的最高權限管理員:

會要求輸入密碼

[root@ken1 ~]# etcdctl user add root New password: User root created 

分配某些已有角色給用戶

[root@ken1 ~]# etcdctl user grant root --roles root auth: Granting duplicate role root for user root 

 

 

 

4.role

對用戶角色進行管理,包括一系列子命令:

add :添加一個角色;

get :查詢角色細節;

list 列出所有用戶角色;

remove :刪除用戶角色;

grant 添加路徑到角色控制,可以為 read write 或者 readwrite;

revoke 刪除某路徑的用戶角色信息

默認帶有 root,guest 兩種角色,前者為全局最高權限,后者為不帶驗證情況下的用戶

例如

[root@ken1 ~]# etcdctl role add testrole Role testrole created [root@ken1 ~]# etcdctl role list root testrole 
[root@ken1 ~]# etcdctl role grant testrole --path='/ken/*' --rw Role testrole updated 

 

5.auth

是否啟用訪問驗證 enable 為啟用, disable 禁用。例如,在 root 用戶創建后,啟用

認證:

[root@ken1 ~]# etcdctl auth enable Authentication Enabled 

 

 

Etcd 集群管理

tcd 集群也采用了典型的“主一從”模型,通過 Raft 協議來保證在 段時間內有一個節點為主節點 ,其 節點為從節點 一旦主節點發生故障其他節點可以自動再重新選舉出新的主節點。與其他分布式系統類似,集群中節點個數推薦為奇數個,最少為3個,此時 quorum為2,越多節點個數自然能提供更多的冗余’性 ,但同時會帶來寫數據性能的下降

在分布式系統中有一個很重要的概念 quorum ,意味着一個集群正常工作需要能參加投票的節點個數的最小值

 

構建集群

構建集群無非是讓節點們知道自己加入了哪個集群,其他對等節點的訪問信息是啥。

Etcd 支持兩種模式來構建集群:靜態配 和動態發現

.靜態配置集群信息

顧名思義, 靜態配置就是提取寫好集群中的有關信息。接下來演示使用三個節點創建集群

 

 

第一步:首先在各個 點上將地址和別名信息添加到 etc/hosts

[root@ken1 ~]# cat /etc/hosts localhost 127.0.0.1 ken1 192.168.64.5 ken2 192.168.64.6 ken3 192.168.64.7 

 

第二步:需要在每個節點安裝etcd

 

第三步:可以通過如下命令來啟動各個節點上 etcd 服務 ,分別命名為 nl n2 n3

在節點1上,執行如下命令:

[root@ken1 ~]# etcd --name n1 --initial-cluster-token cluster1 --initial-cluster-state new --listen-client-urls http://192.168.64.5:2379,http://127.0.0.1:2379 --listen-peer-urls http://192.168.64.5:2380 --advertise-client-urls http://192.168.64.5:2379 --initial-advertise-peer-urls http://ken1:2380 --initial-cluster n1=http://ken1:2380,n2=http://ken2:2380,n3=http://ken3:2380 

 

參數分析
-name 節點名稱
-initial-advertise-peer-urls 通知其他 Etcd 實例地址
-listen-peer-urls 監聽其他 Etcd 實例的地址
-initial-cluster-token 初始化集群 token
-initial-cluster 初始化集群內節點地址
-initial-cluster-state 初始化集群狀態,new 表示新建

 

在節點2上執行如下的命令:

[root@ken2 ~]# etcd --name n2 --initial-cluster-token cluster1 --initial-cluster-state new --listen-client-urls http://192.168.64.6:2379,http://127.0.0.1:2379 --listen-peer-urls http://192.168.64.6:2380 --advertise-client-urls http://192.168.64.6:2379 --initial-advertise-peer-urls http://ken2:2380 --initial-cluster n1=http://ken1:2380,n2=http://ken2:2380,n3=http://ken3:2380 

 

在節點3上執行如下的命令:

[root@ken3 ~]# etcd --name n3 --initial-cluster-token cluster1 --initial-cluster-state new --listen-client-urls http://192.168.64.7:2379,http://127.0.0.1:2379 --listen-peer-urls http://192.168.64.7:2380 --advertise-client-urls http://192.168.64.7:2379 --initial-advertise-peer-urls http://ken3:2380 --initial-cluster n1=http://ken1:2380,n2=http://ken2:2380,n3=http://ken3:2380 

 

成功后,可以在任一節點上通過 et cdctl 來查看當前集群中的成員信息:

[root@ken1 ~]# etcdctl member list 906a78458065a88a: name=n2 peerURLs=http://ken2:2380 clientURLs=http://192.168.64.6:2379 isLeader=false c41dc5eb2046fd27: name=n3 peerURLs=http://ken3:2380 clientURLs=http://192.168.64.7:2379 isLeader=true c7ce0761a258afbd: name=n1 peerURLs=http://ken1:2380 clientURLs=http://192.168.64.5:2379 isLeader=false 

 

測試:在任意一台主機創建鍵值

[root@ken1 ~]# etcdctl set name1 ken1 ken1 

 

可以在另外節點查看該鍵值

[root@ken2 ~]# etcdctl get name1 ken1 

 

 

[root@ken1 ~]# etcdctl member list 906a78458065a88a: name=n2 peerURLs=http://ken2:2380 clientURLs=http://192.168.64.6:2379 isLeader=true c41dc5eb2046fd27: name=n3 peerURLs=http://ken3:2380 clientURLs=http://192.168.64.7:2379 isLeader=false c7ce0761a258afbd: name=n1 peerURLs=http://ken1:2380 clientURLs=http://192.168.64.5:2379 isLeader=false

當前主機點為ken2

把ken2集群退掉

可以發現主機點已經切換為ken3

[root@ken1 ~]# etcdctl member list 906a78458065a88a: name=n2 peerURLs=http://ken2:2380 clientURLs=http://192.168.64.6:2379 isLeader=false c41dc5eb2046fd27: name=n3 peerURLs=http://ken3:2380 clientURLs=http://192.168.64.7:2379 isLeader=true c7ce0761a258afbd: name=n1 peerURLs=http://ken1:2380 clientURLs=http://192.168.64.5:2379 isLeader=false
ken1 

 

 

[root@ken1 ~]# etcdctl member list 906a78458065a88a: name=n2 peerURLs=http://ken2:2380 clientURLs=http://192.168.64.6:2379 isLeader=true c41dc5eb2046fd27: name=n3 peerURLs=http://ken3:2380 clientURLs=http://192.168.64.7:2379 isLeader=false c7ce0761a258afbd: name=n1 peerURLs=http://ken1:2380 clientURLs=http://192.168.64.5:2379 isLeader=false

當前主機點為ken2

把ken2集群退掉

可以發現主機點已經切換為ken3

[root@ken1 ~]# etcdctl member list 906a78458065a88a: name=n2 peerURLs=http://ken2:2380 clientURLs=http://192.168.64.6:2379 isLeader=false c41dc5eb2046fd27: name=n3 peerURLs=http://ken3:2380 clientURLs=http://192.168.64.7:2379 isLeader=true c7ce0761a258afbd: name=n1 peerURLs=http://ken1:2380 clientURLs=http://192.168.64.5:2379 isLeader=false


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM