【ETCD】ETCD 的一致性读(Linearizable Read)流程解析

ETCD中一致性读的主要流程如下所示

ETCD 的一致性读(Linearizable Read)流程分为以下几个步骤:

目录

      • [1. 客户端发送请求](#1. 客户端发送请求)
      • [2. 请求追踪和阻塞等待 Raft 响应](#2. 请求追踪和阻塞等待 Raft 响应)
      • [**3. 请求 ReadIndex**](#3. 请求 ReadIndex)
      • [**4. Leader 确认自己状态**](#4. Leader 确认自己状态)
      • [**5. Leader 返回 ReadIndex**](#5. Leader 返回 ReadIndex)
      • [**6. Follower 响应 ReadIndex**](#6. Follower 响应 ReadIndex)
      • [**7. 等待 ReadIndex 应用到 MVCC**](#7. 等待 ReadIndex 应用到 MVCC)
      • [**8. 向 MVCC 发送查询请求**](#8. 向 MVCC 发送查询请求)
      • [**9. MVCC 计算并返回结果**](#9. MVCC 计算并返回结果)
      • [**10. 返回响应给客户端**](#10. 返回响应给客户端)
      • **总结:关键点**

1. 客户端发送请求

  • 步骤 1:客户端向 ETCD 服务器(etcd gRPC server)发送一个范围查询(Range Request)。

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 接口返回给客户端,完成一致性读请求。

总结:关键点

  1. ReadIndex 机制:通过 Leader 返回的 ReadIndex 确保数据读取的一致性,Follower 必须等待自己的状态与 Leader 的状态同步。
  2. Raft 共识:Leader 和 Follower 通过心跳确认领导身份并维持集群一致性。
  3. MVCC 存储:最终的数据查询和读取由 MVCC 处理,确保返回的是最新的、正确的键值数据。
  4. 阻塞机制:ETCD 服务器会阻塞客户端请求,直到本地节点的已提交状态与 Leader 保持一致。

这种机制保证了 ETCD 在分布式环境下提供 线性一致性(Linearizable) 的读取操作。

相关推荐
夜之眷属5 小时前
JVM实战:服务器堆外内存去哪了(NMT实测)
java·服务器·jvm·后端·性能优化
这个DBA有点耶5 小时前
关系数据库管理系统选型指南:四步决策框架与主流产品技术路线对比
数据库·sql·程序人生·mysql·database·dba
jason.zeng@15022075 小时前
(七)「固化 Rest 接口 + Text-to-SQL 灵活查询」双模式 Agent 架构教程
数据库·python·sql·ai·架构·langchain·ai编程
运维行者_5 小时前
PHP性能监控怎么做?从响应时间到慢函数的6个关键指标
运维·服务器·开发语言·网络·支持向量机·php·接口隔离原则
小HANN5 小时前
华为云企业网站上云实战|从零搭建高可用WordPress(ECS+RDS+ELB+弹性伸缩+云监控全流程落地)
linux·运维·服务器·经验分享
我不会起名字3226 小时前
MVCC 快照读为什么读不到刚提交的数据:ReadView 的 4 条可见性规则
数据库·mysql·innodb·mvcc·事务隔离
2501_933670796 小时前
2027届数据类专业投用户增长岗:A/B实验、指标和SQL准备思路
数据库·sql
用户337922545686 小时前
Sirchmunk 深度解析(一):一个无需向量数据库的自进化搜索引擎架构设计
数据库
染指11106 小时前
139.Agent-多Agent框架-Skills渐进式加载文档
数据库·人工智能·langchain·agents
骑着蜗牛撵大象3276 小时前
SpringBoot+Vue3 企业智能体侧挂架构:独立服务、独立数据库与主线零侵入落地
数据库·spring boot·架构·vue·springboot·事件驱动·服务拆分