![7dc98f4da330192de7c23e3e9e3b230f.png](https://img-blog.csdnimg.cn/img_convert/7dc98f4da330192de7c23e3e9e3b230f.png)
Go语言基础(十六)
一、etcd介绍
二、etcd架构
三、Go语言连接etcd
四、思考题
一、etcd介绍
etcd是使用Go语言开发的一个开源的、高可用的分布式key-value存储系统,可以用于配置共享和服务的注册和发现。类似的项目有zookeeper和consul。现在都用etcd而不用zookeeper了。
etcd具有以下特点:
- 高全复制:集群中每个节点都可以使用完整的文档;
- 高可用性:Etcd可用于避免硬件的单点故障或网络问题;
- 一致性:每次读取都会返回跨主机的最新写入;
- 简单:包括一个定义良好、面向用户的API
- 安全:实现了带有可选的客户端证书身份验证的自动化TLS;
- 快速:每秒10000次写入的基准速度;
- 可靠:使用Raft算法实现强一致、高可用的服务存储目录;
etcd的应用场景一:服务发现
服务发现要解决的问题也是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务,要如何才能找到对方并建立连接,本质上来说,服务发现就是想要了解集群中是否有进程在监听cpu或tcp端口,并且通过名字就可以查找和连接。
etcd应用场景二:配置中心
将一些配置信息放到etcd上进行集中管理。应用在启动的时候主动从etcd获取一次配置信息,同时在etcd节点注册一个watcher并等待,以后每次配置有更新的时候,etcd都会实时通知订阅者,以此达到获取最新配置信息的目的。
etcd的应用场景三:分布式锁
因为etcd使用Raft算法保持了数据的强一致性,某次存储操作到集群中的值必然是全局一致的,所以很容易实现分布锁,锁服务有两种使用方式:一是保持独占,二是控制时序。
二、etcd架构
![7c3a855d6d5f9be597af124b8a71fd0f.png](https://img-blog.csdnimg.cn/img_convert/7c3a855d6d5f9be597af124b8a71fd0f.png)
etcd主要分为四个部分:
- Http Server:用于处理用户发送的API请求以及其他etcd节点的同步与心跳信息请求
- Store:用于处理etcd支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是etcd对用户提供的大多数API功能的具体实现。
- Raft:Raft强一致性算法的具体实现,是etcd的核心。
- WAL:write ahead log预写式日志,是etcd的数据存储方式。
etcd集群作为一个高可用键值存储系统,由于Raft算法在做决策时,需要多数节点的投票,因此etcd一般部署集群推荐奇数个节点。
1、etcd下载
下载地址:https://github.com/etcd-io/etcd/releases
![2aeda8e335a6473bee1e808867a3cb24.png](https://img-blog.csdnimg.cn/img_convert/2aeda8e335a6473bee1e808867a3cb24.png)
下载完成之后解压,在bin目录下找到tecd.exe,默认会在2379端口监听客户端通信,在2380端口监听节点通信。
![cc89db3f641eff9c24e107c2af0827f1.png](https://img-blog.csdnimg.cn/img_convert/cc89db3f641eff9c24e107c2af0827f1.png)
2、修改环境变量
注意连接etcd,默认的etcdctrl使用的是v2版本的命令,因此需要设置环境变量ETCDCTL_API=3来使用v3版本的API,而默认是v2版本的API。修改环境变量指定使用API版本,这个可能最新版本已经改过了,但为了确保一定是v3版本,还是设置一下环境变量。
SET
![d689d8dcb4c88580591f19c96407e45f.png](https://img-blog.csdnimg.cn/img_convert/d689d8dcb4c88580591f19c96407e45f.png)
3、etcd操作
可以试着重新启动cmd,使用命令put设置:在执行这个命令之前一定要先启动etcd.exe
etcdctl
![d934849438fd603a86aab87c289eb981.png](https://img-blog.csdnimg.cn/img_convert/d934849438fd603a86aab87c289eb981.png)
出现这种情况,就是因为版本不对,因此需要设置环境变量,指定v3版本:
![d571955e1d08959a10169f12baa6f808.png](https://img-blog.csdnimg.cn/img_convert/d571955e1d08959a10169f12baa6f808.png)
继续操作:使用命令get获取,使用命令del删除:
![14e22607eaa3ad9efe3a2a6cec5a2dce.png](https://img-blog.csdnimg.cn/img_convert/14e22607eaa3ad9efe3a2a6cec5a2dce.png)
三、Go语言连接etcd
etcd第三方库:
go
![e604eb7de2cf7c3ab88058f68ce50068.png](https://img-blog.csdnimg.cn/img_convert/e604eb7de2cf7c3ab88058f68ce50068.png)
这样虽然已经成功安装了etcd,但是也为后面买下了伏笔。
1、Put/Get
go连接etcd:
package
在终端中打开,go mod init, go build失败,
![17839f9056550d508d4b07efc9e07f88.png](https://img-blog.csdnimg.cn/img_convert/17839f9056550d508d4b07efc9e07f88.png)
打开生成的go.mod文件:
![d23b68fb7e9b57740f0280615d28b1a3.png](https://img-blog.csdnimg.cn/img_convert/d23b68fb7e9b57740f0280615d28b1a3.png)
主要原因是因为这行,在这里将v1.27.1修改为v1.26.0,再次go build,即编译成功,在运行.exe之前,一定要先启动etcd.exe。
![ca3dcb04b419b1bf241b8d1642835927.png](https://img-blog.csdnimg.cn/img_convert/ca3dcb04b419b1bf241b8d1642835927.png)
2、Watch
package
在终端中打开,go mod init, go build失败,修改go.mod文件,将http://google.golang.org/grpc v1.27.1修改为v1.26.0,然后再次编译,执行.exe之前,一定要先启动etcd.exe。
然后新启动一个cmd
![82fe8dbed8f20501ace4aafe390bb6a8.png](https://img-blog.csdnimg.cn/img_convert/82fe8dbed8f20501ace4aafe390bb6a8.png)
![92af314372cdf60d64158ad1fa1bfefd.png](https://img-blog.csdnimg.cn/img_convert/92af314372cdf60d64158ad1fa1bfefd.png)
3、etcd的logagent实现
![f991efe024eae6b4d30ebf267135a702.png](https://img-blog.csdnimg.cn/img_convert/f991efe024eae6b4d30ebf267135a702.png)
config.ini
[
config.go
package
etcd.go
package
kafka.go
package
taillog.go
package
taillog_mgr.go
package
main.go
package
4、logagent根据IP拉取自己的配置
utils/ip.go
package
在main函数中稍作修改:
![ecead107d1a8ff5ea80cf98a69790bd9.png](https://img-blog.csdnimg.cn/img_convert/ecead107d1a8ff5ea80cf98a69790bd9.png)
四、思考题
1、Raft协议
2、watch底层实现原理
我是尾巴~
每日一句毒鸡汤:谁说时间一定会给答案,时间只教会一个人伪装,把最重要的事情变得一般重要,把一般重要的事情变得不那么重要。
本次推荐:学术导航网站
Google学术搜索镜像_sci-hub网址_大木虫学术导航
Google学术搜索|SCI-HUB网址|谷歌学术搜索|龙猫学术导航
谷歌学术_SCI-HUB网址-科研干货导航
http://www.20009.net
http://www.sci-hub.ac.cn
继续加油~!