06、etcd 写请求执行流程

这篇具有很好参考价值的文章主要介绍了06、etcd 写请求执行流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇内容主要来源于自己学习的视频,如有侵权,请联系删除,谢谢。

上一节我们学习了 etcd 读请求执行流程,这一节,我们来学习 etcd 写请求执行流程。

1、etcd写请求概览

etcd 一个写请求执行流程又是怎样的呢?

etcdctl 	put	 hello	world	‐‐endpoints	192.168.65.210:2379

06、etcd 写请求执行流程

执行流程:

  • 1、首先 client 端通过负载均衡算法选择一个 etcd 节点,发起 gRPC 调用;

  • 2、然后 etcd 节点收到请求后经过 gRPC 拦截器、Quota 模块后,进入 KVServer 模块;

  • 3、KVServer 模块向 Raft 模块提交一个提案,提案内容为“大家好,请使用 put 方法执行一个 key 为 hello,value 为 world 的命令”。

  • 4、随后此提案通过 Raft HTTP 网络模块转发、经过集群多数节点持久化后,状 态会变成已提交;

  • 5、etcdserver 从 Raft 模块获取已提交的日志条目,传递给 Apply 模块

  • 6、Apply 模块通过 MVCC 模块执行提案内容,更新状态机。

与读流程不一样的是,写流程还涉及 Quota、WAL、Apply 三个模块。etcd 的 crash-safe 及幂等性也正是基于 WAL 和 Apply 流程的 consistent index 等实现的。

2、详细步骤解读

2.1、Quota 模块

流程二

Quota 模块主要用于检查下当前 etcd db 大小加上你请求的 key-value 大小之和是否超过 了配额(quota-backend-bytes)。 如果超过了配额,它会产生一个告警(Alarm)请求,告警类型是 NO SPACE,并通过 Raft 日志同步给其它节点,告知 db 无空间了,并将告警持久化存储到 db 中。最终,无论 是 API 层 gRPC 模块还是负责将 Raft 侧已提交的日志条目应用到状态机的 Apply 模块, 都拒绝写入,集群只读

常见的 etcdserver: mvcc: database space exceeded 错误就是因为Quota 模块检测到 db 大小超限导致的。哪些情况会触发这个错误:

  • 一方面默认 db 配额仅为 2G,当你的业务数据、写入 QPS、Kubernetes 集群规模增大后,你的 etcd db 大小就可能会超过 2G。

  • 另一方面 etcd 是个 MVCC 数据库,保存了 key 的历史版本,当你未配置压缩策略的时候,随着数据不断写入,db 大小会不断增大,导致超限。

解决办法:

1、首先当然是调大配额,etcd 社区建议不超过 8G。

如果填的是个小于 0 的数,就会禁用配额功能,这可能会让db 大小处于失控,导致性能下降,不建议你禁用配额。

2、检查 etcd 的压缩(compact)配置是否开启、配置是否合理。

压缩时只会给旧版本Key打上空闲(Free)标记,后续新的数据写入的时候可复用这块空间,db大小并不会减小。

如果需要回收空间,减少 db 大小,得使用碎片整理 (defrag), 它会遍历旧的 db 文件数据,写入到一个新的 db 文 件。但是它对服务性能有较大影响,不建议你在生产集群频繁使 用。

调整后还需要手动发送一个取消告警(etcdctl alarm disarm)的命令,以消除所有告警, 否则因为告警的存在,集群还是无法写入。

这个注意别忘记了!!!

查看状态
etcdctl --endpoints=192.168.91.68:2379,192.168.91.68:12379,192.168.91.68:22379 endpoint status -w table

压缩
etcdctl --endpoints=192.168.91.68:2379,192.168.91.68:12379,192.168.91.68:22379 compact 1

碎片整理
etcdctl --endpoints=192.168.91.68:2379,192.168.91.68:12379,192.168.91.68:22379 defrag


etcdctl alarm disarm

2.2、KVServer 模块

流程3

通过流程二的配额检查后,请求就从 API 层转发到了流程三的 KVServer 模块的 put 方 法

KVServer 模块主要功能为:
1、打包提案: 将 put 写请求内容打包成一个提案消息,提交给 Raft 模块

2、请求限速、检查: 不过在提交提案前,还有限速、鉴权和大包检查

2.2.1、Preflight Check

为了保证集群稳定性,避免雪崩,任何提交到 Raft 模块的请求,都会做一些简单的限速判断。

限速

  • 如果 Raft 模块已提交的日志索引(committed index)已应用到状态机的日志索引 (applied index)超过了 5000,那么它就返回一个etcdserver: too many requests错误给 client。

