001.etcd簡介及單節點使用

一 etcd簡介

1.1 概述

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

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

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/
 
01
提示: 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"
02
若設置的鍵不存在,則建立一個新的鍵值,當鍵存在的時候,執行該命令會報錯。
選項:
  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)則永不超時
 
03
  • 刪除空目錄或鍵值
  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
 
04
  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"
 
05
選項:
  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"
 
06
監測一個鍵值的變化,一旦鍵值發生更新,就執行給定命令。
  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。
配置參數
參數說明
--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		#每當到期將會續約
相關文章
相關標籤/搜索