etcd
是一個(gè) golang
編寫的分布式婚夫、高可用的一致性鍵值存儲(chǔ)系統(tǒng),是目前容器編排領(lǐng)域火熱的 Kubernetes(k8s)
內(nèi)置的服務(wù)發(fā)現(xiàn)與節(jié)點(diǎn)一致性中間件寥闪,用于提供可靠的分布式鍵值(key-value
)存儲(chǔ)仁连、配置共享和服務(wù)發(fā)現(xiàn)等功能。etcd
可以用于存儲(chǔ)關(guān)鍵數(shù)據(jù)和實(shí)現(xiàn)分布式調(diào)度径簿,在現(xiàn)代化的集群運(yùn)行中能夠起到關(guān)鍵性的作用。
etcd
基于 Raft
協(xié)議嘀韧,通過復(fù)制日志文件的方式來保證數(shù)據(jù)的強(qiáng)一致性篇亭。在 etcd
之前,常用的是基于 Paxos
協(xié)議的 ZooKeeper
锄贷。
etcd
主要特性有:
- 簡單:基于 HTTP+JSON 的 API 讓你用 curl 就可以輕松使用译蒂。
- 安全:可選 SSL 客戶認(rèn)證機(jī)制。
- 快速:每個(gè)實(shí)例每秒支持一千次寫操作谊却。
- 可信:使用 Raft 算法充分實(shí)現(xiàn)了分布式柔昼。
1. 安裝
1.1 下載可執(zhí)行文件:https://github.com/etcd-io/etcd/releases/
下載最新發(fā)行版打包文件、解壓炎辨、執(zhí)行即可運(yùn)行:
$ tar zxvf etcd-v3.3.18-linux-amd64.tar.gz
$ cd etcd-v3.3.18-linux-amd64/
$ ./etcd # 運(yùn)行 etcd 服務(wù)端
$ ./etcdctl # 運(yùn)行 etcd 客戶端
1.2 下載源代碼編譯
$ git clone https://github.com/etcd-io/etcd.git
$ cd etcd
$ ./build
1.3 查看運(yùn)行情況
$ 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 [ ] 數(shù)據(jù)報(bào) 220389 20537/etcd @0002f
unix 2 [ ] 數(shù)據(jù)報(bào) 220388 20537/etcd
通過端口查看可以看出捕透,本地的 etcd-server
集群內(nèi)節(jié)點(diǎn)通信端口 2380,etcd-client
服務(wù)端-客戶端通信端口 2379 都已建立碴萧、監(jiān)聽中乙嘀,說明 etcd
守護(hù)進(jìn)程已成功開啟。
1.4 常用命令
kv
鍵值存儲(chǔ)最常用命令是:put
破喻、get
和 del
./etcdctl put hello world # 設(shè)置 k-v
OK
$ ./etcdctl get hello # 獲取 k-v
hello
world
$ ./etcdctl del hello # 刪除 k-v
1
$ ./etcdctl get hello # 刪除后獲取為空
$
2. golang
使用 demo
新建 kv_demo.go
文件如下:
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()
// 設(shè)置1秒超時(shí)乒躺,訪問 etcd 有超時(shí)控制
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
// 設(shè)置 key
_, err = cli.Put(ctx, "hello", "world")
//操作完畢,取消 etcd
cancel()
if err != nil {
fmt.Println("put failed, err:", err)
return
}
// 取值低缩,設(shè)置超時(shí)為 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)
}
}
運(yùn)行 go run kv_demo.go
:
$ go run kv_demo.go
connect succ
hello : world
可以看到,上面的 demo
成功進(jìn)行 key-value
設(shè)置與獲取。當(dāng)然 etcd
的命令還有很多咆繁,今天初步使用就簡單使用這個(gè) kv
存儲(chǔ)讳推,其他后面慢慢解析。
3. 小結(jié)
本文對(duì) etcd
進(jìn)行了簡單認(rèn)識(shí)和了解玩般,對(duì)其最常用的 key-value
分布式存儲(chǔ)進(jìn)行了 golang-demo
演示银觅,可以看出 etcd
的部署、使用是很簡單的坏为,客戶端命令也很明晰究驴,下一步將深入源碼一步一步去探索 etcd
的實(shí)現(xiàn)細(xì)節(jié)。
ectd
作為分布式服務(wù)發(fā)現(xiàn)匀伏、一致性存儲(chǔ)領(lǐng)域的后起之秀洒忧,在分布式集群、云部署够颠、云應(yīng)用方面具有舉足輕重的作用熙侍,從其官方 GitHub
可以看到代碼更新迭代快速、從版本 v2 => v3
履磨,隨著 CoreOS
和 Kubernetes
等項(xiàng)目在開源社區(qū)日益火熱蛉抓,相信在不久的將來將會(huì)得到更為廣泛的應(yīng)用。