etcd概述
etcd是一种分布式,可靠key-value数据存储系统。用于存储分布式系统中关键数据。
etcd逻辑架构
etcd主要分为四个部分:
- HttpServer:用于处理用户发送API请求以及其他etcd各节点之间的消息同步和心跳检查。
- Store:用于处理 etcd 支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是 etcd 对用户提供的大多数 API 功能的具体实现。
- Raft:Raft 强一致性算法的具体实现,是 etcd 的核心。
- WAL: Write Ahead Log(预写式日志),是 etcd 的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd 就通过 WAL 进行持久化存储。WAL 中, 所有的数据提交前都会事先记录日志。Snapshot 是为了防止数据过多而进行的状态快照;Entry 表示存储的具体日志内容。
通常,一个用户的请求发送过来,会经由 HTTP Server 转发给 Store 进行具体的事务处理,如果涉及到节点的修改,则交给 Raft 模块进行状态的变更、日志的记录,然后再同步给别的 etcd节点以确认数据提交,最后进行数据的提交,再次同步。
etcd节点架构
- 通过选举得到一个leader节点。当leader节点挂掉后将会重新触发一轮选举机制。
- etcd节点状态:follower、leader、candidate。3种状态。
- 当leader掉线后将触发重新选举,follower状态下的节点通过不同的随机时间间隔向其他follower节点发起选举投,节点状态变更为candidate。
- 当投票选举通过产生出新的leader节点,该candidate节点变为leader,其他candidate节点重置为follower。
- etcd通过raft协议保持数据一致性,重要的一个原则quorum(大多数原则),
- 集群中只要有超过1/2的节点正常即视为集群正常。
- 数据同步过程中只要超过1/2的节点接收到数据即视为数据同步完成。
- raft一致性算法
- 实现etcd分布式数据一致性协同。
etcd数据单调递增
term:leader的任期,全局单调递增
revison:数据修改版本号,指mod_revison,全局单调递增。
由右图可看出,每次选主后term递增,每次进行数据修改后revison递增。
etcd的数据版本维护
etcd的读取key和watch机制均能获取到任意版本的value。但让默认返回的是当前最新版本的value。
etcd是如何实现和存储这些value的。
etcd中维护了多个个b+树,其中一个b+树是revison指向value,另外两个b+树是index,key指向revison。每次获取key的值时都会去灰色的b+树种遍历查找目标revison的value。