鉴权

  • 然后它会尝试去获取请求中的鉴权信息,若使用了密码鉴权、请求中携带了 token,如果 token 无效,则返回auth: invalid auth token 错误给 client。

大包检查

  • 其次它会检查你写入的包大小是否超过默认的 1.5MB, 如果超过了会返回etcdserver: request is too large错误给 client。

06、etcd 写请求执行流程

2.3、Propose

流程4

通过检查后会生成一个唯一的 ID,将此请求关联到一个对应的消息通知 channel(用于接收结果),然后向 Raft 模块发起(Propose)一个提案(Proposal)。 Raft 模块发起提案后,KVServer 模块会等待此 put 请求,等待写入结果通过消息通知 channel 返回或者超时。

etcd 默认超时时间是 7 秒(5 秒磁盘 IO 延时 +2*1 秒竞选超时 时间),如果一个请求超时未返回结果,则可能会出现你熟悉的etcdserver: request timed out 错误。

2.4 WAL 模块

流程5

Raft 模块收到提案后,如果当前节点是 Follower,它会转发给 Leader,只有 Leader 才能 处理写请求

Leader 收到提案后,通过 Raft 模块输出待转发给 Follower 节点的消息和待持久化的日志 条目,日志条目则封装了我们上面所说的 put hello 提案内容。

etcdserver 从 Raft 模块获取到以上消息和日志条目后,作为 Leader,它会将 put 提案消 息广播给集群各个节点,同时需要把集群 Leader 任期号、投票信息、已提交索引、提案内 容持久化到一个 WAL(Write Ahead Log)日志文件中,用于保证集群的一致性、可恢复 性,也就是我们图中的流程五模块。

2.4.1、WAL 日志结构

WAL 日志结构如下:

06、etcd 写请求执行流程

WAL 文件它由多种类型的 WAL 记录顺序追加写入组成,每个记录由类型、数据、循环冗 余校验码组成不同类型的记录通过 Type 字段区分,Data 为对应记录内容,CRC 为循环 校验码信息

WAL 记录类型目前支持 5 种,分别是文件元数据记录、日志条目记录、状态信息记录、 CRC 记录、快照记录:

  • 文件元数据记录:包含节点 ID、集群 ID 信息,它在 WAL 文件创建的时候 写入;

  • 日志条目记录:包含 Raft 日志信息,如 put 提案内容;

  • 状态信息记录:包含集群的任期号、节点投票信息等,一个日志文件中会有 多条,以最后的记录为准;

  • CRC 记录:包含上一个 WAL 文件的最后的 CRC(循环冗余校验码)信息, 在创建、切割 WAL 文件时,作为第一条记录写入到新的 WAL 文件, 用于校验数据 文件的完整性、准确性等;

  • 快照记录:包含快照的任期号、日志索引信息,用于检查快照文件的准确性。

2.4.2、WAL 持久化

首先会将 put 请求封装成一个 Raft 日志条目,Raft 日志条目的数据结构信息如下:

type Entry struct {
   Term             uint64    `protobuf:"varint,2,opt,name=Term" json:"Term"`
   Index            uint64    `protobuf:"varint,3,opt,name=Index" json:"Index"`
   Type             EntryType `protobuf:"varint,1,opt,name=Type,enum=Raftpb.EntryType" json:"Type"`
   Data             []byte    `protobuf:"bytes,4,opt,name=Data" json:"Data,omitempty"`
}

它由以下字段组成:

  • Term 是 Leader 任期号,随着 Leader 选举增加;
  • Index 是日志条目的索引,单调递增增加;
  • Type 是日志类型,比如是普通的命令日志(EntryNormal),还是集群配置变更日志(EntryConfChange);
  • Data 保存我们上面描述的 put 提案内容。

具体持久化过程如下:
1、它首先先将 Raft 日志条目内容(含任期号、索引、提案内容)序列化后保存到 WAL 记录的 Data 字段, 然后计算 Data 的 CRC 值,设置 Type 为 Entry Type, 以上信息就组成了一个完整的 WAL 记录。

2、最后计算 WAL 记录的长度,顺序先写入 WAL 长度(Len Field),然后写 入记录内容,调用 fsync 持久化到磁盘,完成将日志条目保存到持久化存储中。

3、当一半以上节点持久化此日志条目后, Raft 模块就会通过 channel 告知 etcdserver 模块,put 提案已经被集群多数节点确认,提案状态为已提交,你可以执 行此提案内容了。

4、于是进入流程六,etcdserver 模块从 channel 取出提案内容,添加到先进 先出(FIFO)调度队列,随后通过 Apply 模块按入队顺序,异步、依次执行提案内 容。

