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

etcd 是一個 golang 編寫的分佈式、高可用的一致性鍵值存儲系統,是目前容器編排領域火熱的 Kubernetes(k8s) 內置的服務發現與節點一致性中間件,用於提供可靠的分佈式鍵值(key-value)存儲、配置共享和服務發現等功能。etcd 能夠用於存儲關鍵數據和實現分佈式調度,在現代化的集羣運行中可以起到關鍵性的做用。linux

etcd 基於 Raft 協議,經過複製日誌文件的方式來保證數據的強一致性。在 etcd 以前,經常使用的是基於 Paxos 協議的 ZooKeepergit

etcd

etcd 主要特性有:github

  • 簡單:基於 HTTP+JSON 的 API 讓你用 curl 就能夠輕鬆使用。
  • 安全:可選 SSL 客戶認證機制。
  • 快速:每一個實例每秒支持一千次寫操做。
  • 可信:使用 Raft 算法充分實現了分佈式。

1. 安裝

1.1 下載可執行文件:https://github.com/etcd-io/et...

下載最新發行版打包文件、解壓、執行便可運行:golang

$ tar zxvf etcd-v3.3.18-linux-amd64.tar.gz
$ cd etcd-v3.3.18-linux-amd64/
$ ./etcd # 運行 etcd 服務端
$ ./etcdctl # 運行 etcd 客戶端


1.2 下載源代碼編譯

$ git clone https://github.com/etcd-io/etcd.git
$ cd etcd
$ ./build


1.3 查看運行狀況

$ 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 守護進程已成功開啓。算法


1.4 經常使用命令

kv 鍵值存儲最經常使用命令是:putgetdel安全

./etcdctl put hello world # 設置 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 文件以下: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.gotcp

$ go run kv_demo.go 
connect succ
hello : world


demo 源碼: https://github.com/astraw99/etcd_go

能夠看到,上面的 demo 成功進行 key-value 設置與獲取。固然 etcd 的命令還有不少,今天初步使用就簡單使用這個 kv 存儲,其餘後面慢慢解析。分佈式


3. 小結

本文對 etcd 進行了簡單認識和了解,對其最經常使用的 key-value 分佈式存儲進行了 golang-demo 演示,能夠看出 etcd 的部署、使用是很簡單的,客戶端命令也很明晰,下一步將深刻源碼一步一步去探索 etcd 的實現細節。ui

ectd 做爲分佈式服務發現、一致性存儲領域的後起之秀,在分佈式集羣、雲部署、雲應用方面具備舉足輕重的做用,從其官方 GitHub 能夠看到代碼更新迭代快速、從版本 v2 => v3,隨着 CoreOSKubernetes 等項目在開源社區日益火熱,相信在不久的未來將會獲得更爲普遍的應用。

相關文章
相關標籤/搜索