etcd
是一個 golang
編寫的分佈式、高可用的一致性鍵值存儲系統,是目前容器編排領域火熱的 Kubernetes(k8s)
內置的服務發現與節點一致性中間件,用於提供可靠的分佈式鍵值(key-value
)存儲、配置共享和服務發現等功能。etcd
能夠用於存儲關鍵數據和實現分佈式調度,在現代化的集羣運行中可以起到關鍵性的做用。linux
etcd
基於 Raft
協議,經過複製日誌文件的方式來保證數據的強一致性。在 etcd
以前,經常使用的是基於 Paxos
協議的 ZooKeeper
。git
etcd
主要特性有:github
下載最新發行版打包文件、解壓、執行便可運行:golang
$ tar zxvf etcd-v3.3.18-linux-amd64.tar.gz $ cd etcd-v3.3.18-linux-amd64/ $ ./etcd # 運行 etcd 服務端 $ ./etcdctl # 運行 etcd 客戶端
$ git clone https://github.com/etcd-io/etcd.git $ cd etcd $ ./build
$ netstat -anp | grep etcd tcp 0 0 127.0.0.1:2379 0.0.0.0:* LISTEN 20537/etcd tcp 0 0 127.0.0.1:2380 0.0.0.0:* LISTEN 20537/etcd tcp 0 0 127.0.0.1:2379 127.0.0.1:50902 ESTABLISHED 20537/etcd tcp 0 0 127.0.0.1:50902 127.0.0.1:2379 ESTABLISHED 20537/etcd unix 2 [ ] 數據報 220389 20537/etcd @0002f unix 2 [ ] 數據報 220388 20537/etcd
經過端口查看能夠看出,本地的 etcd-server
集羣內節點通訊端口 2380,etcd-client
服務端-客戶端通訊端口 2379 都已創建、監聽中,說明 etcd
守護進程已成功開啓。算法
kv
鍵值存儲最經常使用命令是:put
、get
和 del
安全
./etcdctl put hello world # 設置 k-v OK $ ./etcdctl get hello # 獲取 k-v hello world $ ./etcdctl del hello # 刪除 k-v 1 $ ./etcdctl get hello # 刪除後獲取爲空 $
golang
使用 demo
新建 kv_demo.go
文件以下:curl
package main import ( "context" "fmt" "time" "github.com/coreos/etcd/clientv3" ) func main() { cli, err := clientv3.New(clientv3.Config{ Endpoints: []string{"localhost:2379", "localhost:22379", "localhost:32379"}, DialTimeout: 5 * time.Second, }) if err != nil { fmt.Println("connect failed, err:", err) return } // 創建客戶端成功 fmt.Println("connect succ") defer cli.Close() // 設置1秒超時,訪問 etcd 有超時控制 ctx, cancel := context.WithTimeout(context.Background(), time.Second) // 設置 key _, err = cli.Put(ctx, "hello", "world") //操做完畢,取消 etcd cancel() if err != nil { fmt.Println("put failed, err:", err) return } // 取值,設置超時爲 1 秒 ctx, cancel = context.WithTimeout(context.Background(), time.Second) resp, err := cli.Get(ctx, "hello") cancel() if err != nil { fmt.Println("get failed, err:", err) return } for _, ev := range resp.Kvs { fmt.Printf("%s : %s\n", ev.Key, ev.Value) } }
運行 go run kv_demo.go
:tcp
$ go run kv_demo.go connect succ hello : world
demo
源碼:
https://github.com/astraw99/etcd_go
能夠看到,上面的 demo
成功進行 key-value
設置與獲取。固然 etcd
的命令還有不少,今天初步使用就簡單使用這個 kv
存儲,其餘後面慢慢解析。分佈式
本文對 etcd
進行了簡單認識和了解,對其最經常使用的 key-value
分佈式存儲進行了 golang-demo
演示,能夠看出 etcd
的部署、使用是很簡單的,客戶端命令也很明晰,下一步將深刻源碼一步一步去探索 etcd
的實現細節。ui
ectd
做爲分佈式服務發現、一致性存儲領域的後起之秀,在分佈式集羣、雲部署、雲應用方面具備舉足輕重的做用,從其官方 GitHub
能夠看到代碼更新迭代快速、從版本 v2 => v3
,隨着 CoreOS
和 Kubernetes
等項目在開源社區日益火熱,相信在不久的未來將會獲得更爲普遍的應用。