ETCD中一致性读的主要流程如下所示
ETCD 的一致性读(Linearizable Read)流程分为以下几个步骤:
目录
- 1. 客户端发送请求
- 2. 请求追踪和阻塞等待 Raft 响应
- **3. 请求 ReadIndex**
- **4. Leader 确认自己状态**
- **5. Leader 返回 ReadIndex**
- **6. Follower 响应 ReadIndex**
- **7. 等待 ReadIndex 应用到 MVCC**
- **8. 向 MVCC 发送查询请求**
- **9. MVCC 计算并返回结果**
- **10. 返回响应给客户端**
- **总结:关键点**
1. 客户端发送请求
2. 请求追踪和阻塞等待 Raft 响应
- 步骤 2:ETCD 服务器创建一个唯一的 Request ID 用于跟踪当前请求,并阻塞请求直到 Raft 模块给出响应。
3. 请求 ReadIndex
- 步骤 3:Follower 节点向 Leader 节点请求最新的 ReadIndex(Leader 的已提交索引)。
4. Leader 确认自己状态
- 步骤 4:Leader 节点通过发送 心跳(Heartbeat) 向 Follower 确认自己的领导身份并维持集群共识(quorum)。Follower 会向 Leader 返回心跳响应,确认 Leader 身份有效。
5. Leader 返回 ReadIndex
- 步骤 5:Leader 节点将自己的最新 已提交索引(committedIndex) 作为 ReadIndex 发送给请求的 Follower 节点。
6. Follower 响应 ReadIndex
- 步骤 6:Follower 节点接收到 Leader 返回的 ReadIndex 后,将其与本地已提交的条目进行比较,并返回一个阻塞的通道,直到本地节点的已提交条目与 Leader 的 ReadIndex 保持一致。
7. 等待 ReadIndex 应用到 MVCC
- 步骤 7:ETCD 服务器等待所有已提交的日志条目都被应用到本地的 MVCC(多版本并发控制存储层)。
8. 向 MVCC 发送查询请求
- 步骤 8:ETCD 服务器向 MVCC 存储层请求与客户端范围查询对应的键值数据。
9. MVCC 计算并返回结果
- 步骤 9:MVCC 模块根据最新的 ReadIndex 数据计算出结果(确保数据是最新的),然后将查询结果返回给 ETCD 服务器。
10. 返回响应给客户端
- 步骤 10:ETCD 服务器将结果通过 gRPC 接口返回给客户端,完成一致性读请求。
总结:关键点
- ReadIndex 机制:通过 Leader 返回的 ReadIndex 确保数据读取的一致性,Follower 必须等待自己的状态与 Leader 的状态同步。
- Raft 共识:Leader 和 Follower 通过心跳确认领导身份并维持集群一致性。
- MVCC 存储:最终的数据查询和读取由 MVCC 处理,确保返回的是最新的、正确的键值数据。
- 阻塞机制:ETCD 服务器会阻塞客户端请求,直到本地节点的已提交状态与 Leader 保持一致。
这种机制保证了 ETCD 在分布式环境下提供 线性一致性(Linearizable) 的读取操作。