etcd是一个分布式K-V数据库,是构建一个分布式系统的核心部分。
etcd需要重点掌握的知识
- api 比较简单的接口,组合实现功能
- 架构,与mysql里面使用的数据结构进行比较(b+树)
- raft,一致性算法,理解分布式系统中的同步算法一个很好的案例
etc目录在linux系统中通常用来放置一些用户无关的配置文件的信息。etcd是配置服务。
etcd设计是为了提供高可用、强一致性的小型kv数据存储服务。与redis的区别在于,redis是个内存数据库,而etcd自v3版本是磁盘数据库。
etcd的v3版本使用lease(租约)替换key ttl自动过期机制。
etcd支持事务(四个特性,原子性等)和多版本并发控制,也就是mvcc。用来解决什么问题?解决一致性非锁定读的问题。
etcd的存储引擎是boltdb。
etcd的linux 3.5.5版本的链接
链接:https://pan.baidu.com/s/1HmZwqTNsR6_FbCS_UCs8qQ
提取码:ot9e
api操作
一个窗口启动服务(整个操作实战我采用相对路径,没有设置环境变量)
./etcd
客户端去访问并操作
./etcdctl put key master
有put就有get
./etcdctl get key
打印所有key的信息
./etcdctl get key --prefix
监听某个key
./etcdctl watch key2
监听只会监听增删改的时间,不会监听查事件
事务练习
TXN if /then /else ops
租约
很多key可以共享一个租约,一个租约设置一个ttl(过期时间),当这个租约过期了,挂到这个租约上的所有key就失效了。用于集群监控以及服务注册发现
lease grant 创建一个租约
lease keep-alive 续约,实现注册发现的关键
lease list 枚举所有租约
lease revoke 销毁租约
lease timetolive 获取租约信息
如果删除租约,挂接在这个租约下的所有key都会被删除。
master@ubuntu:~/etcd-v3.5.5-linux-amd64$ etcdctl lease grant 10
lease 694d8393b7b47304 granted with TTL(10s)
应用场景
- 服务发现
- 负载均衡
etcd架构
可以看到,按照分层模型,etcd 可分为 Client 层、API 网络层、Raft 算法层、逻辑层和存储层。这些层的功能如下:
- Client 层:Client 层包括 client v2 和 v3 两个大版本 API 客户端库,提供了简洁易用的 API,同时支持负载均衡、节点间故障自动转移,可极大降低业务使用 etcd 复杂度,提升开发效率、服务可用性。
- API 网络层:API 网络层主要包括 client 访问 server 和 server 节点之间的通信协议。一方面,client 访问 etcd server 的 API 分为 v2 和 v3 两个大版本。v2 API 使用 HTTP/1.x 协议,v3 API 使用 gRPC 协议。同时 v3 通过 etcd grpc-gateway 组件也支持 HTTP/1.x 协议,便于各种语言的服务调用。另一方面,server 之间通信协议,是指节点间通过 Raft 算法实现数据复制和 Leader 选举等功能时使用的 HTTP 协议。
- Raft 算法层:Raft 算法层实现了 Leader 选举、日志复制、ReadIndex 等核心算法特性,用于保障 etcd 多个节点间的数据一致性、提升服务可用性等,是 etcd 的基石和亮点。
- 功能逻辑层:etcd 核心特性实现层,如典型的 KVServer 模块、MVCC 模块、Auth 鉴权模块、Lease 租约模块、Compactor 压缩模块等,其中 MVCC 模块主要由 treeIndex 模块和 boltdb 模块组成。
- 存储层:存储层包含预写日志 (WAL) 模块、快照 (Snapshot) 模块、boltdb 模块。其中 WAL 可保障 etcd crash 后数据不丢失,boltdb 则保存了集群元数据和用户写入的数据。
数据版本号机制
master@ubuntu:~/etcd-v3.5.5-linux-amd64$ ./etcdctl get key -w json | json_pp
{
"count" : 1,
"header" : {
"member_id" : 10276657743932975437,
"cluster_id" : 14841639068965178418,
"revision" : 6,
"raft_term" : 3
},
"kvs" : [
{
"create_revision" : 2,
"key" : "a2V5",
"mod_revision" : 6,
"version" : 3,
"value" : "Y2hhbmd4aW5n"
}
]
}
etcd存储原理
分布式锁分为公平锁和非公平锁。公平锁是因为采用互斥锁,非公平锁是因为采用自旋锁。互斥锁会用排队的机制。
B树和B+树的区别在于,B+将叶子节点用双向链表连接起来,适合范围查询。
mysql为了加快索引数据,采用什么数据结构?自适应hash。
读写机制
etcd不支持并发写,只支持并发读。
事务开始之前读取的是B+树的数据,采用内存映射mmap的方式。
Raft共识算法
动图欣赏
raft共识算法是一种保持数据一致性的算法。两种超时选举超时>心跳超时。raft可以解决脑裂(如因为网络不通,造成节点分区)的问题。