2.5、Apply 模块

流程 7

Apply 模块主要用于执行处于 已提交状态的提案,将其更新到状态机

Apply 模块在执行提案内容前,首先会判断当前提案是否已经执行过了,如果执行了则直 接返回,若未执行同时无 db 配额满告警,则进入到 MVCC 模块,开始与持久化存储模块 打交道。

如果执行过程中 crash,重启后如何找回异常提案,再次执行的呢?

主要依赖 WAL 日志,因为提交给 Apply 模块执行的提案已获得多数节点确认、持久化, etcd 重启时,会从 WAL 中解析出 Raft 日志条目内容,追加到 Raft 日志的存储中,并重 放已提交的日志提案给 Apply 模块执行。

06、etcd 写请求执行流程

重启恢复时,如何确保幂等性,防止提案重复执行导致数据混乱呢?

etcd 通过引入一个 consistent index 的字段,来存储系统当前已经执行过的日志条目索 引,实现幂等性。

因为 Raft 日志条目中的索引(index)字段,而且是全局单调递增的,每个日志条目索引 对应一个提案。 如果一个命令执行后,我们在 db 里面也记录下当前已经执行过的日志条 目索引,就可以解决幂等性问题了。当然还需要将执行命令和记录index这两个操作作为原子性事务提交,才能实现幂等

2.6、MVCC 模块

流程 8 和 9

MVCC 主要由两部分组成,一个是内存索引模块 treeIndex,保存 key 的历史版本号信 息,另一个是 boltdb 模块,用来持久化存储 key-value 数据

MVCC 模块执行 put hello 为 world 命令时,它是如何构建内存索引和保存哪些数据到 db呢?

2.6.1、treeIndex

MVCC 写事务在执行 put hello 为 world 的请求时,会基于 currentRevision 自增生成新 的 revision, 如{2,0},然后从 treeIndex 模块中查询 key 的创建版本号、修改次数信息。这 些信息将填充到 boltdb 的 value 中,同时将用户的 hello key 和 revision 等信息存储到 B-tree,也就是下面简易写事务图的流程一,整体架构图中的流程八。

06、etcd 写请求执行流程

hello: revision{2,0}

这里的 2,0 具体指的是什么呢?

这里不太懂,有清楚的朋友,请不吝赐教。

2.6.2、boltdb

MVCC 写事务自增全局版本号后生成的 revision{2,0},它就是 boltdb 的 key,通过它就 可以往 boltdb 写数据了,进入了整体架构图中的流程九。

那么写入 boltdb 的 value 含有哪些信息呢?

写入 boltdb 的 value, 并不是简单的"world",如果只存一个用户 value,索引又是保存 在易失的内存上,那重启 etcd 后,我们就丢失了用户的 key 名,无法构建 treeIndex 模块 了。

因此为了构建索引和支持 Lease(租约) 等特性,etcd 会持久化以下信息:

  • key 名称;

  • key 创建时的版本号(create_revision)、最后一次修改时的版本号 (mod_revision)、key 自身修改的次数(version);

  • value 值;

  • 租约信息。

boltdb value 的值就是将含以上信息的结构体序列化成的二进制数据,然后通过 boltdb 提供的 put 接口,etcd 就快速完成了将你的数据写入 boltdb。

注意: 在以上流程中,etcd 并未提交事务(commit),因此数据只更新在 boltdb 所管理 的内存数据结构中。

事务提交的过程,包含 B+tree 的平衡、分裂,将 boltdb 的脏数据(dirty page)、元数 据信息刷新到磁盘,因此事务提交的开销是昂贵的。

如果我们每次更新都提交事务,etcd写性能就会较差。

etcd 的解决方案是合并再合并:

  • 首先 boltdb key 是版本号,put/delete 操作时,都会基于当前版本号递增生成新的版本 号,因此属于顺序写入,可以调整 boltdb 的 bucket.FillPercent 参数,使每个 page 填充 更多数据,减少 page 的分裂次数并降低 db 空间。
  • 其次 etcd 通过合并多个写事务请求,通常情况下,是异步机制定时(默认每隔 100ms) 将批量事务一次性提交(pending 事务过多才会触发同步提交), 从而大大提高吞吐量。但是这优化又引发了另外的一个问题, 因为事务未提交,读请求可能无法从 boltdb 获取 到最新数据
  • 为了解决这个问题,etcd 引入了一个 bucket buffer 来保存暂未提交的事务数据。在更新 boltdb 的时候,etcd 也会同步数据到 bucket buffer。因此 etcd 处理读请求的时候会优 先从 bucket buffer 里面读取,其次再从 boltdb 读,通过 bucket buffer 实现读写性能提 升,同时保证数据一致性。

