0%

Etcd

1. etcd 是什么

etcd 是一个分布式键值对存储,设计用来可靠而快速的保存关键数据并提供访问。
通过分布式锁,leader 选举和写屏障(write barriers)来实现可靠的分布式协作。
etcd 集群是为高可用,持久性数据存储和检索而准备。

1.1 etcd 的应用场景:

  • 服务发现
  • 消息发布和订阅
  • 负载均衡
  • 分布式锁、分布式队列
  • 集群监控和 leader 竞选

2. etcd 的基本操作

  • 通过 http 进行通信
  • 通过 etcdctl 连接进行操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# put指令(update or create if key not exist)
etcdctl put [key] [value]

# ------

# get指令(search key-value)
etcdctl get [key]
etcdctl get [key1] [key2] [key3] […]
etcdctl get [ke] --prefix
etcdctl get [key] -w json # 使用json格式输出

# ------

# del指令(delete key-value)
etcdctl del [key1] […]

# ------

# watch指令(Monitor the operation of the target key)
etcdctl watch [key] # 监控单个key
etcdctl watch [key] --prefix # 监控一类前缀的key

# ------

# txn指令(事务)
etcdctl txn -i

# ------


# lease指令(租约,即key的TTL生存时间)
# etcd需要先创建租约才能通过`etcdctl put --lease=<lease_id> [key] [value]`来设置key-value的TTL

etcdctl lease grant 30 # 创建一个TTL=30s的租约
> lease <lease_id> granted with TTL(30s)
etcdctl put --lease=<lease_id> [key] [value]

# lease也会随着TTL时间过去而到期

3. etcd 的集群一致性

etcd 使用 Raft 协议,实现强一致性

3.1 Raft 协议架构

raft 协议中,节点有三种角色:leader、follower、candidate。
初始,所有节点都为 follower,当 follower 节点在指定时常内没收到 leader 的心跳包,就会晋升为 candidate(候选节点),
候选节点会向其他节点发送投票请求,请求其他节点投票,票数超过集群节点数量一半的节点会晋升为 leader。leader 负责处理所有客户端的事务请求。
若事务请求没到 leader,follower 节点也会将请求转发给 leader。

3.2 Raft 协议一致性

当 leader 节点接收到事务请求后,会先写入本地日志,然后向集群中每个 follower 节点发送请求,询问是否可以更新数据。
若超过一半节点都认同此次操作,则 leader 节点会将数据更新,将结果返回给客户端,并通知每个 follower 节点,更新自己的数据。从而保证集群数据的一致性