22

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

 4 years ago
source link: https://studygolang.com/articles/25212
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

etcd 是一个 golang 编写的分布式、高可用的一致性键值存储系统,是目前容器编排领域火热的 Kubernetes(k8s) 内置的服务发现与节点一致性中间件,用于提供可靠的分布式键值( key-value )存储、配置共享和服务发现等功能。 etcd 可以用于存储关键数据和实现分布式调度,在现代化的集群运行中能够起到关键性的作用。

etcd 基于 Raft 协议,通过复制日志文件的方式来保证数据的强一致性。在 etcd 之前,常用的是基于 Paxos 协议的 ZooKeeper

R36F3ai.png!web

etcd 主要特性有:

  • 简单:基于 HTTP+JSON 的 API 让你用 curl 就可以轻松使用。
  • 安全:可选 SSL 客户认证机制。
  • 快速:每个实例每秒支持一千次写操作。
  • 可信:使用 Raft 算法充分实现了分布式。

1. 安装

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

下载最新发行版打包文件、解压、执行即可运行:

$ 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 文件如下:

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

$ 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 的实现细节。

ectd 作为分布式服务发现、一致性存储领域的后起之秀,在分布式集群、云部署、云应用方面具有举足轻重的作用,从其官方 GitHub 可以看到代码更新迭代快速、从版本 v2 => v3 ,随着 CoreOSKubernetes 等项目在开源社区日益火热,相信在不久的将来将会得到更为广泛的应用。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK