浅入深出ETCD之【集群部署与golang客户端使用】

前言

之前说了etcd的简介,命令行使用,一些基本原理。这次来说说现实一点的集群部署和golang版本的客户端使用。因为在实际使用过程中,etcd的节点肯定是需要2N+1个进行部署的,所以有必要说明一下集群的部署。

集群部署

网上有很多集群部署的教程,有的很复杂,其实对于我们实际使用来说,其实配置并不复杂,下面举例一种最简单的集群配置。(简单到你想不到~)

下载

https://github.com/etcd-io/etcd/releases
还是在github上面找到需要下载的版本
我使用的是etcd-v3.3.13-linux-amd64.tar.gz
使用wget下载到linux你喜欢的目录,或者本地下载完成之后上传均可。

部署

首先我找了三台机器,对应ip为
192.168.4.224
192.168.4.225
192.168.4.226
PS:提醒一下记得开发对应防火墙的端口

然后将下载的文件解压,之后进入解压后的目录,分别使用下面的命令启动。(注意下面的命令对应的是三台不同的机器,你需要修改对应为你自己的ip)

$ ./etcd --name infra0 --initial-advertise-peer-urls http://192.168.4.224:2380 \
--listen-peer-urls http://192.168.4.224:2380 \
--listen-client-urls http://192.168.4.224:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://192.168.4.224:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://192.168.4.224:2380,infra1=http://192.168.4.225:2380,infra2=http://192.168.4.226:2380 \
--initial-cluster-state new

$ ./etcd --name infra1 --initial-advertise-peer-urls http://192.168.4.225:2380 \
--listen-peer-urls http://192.168.4.225:2380 \
--listen-client-urls http://192.168.4.225:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://192.168.4.225:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://192.168.4.224:2380,infra1=http://192.168.4.225:2380,infra2=http://192.168.4.226:2380 \
--initial-cluster-state new

$ ./etcd --name infra2 --initial-advertise-peer-urls http://192.168.4.226:2380 \
--listen-peer-urls http://192.168.4.226:2380 \
--listen-client-urls http://192.168.4.226:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://192.168.4.226:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://192.168.4.224:2380,infra1=http://192.168.4.225:2380,infra2=http://192.168.4.226:2380 \
--initial-cluster-state new

至此,三个节点的集群部署完成。😂😂😂没错就是这么easy,没有网上说的那么复杂。

配置文件

如果你嫌弃每次使用这么长的命令进行启动,你可以将它写为配置文件:

# 当前节点名称
name: infra1
# etcd数据保存目录
data-dir: /usr/local/etcd

# 供外部客户端使用的url
listen-client-urls: http://192.168.4.225:2379,http://127.0.0.1:2379
# 广播给外部客户端使用的url
advertise-client-urls: http://192.168.4.225:2379

# 集群内部通信使用的URL
listen-peer-urls: http://192.168.4.225:2380
# 广播给集群内其他成员访问的URL
initial-advertise-peer-urls: http://192.168.4.225:2380

# 集群的名称
initial-cluster-token: etcd-cluster-1
# 初始集群成员列表
initial-cluster: infra0=http://192.168.4.224:2380,infra1=http://192.168.4.225:2380,infra2=http://192.168.4.226:2380

#初始集群状态
initial-cluster-state: new

然后指定配置文件的路径进行启动就可以了

./etcd --config-file=conf.yml

其他部署策略

以上的部署一方面,我个人部署时使用的最简单方式,更简单的可能是使用yum进行etcd的下载。
当然上述方式也存在一些问题,现在的etcd相当于裸奔的情况:

  • 没有鉴权就想到于任何人知道ip和端口就可以连接上你的etcd,所以当前可能只适用于内网使用,服务通过内网ip进行访问(这个可以通过添加权限和用户来完成)
  • 当前通信是没有加密的
  • 当前etcd是利用静态ip来进行配置的,我认为这也是实际中用到最普通的情况,但是etcd还提供发现机制来进行部署和配置,更加灵活

等等,这些部署策略更多针对于线上,因为官方写的非常详细了,我感觉再写也就班门弄斧了。
https://doczhcn.gitbook.io/etcd/index/index-1/clustering

Golang客户端使用

这里来实际用代码操作一下etcd,还是和之前使用命令行一样,get/put/del/watch/lease用一下这些操作,其他操作请查看doc
https://godoc.org/github.com/coreos/etcd/clientv3

客户端下载

这里不建议使用go get进行下载,真的太慢了,可以直接从github上面下载之后放到对应目录快一些。https://github.com/etcd-io/etcd
下载解压之后放到gopath下对应:go/src/go.etcd.io/etcd

代码

package main

import (
    "context"
    "fmt"
    "go.etcd.io/etcd/clientv3"
    "go.etcd.io/etcd/mvcc/mvccpb"
    "time"
)

func main() {
    // 配置客户端连接
    client, err := clientv3.New(clientv3.Config{
        // Endpoints:   []string{"127.0.0.1:2379"},
        Endpoints:   []string{"192.168.4.224:2379", "192.168.4.225:2379", "192.168.4.226:2379"},
        DialTimeout: 5 * time.Second,
    })
    if err != nil {
        panic(err)
    }
    defer client.Close()

    // 启动watch监听
    watch := client.Watch(context.TODO(), "aaa")
    go func() {
        for {
            watchResponse := <- watch
            for _, ev := range watchResponse.Events {
                switch ev.Type {
                case mvccpb.DELETE:
                    fmt.Printf("监听到del:%s\n", ev.Kv.Key)
                case mvccpb.PUT:
                    fmt.Printf("监听到put:%s, %s\n", ev.Kv.Key, ev.Kv.Value)
                }
            }
        }
    }()

    // 新增
    putResponse, err := client.Put(context.TODO(), "aaa", "xxx")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(putResponse.Header.String())

    // 查询
    getResponse, err := client.Get(context.TODO(), "aaa")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(getResponse.Kvs)

    // 删除
    deleteResponse, err := client.Delete(context.TODO(), "aaa")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(deleteResponse.Header.String())

    // 申请租约
    grantResponse, err := client.Grant(context.TODO(), 10)
    if err != nil {
        fmt.Println(err)
        return
    }

    // 使用租约
    response, err := client.Put(context.TODO(), "aaa", "xxx", clientv3.WithLease(grantResponse.ID))
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(response.Header.String())
    
    // 等待租约自动过期
    time.Sleep(time.Second * 20)
}

大致能得到以下输出

监听到put:aaa, xxx
cluster_id:14841639068965178418 member_id:10276657743932975437 revision:53 raft_term:4
[key:"aaa" create_revision:53 mod_revision:53 version:1 value:"xxx" ]
监听到del:aaa
cluster_id:14841639068965178418 member_id:10276657743932975437 revision:54 raft_term:4
监听到put:aaa, xxx
cluster_id:14841639068965178418 member_id:10276657743932975437 revision:55 raft_term:4
监听到del:aaa

其实使用起来还是非常简单,我就不过多赘述了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容