以上就是 etcd 写请求执行的流程,自己还是有蛮多地方不太懂,常看常新吧。

学习链接

b站-etcd写请求执行流程-图灵教程文章来源地址https://www.toymoban.com/news/detail-536957.html

到了这里,关于06、etcd 写请求执行流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安全风险识别是什么?主要内容有哪些?

    安全风险识别是什么?在当今互联网时代,网络安全问题愈加突出。企业和个人的信息安全面临着越来越多的风险,因此,安全风险识别成为了一个非常重要的问题。本文主要分享安全风险识别是什么?主要内容有哪些? 安全风险识别是什么? 安全风险识别是指通过对企业

    2024年02月11日
    浏览(20)
  • 数据治理之数据字典的主要内容是什么?

    1 数据对象 :数据对象是指数据库中的表、字段、索引等数据元素,数据字典要记录这些数据对象的名称、类型、长度、精度等基本属性信息。 **2 数据关系:**数据字典要记录数据对象之间的关系,包括主键-外键关系、表之间的关联关系等。 **3 数据元数据:**数据元数据是

    2024年02月08日
    浏览(21)
  • 智慧校园建设主要包括哪些方面的内容?

    在当今数字化的时代,越来越多的学校开始实施智慧校园计划,旨在为学生和教师提供更加高效、便捷的学习和教学环境。 那么,究竟什么是智慧校园呢?智慧校园建设主要包括哪些方面的内容?这篇就来详细讲一讲! 智慧校园是指运用互联网、大数据、人工智能等先进技

    2024年02月07日
    浏览(29)
  • 水库大坝安全监测的主要内容包括哪些?

    在水库大坝的实时监测中,主要任务是通过无线传感网络监测各个监测点的水位、水压、渗流、流量、扬压力等数据,并在计算机上用数据模式或图形模式进行实时反映,以掌握整个水库大坝的各项变化情况。大坝安全监测系统能实现全天候远程自动监测,并将监测数据自动

    2024年02月11日
    浏览(19)
  • 软件测试的主要工作内容是什么

    平时说起程序员印象中大都是做Java、做前端、做后端,用着非常晦涩难懂的语言。在电脑前哐哐哐,没一会满屏代码显现出来。然而程序员并不全是印象中这样,还有一部分:他们不常写代码,主要去检查代码,是不是出现了漏洞、程序是否能运行下去?那这部分程序员就是

    2024年02月05日
    浏览(20)
  • PMP项目管理主要学习内容是什么?

    PMP项目管理是指根据美国项目管理学会(Project Management Institute,简称PMI)制定的项目管理知识体系和方法论进行项目管理的一种认证。PMP主要关注项目的规划、执行和控制等方面的知识和技能。 下面是PMP项目管理《PMBOK指南》第六版的主要学习内容: 1. 项目启动:包括项目章程

    2024年02月10日
    浏览(18)
  • vtk9.3 关于vtk --- 来源于官方网站

            Visualization Toolkit(VTK)是一个强大的开源软件系统,提供了在3D计算机图形学、图像处理、建模、体积渲染和科学可视化方面的高级功能。它提供了线程和分布式内存并行处理,以实现可伸缩性和更好的性能。         VTK 是一个跨平台库,可以在许多操作系统

    2024年01月16日
    浏览(23)
  • 开发一个软件的主要流程

    本文重点解决如下问题:开发一个软件的主要流程是什么? 了解开发一个软件的主要流程对于编程者而言非常重要,它能够让编程者对如何开发一个软件有个整体的认知。开发一个软件的主要流程包括:1)软件前端界面设计;2)后台功能实现;3)前端和后台联合测试;4)

    2024年02月16日
    浏览(19)
  • opencv图像识别主要流程

    为了使图像识别的流程更加直观,我们提前设置一个函数用于图像识别过程中每一步的图像展示。 使用这个函数可以使得在图像识别过程中的每一步更加直观的展示出来,也可以用于检测每一步是否正确运行。 我们进行图像识别的原理是将0-9十个数字的模板进行提取,然后

    2024年02月07日
    浏览(14)
  • 芯片FT测试主要流程

    背景 :最近刚了解mps公司的mp系列某芯片的测试流程,在此做个简单记录。 1.HW check 芯片太小,一般是把芯片放在socket上,连接测试板,再连接测试机,进行芯片功能的测试。 我们首先需要保证这些硬件是好的,这一步便是确定硬件上元器件、各通路的好坏。 2.INIT 初始化,常

    2023年04月16日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包