etcd

etcd means distributed etc directory. 是一个高可用强一致性的键值仓库,主要用作分布式系统的独立的协调服务。最经典的使用场景是服务发现

特点:

  • 简单:易部署、易使用。API 基于 HTTP 和 JSON。gRPC。
  • 安全:可选 TLS 客户认证机制。
  • 快速:可支持每秒 10000 次写操作。
  • 可靠:使用 Raft 算法充分实现了分布式。

# 服务发现 Service Discovery

服务发现要解决的是分布式系统最常见的问题,即同一个分布式集群中的进程或服务要如何才能找到对方并建立连接

三大支柱:

  • 一个强一致性、高可用的服务存储目录
  • 一种注册服务和监控服务健康状态的机制
  • 一种查找和连接服务的机制

# etcd 的核心组件

etcd.jpg

  • HTTP Server:处理用户的 API 请求;etcd 节点的同步、心跳请求。
  • Store:处理各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等。
  • Raft:强一致性算法的具体实现,是 etcd 的核心。
  • WAL(Write Ahead Log) :是 etcd 存储数据的方式,在内存中存储所有数据以及节点的索引,并通过 WAL 进行持久化。
    Snapshot 是为了防止数据过多而进行的状态快照。
    Entry 表示存储的具体日志内容。

# 用户从集群的那个节点读写数据?

etcd 集群的数据都是从 Leader 节点流向 Follower 节点,不一致的情况以 Leader 节点的数据为准。用户可对所有节点进行读写,如果请求来自 Follower 节点,会将请求转发给 Leader 节点,其写入之后会发给所有 Follower 节点。

# 如何选举 Leader 节点?

集群启动后,所有节点会有一个随机的 Timer,第一个 Timer 结束的节点会向其他节点发出成为 Leader 的请求,其他节点会投票回应,然后第一个节点成为 Leader。
成为 Leader 的节点会以固定的时间间隔向其他节点发送通知,确保自己任然是 Leader。其他 Follower 收不到通知的时候,回重复之前的步骤选举新的 Leader。

# 判断写入是否成功

etcd 认为写入请求被 Leader 节点处理并发给了多数节点后,就是一个成功的写入。
界定多数节点的公式:quorum=N/2+1
节点数量一般选用奇数,因为奇数 N 的容错节点数量和 N+1 的一样。

# 安装

直接去 https://github.com/etcd-io/etcd/releases (opens new window) 下载可执行文件

# 参考

图解 etcd | Go 技术论坛 (opens new window)
golang etcd 简明教程 | Go 技术论坛 (opens new window)
FAQ (opens new window)