浅入深出etcd之集群部署与golang客户端使用(代码片段)

linkstar linkstar     2022-12-19     241

关键词:

前言

之前说了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

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

浅入深出elasticsearch构建高性能搜索架构

课程目录以及下载地址:任务2:es与solr对比介绍任务3:centos的安装虚拟机网络配置任务4:elasticsearch5.0集群安装任务5:elasticsearchhead插件讲解任务6:elasticsearchkibana安装与使用任务7:ik分词器插件的编译安装任务8:ik分词器插件... 查看详情

浅入深出vue:工具准备之webstorm安装配置(代码片段)

浅入深出Vue之工具准备(一):WebStorm安装配置工欲善其事必先利其器,让我们先做好准备工作吧导航篇WebStorm安装配置所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版本的WebStorm安装下载后即可食用,此步... 查看详情

浅入深出elasticsearch构建高性能搜索架构

浅入深出ElasticSearch构建高性能搜索架构 课程学习地址:http://www.xuetuwuyou.com/course/161课程出自学途无忧网:http://www.xuetuwuyou.com一、课程用到的软件ElasticSearch5.0.0SpringToolSuite3.8.2.RELEASEMaven3.0.5Spring4Netty4Hadoop2.7.1K 查看详情

whywebrtc|“浅入深出”的工作原理详解

前言近几年实时音视频通信应用呈现出了大爆发的趋势。在这些实时通信技术的背后,有一项不得不提的技术——WebRTC。今年1月,WebRTC被W3C和IETF发布为正式标准。据调研机构GrandViewReseach的报告显示,预计2025年全球We... 查看详情

----已搬运------浅入深出fastcgi协议分析与php-fpm攻击方法--------学习子自大佬的教程ftp那里没做完(代码片段)

目录:1.前言2.CGI3.FastCGI4.浏览器处理静态/动态网页过程4.1浏览器访问静态网页过程4.2浏览器访问动态网页过程5.Fastcgi协议分析5.1FastcgiRecord5.2FastcgiType6.PHP-FPM7PHP-FPM任意代码执行8.PHP-FPM未授权访问漏洞8.1环境搭建8.2配置PHP-FPM8.3... 查看详情

saml2.0浅入深出《一》

参考技术A目录1、什么是SAML2、有哪些应用场景3、SAML身份验证的工作原理SAML的英文全称是SecurityAssertionMarkupLanguage(发音sam-el),即安全断言标记语言。是一种支持单点登录(SSO)的开放标准。通过仅使用一组登录凭据访问一系... 查看详情

由浅入深聊聊golang的map(代码片段)

...对于map的讲解,结合自己之前的积累,专门来由浅入深的总结一下,希望可以与map之间做一个了断。文章的深浅顺序是递进的,当你看完这篇文章,你也基本掌握了map的99%的知识点了,可以装逼和吹牛逼了... 查看详情

spring之aop由浅入深

引自:http://www.cnblogs.com/zhaozihan/p/5953063.html1.AOP的作用  在OOP中,正是这种分散在各处且与对象核心功能无关的代码(横切代码)的存在,使得模块复用难度增加。AOP则将封装好的对象剖开,找出其中对多个对象产生影响的公... 查看详情

由浅入深分析精准测试之覆盖

作者:京东工业 宛煜昕测试的覆盖通常是指需求范围的执行程度,如需求、测试用例、缺陷的正向与逆向的双向追溯。便于对其相关属性的度量,即使用了覆盖率。一、覆盖率与测试策略覆盖率是度量测试完整性的一个手段... 查看详情

kubernetes集群之二进制安装部署(单master节点)(代码片段)

...见的K8S按照部署方式二、安装部署分析三、首先部署ETCD集群3.1ETCD介绍3.2准备CFSSL证书签发环境3.3环境部署3.3.1搭建ETCD步骤3.3.2下载准备CFSSL证书制作工具3.3.3上传etcd-cert.sh和etcd.sh到/opt/k8s/目录中3.3.4安装ETCD服务3.3.5配置ETCD集群3.3.... 查看详情

Hazelcast (Java) 和 ETCD (golang) 的区别/相似之处?

...数据的一致性,并且我们需要某种分布式映射来知道哪个客户端连接到哪个服务器。我之前没有分布 查看详情

由浅入深聊聊golang的sync.pool(代码片段)

前言今天在思考优化GC的套路,看到了sync.Pool,那就来总结下,希望可以有个了断。用最通俗的话,讲明白知识。以下知识点10s后即将到来。1.pool是什么?2.为什么需要sync.Pool?3.如何使用sync.Pool?4.走... 查看详情

由浅入深聊聊golang的sync.map(代码片段)

...安全的东西,其实之前就有写过map相关文章:由浅入深聊聊Golang的map。但是没有详细说明sync.Map是怎么一回事。回想了一下,竟然脑中只剩下“两个map、一个只读一个读写,xxxxx”等,关键词。有印象能扯,... 查看详情

kubernetes集群之二进制安装部署(单master节点)(代码片段)

...见的K8S按照部署方式二、安装部署分析三、首先部署ETCD集群3.1ETCD介绍3.2准备CFSSL证书签发环境3.3环境部署3.3.1搭建ETCD步骤3.3.2下载准备CFSSL证书制作工具3.3.3上传etcd-cert.sh和etcd.sh到/opt/k8s/目录中3.3.4安装ETCD服务3.3.5配置ETCD集群3.3.... 查看详情

elasticsearch由浅入深(代码片段)

文章目录一.elasticsearch简介二.docker部署es和kibana三.IK分词器四.DSL及DevTools五.索引库操作五.文档操作六.RestClient操作索引库七.RestClient操作文档八.DSL查询语法九.搜索结果处理十.RestClient查询文档十一.数据聚合十二.RestClient数据聚合... 查看详情

由浅入深聊聊golang中select的实现机制(代码片段)

正文话说今天在玩select的时候发现一个问题,是这样的:片段1:funcmain() varcountint for select case<-time.Tick(time.Millisecond*500): fmt.Println("咖啡色的羊驼") count++ fmt.Println(" 查看详情

kubernetes学习一:kubernetes集群搭建之etcd安装部署(代码片段)

目录1、软件版本和环境介绍2、服务器信息介绍(以下称主机名)3、etcd安装部署3.1、cfssl安装3.2、创建etcd证书3.3、etcdca配置3.4、etcdca证书3.5、etcdserver证书3.6、生成etcdca证书和私钥初始化ca3.7、生成server证书3.8、下发证书... 查看详情

kubernetes生产环境安装部署基于kubernetesv1.14.0之部署规划

1.安装规划1.1部署节点说明etcd集群规划etcd中心集群192.168.2.247192.168.2.248192.168.2.249etcd事件集群192.168.2.250192.168.2.251192.168.2.252Kubernetesmaster节点集群规划192.168.3.10192.168.3.11192.168.3.12192.168.3.13192.168.3.14K 查看详情