etcd 初识
# 什么是ETCD
etcd是一个Go言编写的分布式、高可用的一致性键值存储系统,用于提供可靠的分布式键值存储、配置共享和服务发现等功能。
简单:
易使用:基于HTTP+JSON的API让你用curl就可以轻松使用;
易部署:使用Go语言编写,跨平台,部署和维护简单。
可靠:
- 强一致:使用Raft算法充分保证了分布式系统数据的强一致性;
- 高可用:具有容错能力,假设集群有n个节点,当有(n-1)/2节点发送故障,依然能提供服务;
- 持久化:数据更新后,会通过WAL格式数据持久化到磁盘,支持Snapshot快照。
快速:每个实例每秒支持一千次写操作,极限写性能可达10K QPS。
安全:可选SSL客户认证机制。
# 整体框架
- HTTP Server:用于处理用户发送的API请求以及其它etcd节点的同步与心跳信息请求。
- Store:用于处理etcd支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是etcd对用户提供的大多数API功能的具体实现。
- Raft:Raft强一致性算法的具体实现,是etcd的核心。
- WAL:Write Ahead Log(预写式日志),是etcd的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。WAL中,所有的数据提交前都会事先记录日志。Snapshot是为了防止数据过多而进行的状态快照;Entry表示存储的具体日志内容。
# 常见应用场景
1. 配置中心
- etcd是一个分布式的键值存储系统,其优秀的读写性能、一致性和可用性的机制,非常适合用来做配置中心角色。
2. 分布式锁
- etcd的强一致性保证,可以用来做分布式场景下的同步机制保证。
3. leader选举组件
- 分布式场景下,常采用leader-follower模式来保证有状态服务的高可用(即使leader挂掉,其他follower立马补上),比如k8s和kafka partition高可用机制。可以很方便的借助etcd来实现leader选举机制,这里有个leader election实现:https://github.com/willstudy/leaderelection (opens new window)
4. 服务注册与服务发现
- 为了解决微服务场景下,服务地址的注册和发现问题。和配置中心功能类似,不同之处在于服务注册和服务发现,还伴随着状态检测。
5. 消息订阅和发布
- etcd内置watch机制,完全可以实现一个小型的消息订阅和发布组件。
# 简单操作
# 1. curd
最常见的就是put、get和del命令。
# 放入一个 键值对
~ etcdctl put "name" "zyq1"
OK
#取出一个 键值对
~ etcdctl get "name"
name
zyq1
# 删除一个 键值对
~ etcdctl del "name"
1
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 2.watch
watch命令用来监测key的变化,会建立长连接,一直监听。
~ etcdctl watch "name"
PUT
name
zyq1
DELETE
name
1
2
3
4
5
6
2
3
4
5
6
# 3. 租约
租约是一段时间,可以为etcd的key授予租约。当key被附加到租约时,它的生存时间被绑定到租约的生存时间,一旦租约的TTL到期,租约就过期并且所有附带的key都将被删除。
一个租约可以绑定不止一个key。
# 创建一个20s的租约
$ ./etcdctl lease grant 20
lease 694d673115905e37 granted with TTL(20s)
# 使用租约的 id 进行 put 操作
$ ./etcdctl put --lease=694d673115905e37 "name" "zyq"
# 20s后get发现 key被删除了
$ ./etcdctl get "name"
# 空应答
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
租约可以被删除
# 创建一个20s的租约
$ ./etcdctl lease grant 1000
lease 694d673115905e49 granted with TTL(1000s)
# 使用租约的 id 进行 put 操作
$ ./etcdctl put --lease=694d673115905e49 "name" "zyq"
OK
# 删除租约
$ ./etcdctl lease revoke 694d673115905e49
lease 694d673115905e49 revoked
# 发现key也被删除了
$ ./etcdctl get "name"
# 空应答
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
租约可以自动续租
# 创建一个20s的租约
$ ./etcdctl lease grant 20
lease 694d673115905e4f granted with TTL(20s)
# 自动续租
$ ./etcdctl lease keep-alive 694d673115905e4f
lease 694d673115905e4f keepalived with TTL(20)
lease 694d673115905e4f keepalived with TTL(20)
1
2
3
4
5
6
7
2
3
4
5
6
7
上次更新: 2023/04/16, 18:35:33