一.etcd简介
etcd 是一个分布式键值对存储系统,由coreos 开发,内部采用 raft 协议作为一致性算法,用于可靠、快速地保存关键数据,并提供访问。通过分布式锁、leader选举和写屏障(write barriers),来实现可靠的分布式协作。etcd集群是为高可用、持久化数据存储和检索而准备。
概念词汇
Raft: etcd所采用的保证分布式系统强一致性的算法。
Node: 一个Raft状态机实例。
Member: 一个etcd实例。它管理着一个Node,并且可以为客户端请求提供服务。
Cluster: 由多个Member构成、可以协同工作的etcd集群。
Peer: 对同一个etcd集群中另外一个Member的称呼。
Client: 向etcd集群发送HTTP请求的客户端。
WAL: 预写式日志,etcd用于持久化存储的日志格式。
snapshot: etcd防止WAL文件过多而设置的快照,存储etcd数据状态。
Proxy: etcd的一种模式,为etcd集群提供反向代理服务。
Leader: Raft算法中,通过竞选而产生的、处理所有数据提交的节点。
Follower: 竞选失败的节点作为Raft中的从属节点,为算法提供强一致性保证。
Candidate:当Follower超过一定时间接收不到Leader的心跳时转变为Candidate开始竞选。
Term: 某个节点成为Leader到下一次竞选时间,称为一个Term。
Index: 数据项编号。Raft中通过Term和Index来定位数据
应用场景
服务发现
消息发布与订阅
负载均衡
分布式通知与协调
分布式锁、分布式队列
集群监控与Leader竞选
etcd与redis
etcd: 用于共享配置和服务发现的分布式一致键值存储. etcd 是一种分布式键值存储, 它提供了一种跨机器集群存储数据的可靠方式. etcd 在网络分区期间优雅地处理 master 选举, 并且会容忍机器故障.
redis: 持久化在磁盘上的内存数据库, Redis 是一个开源、BSD 许可的高级键值存储. 它通常被称为数据结构服务器, 因为键可以包含字符串、散列、列表、集合和排序集合.
二.etcd安装
采用二进制安装,解压后将etcd和etcdctl二进制文件复制到/user/bin/下即可:
版本查看:
etcd常用命令:
指定ip端口启动etcd:
三.go操作etcd
put和get
watch
监听test的变化,Watch返回的是一个WatchResponse的管道类型,所以我们可以用for循环取值,每当test发生变化,watch就会发现并做相应操作:
type WatchResponse struct {
Header pb.ResponseHeader
Events []*storagepb.Event
CompactRevision int64
Canceled bool
}
type Event struct {
Type Event_EventType `protobuf:"varint,1,opt,name=type,proto3,enum=storagepb.Event_EventType" json:"type,omitempty"`
Kv *KeyValue `protobuf:"bytes,2,opt,name=kv" json:"kv,omitempty"`
}
四.go中安装etcd v3的坑
***建议直接使用clientv3的3.5版本,与grpc最新版本兼容,安装: go get go.etcd.io/etcd/client/v3@v3.5.4,详细版本迭代及操作建议参考官方说明: https://github.com/etcd-io/etcd/tree/main/client/v3
***如果受go版本或公司大环境影响不能使用最新版本,可以参考下边操作
1.当我们直接使用go get github.com/coreos/etcd/clientv3或者go get go.etcd.io/etcd时,会自动安装etcd2.3.8版本,一个很久的版本,所以在安装时一定要指定版本, 如: go get github.com/coreos/etcd/clientv3@v3.3.25
2.必须安装有grpc v1.26.0版本. 如果装有多个版本的grpc,需要在go.mod中需添加下边代码或者直接不使用go mod tidy导包,而是通过go get google.golang.org/grpc@v1.26.0和go get github.com/coreos/etcd/clientv3@v3.3.25完成导包
五.etcd实现服务注册和发现
方法汇总:
clientv3.New: 创建etcdv3客户端(func New(cfg Config) (*Client, error))
clientv3.Config: 创建客户端时使用的配置
Grant: 初始化一个新租约(Grant(ctx context.Context, ttl int64) (*LeaseGrantResponse, error))
Put: 注册服务并绑定租约
KeepAlive: 设置续租,定期发送续租请求(KeepAlive(ctx context.Context, id LeaseID) (<-chan *LeaseKeepAliveResponse, error))
Revoke: 撤销租约
Get: 获取服务
Watch: 监控服务
实现流程:
实现代码:
1.服务注册
注册一个前缀为/web的服务:
2.服务发现
通过/web前缀发现服务,并持续监测/web服务的变化
3.测试
六.grpc注册etcd集群
在使用grpc作为服务,并用etcd作为服务发现工具时要注意grpc版本.