golang-etcd系列(一)--初識(shí)

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

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破喻、getdel

./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 源碼:https://github.com/astraw99/etcd_go

可以看到,上面的 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履磨,隨著 CoreOSKubernetes 等項(xiàng)目在開源社區(qū)日益火熱蛉抓,相信在不久的將來將會(huì)得到更為廣泛的應(yīng)用。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末剃诅,一起剝皮案震驚了整個(gè)濱河市巷送,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矛辕,老刑警劉巖笑跛,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異如筛,居然都是意外死亡堡牡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門杨刨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晤柄,“玉大人,你說我怎么就攤上這事妖胀〗婢保” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵赚抡,是天一觀的道長爬坑。 經(jīng)常有香客問我,道長涂臣,這世上最難降的妖魔是什么盾计? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任售担,我火速辦了婚禮,結(jié)果婚禮上署辉,老公的妹妹穿的比我還像新娘族铆。我一直安慰自己,他們只是感情好哭尝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布哥攘。 她就那樣靜靜地躺著,像睡著了一般材鹦。 火紅的嫁衣襯著肌膚如雪逝淹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天桶唐,我揣著相機(jī)與錄音栅葡,去河邊找鬼。 笑死莽红,一個(gè)胖子當(dāng)著我的面吹牛妥畏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播安吁,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼醉蚁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鬼店?” 一聲冷哼從身側(cè)響起网棍,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妇智,沒想到半個(gè)月后滥玷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巍棱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年惑畴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片航徙。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡如贷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出到踏,到底是詐尸還是另有隱情杠袱,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布窝稿,位于F島的核電站楣富,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏伴榔。R本人自食惡果不足惜纹蝴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一庄萎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骗灶,春花似錦惨恭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萝究。三九已至免都,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間帆竹,已是汗流浹背绕娘。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栽连,地道東北人险领。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像秒紧,于是被迫代替她去往敵國和親绢陌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容