簡介
etcd介紹.png
etcd是乙個golang編寫的分布式、高可用的一致性鍵值儲存系統,用於提供可靠的分布式鍵值(key-value)儲存、配置共享和服務發現等功能。etcd可以用於儲存關鍵資料和實現分布式排程,在現代化的集群執行中能夠起到關鍵性的作用。
etcd基於raft協議,通過複製日誌檔案的方式來保證資料的強一致性。在etcd之前,常用的是基於paxos協議的zookeeper。
安裝步驟如下:
wget
# 解壓
etcd目錄結構.png
其中etcd就是服務端程式,etcdctl是客戶端程式。
啟動服務端:
./etcd --listen-client-urls '' --advertise-client-urls ''
--listen-client-urls:監聽的用於客戶端通訊的url,可以監聽多個。
--advertise-client-urls:建議使用的客戶端通訊url。
可以看到,輸出中有一行:
warning.png
不建議監聽任意位址的客戶端,因為這樣不夠安全。這裡只是為了測試方便才這麼做。
客戶端etcdctl是官方提供的客戶端程式。
etcdctl help.png
etcd有兩個版本的介面,v2和v3,且兩個版本不相容,v2已經停止了支援,v3效能更好。etcdctl預設使用v2版本,如果想使用v3版本,可通過環境變數etcdctl_api=3進行設定。
使用v3版本.png
接下來都使用v3介面進行學習,主要進行單機測試。
常見命令
get put del
最常見的就是put、get和del命令。
# 放入乙個 鍵值對
$ ./etcdctl get name
name
zyq# 取出 name
$ ./etcdctl get name
name
zyq# 刪除 name
$ ./etcdctl del name
# 在獲取name
$ ./etcdctl get name
# 什麼都沒拿到
etcd的key是有序儲存的,本質上是字串,可以模擬出目錄的結構,例如儲存了/a/b,/a/b/c,/a/b/d三個key,由於它們在儲存中順序排列的,通過定位到key=/a/b並依次順序向後掃瞄,就會遇到/a/b/c與/a/b/d這兩個孩子,從而實現父子目錄關係。
所以一般都將etcd的key設計成目錄結構。
etcdctl的get命令可以獲取單個key,也可以獲取以某個字串為字首的key(可以模擬某個目錄下的所有key)。
ok# 可以單獨獲取某個key
$ ./etcdctl get "/project/jobs/job1"
/project/jobs/job1
# 也可以獲取某個目錄下的所有key
# 但是直接獲取某個目錄 etcd是不認識的 因為它沒有目錄的概念
$ ./etcdctl get "/project/jobs/"
# 需要加上 --prefix命令
$ ./etcdctl get "/project/jobs/" --prefix
/project/jobs/job1
/project/jobs/job2
# 刪除所有
$ ./etcdctl del "/project/jobs/" --prefix
watch
watch命令用來監測key的變化,會建立長連線,一直監聽。由於etcd採用mvcc多版本併發控制,etcd的watch可以從給定的revision進行檢測。(這裡不知道etcdctl用什麼命令獲取revision,所以不演示了)
新開啟乙個shell視窗使用watch命令
# 設定環境變數
$ export etcdctl_api=3
# 開始監聽某個key
$ ./etcdctl watch "name"
# 。。。什麼都不列印,在等待結果
# 當另乙個視窗執行了 ./etcdctl put "name" "zyq" 之後
$ ./etcdctl watch "name"
putname
zyq# 當另乙個視窗執行了 ./etcdctl del "name" 之後
$ ./etcdctl watch "name"
putname
zyqdelete
name
可以看到,watch命令可以觀察到所有的操作事件(put和del)。
同樣,可以使用--prefix命令指定觀察的key的字首。
租約租約是一段時間,可以為etcd的key授予租約。當key被附加到租約時,它的生存時間被繫結到租約的生存時間,一旦租約的ttl到期,租約就過期並且所有附帶的key都將被刪除。
乙個租約可以繫結不止乙個key。
# 建立乙個20s的租約
$ ./etcdctl lease grant 20
lease 694d673115905e37 granted with ttl(20s)
# 使用租約的 id 進行 put 操作
$ ./etcdctl put --lease=694d673115905e37 "name" "zyq"
# 20s後get發現 key被刪除了
$ ./etcdctl get "name"
# 空應答
租約可以被刪除
# 建立乙個20s的租約
$ ./etcdctl lease grant 1000
lease 694d673115905e49 granted with ttl(1000s)
# 使用租約的 id 進行 put 操作
$ ./etcdctl put --lease=694d673115905e49 "name" "zyq"
ok# 刪除租約
$ ./etcdctl lease revoke 694d673115905e49
lease 694d673115905e49 revoked
# 發現key也被刪除了
$ ./etcdctl get "name"
# 空應答
租約可以自動續租
# 建立乙個20s的租約
$ ./etcdctl lease grant 20
lease 694d673115905e4f granted with ttl(20s)
# 自動續租
$ ./etcdctl lease keep-alive 694d673115905e4f
lease 694d673115905e4f keepalived with ttl(20)
lease 694d673115905e4f keepalived with ttl(20)
下步計畫
使用etcdctl確實不太方便,下次學習使用golang的clientv3 api進行操作。
參考
Springboot中的定時任務初初初初級
最近剛剛接觸sringboot中的定時任務寫了乙個最最最初階版的定時任務,作如下記錄 首先在啟動類中新增註解 enablescheduling然後就可以直接通過註解 scheduled編寫我們的定時任務了 service public class timeservice 其中,corn值代表每分鐘執...
MySQL初初初入門筆記 2020 6 25
寥寥幾筆 現在是累計什錦式學習mysql部分的第2天 現在把最前頭的記錄都一起傳上來,雖然現在寫的這一塊還是太簡單了,但畢竟配置環境什麼的還是花時間,於是寫一篇記錄一下粗略的學習過程 現在越學越感覺對於相關知識的學習是由 簡單,繁雜 到 深入,簡約 的乙個過程.所以還是有點耐心吧哈哈 資料庫db 資...
初初初級演算法
給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3 ...