首页 > 编程语言 >ETCD源码阅读(一)

ETCD源码阅读(一)

时间:2023-03-31 19:12:28浏览次数:37  
标签:阅读 模块 server 源码 etcd raft 日志 ETCD 客户端

DAY0: ETCD 架构

下图中展示了 etcd 如何处理一个客户端请求涉及到的模块和流程。图中淡紫色的矩阵表示 etcd ,它包括如下几个模块:
Alt text

  • etcd server:
    对外接受客户端的请求,请求 etcd 代码中的 etcd server 目录,其中还有一个 raft.go 的模块与 etcd raft 库进行通信。etcd server 中与存储相关的模块是 applierV3,这里封装了 V3 版本的数据存储, WAL(write ahead log),用于写数据日志,etcd 启动时会根据这部分内容进行恢复

  • etcd raft:
    etcd 的 raft 库,前面的文章已经具体分析过这部分代码。除了与本节点的 etcd server 通信之外,还与集群中的其他 etcd server 进行交互一致性数据同步的工作(集群中其他etcd服务用橙色的椭圆表示)。

一个请求与一个 etcd 集群的交互主要流程分为两大部分:

写数据到某个 etcd server 中。
该 etcd server 与集群中的其他 etcd 节点进行交互, 当确保数据已经被存储之后应答客户端。

请求流程划分为了以下几个子步骤:

  1. etcd server 收到客户端请求。
  2. etcd server 将请求发送给本模块的 raft.go,这里负责与 etcd raft 模块进行通信。
  3. raft.go 将数据封装成 raft 日志的形式提交给 raft 模块。
  4. raft 模块会首先保存到 raftLog 的 unstable 存储部分。
  5. raft 模块通过 raft 协议与集群中其他 etcd 节点进行交互。

应答步骤如下:

  1. 集群中其他节点向 leader 节点应答接收这条数据库。
  2. 当 leader 节点收到超过半数以上应答接收这条日志数据的节点时,etcd raft 通过 Ready 结构体通知 etcd server 中的 raft 该日志数据已经 commit。
  3. raft.go 收到 Ready 数据时,首先将这条日志写到 WAL 模块中。
  4. 通知最上层的 etcd server 该日志已经 commit。
  5. etcd server 调用 applierV3 模块将日志写入持久化存储中。
  6. etcd server 应答客户端该数据写入成功。
  7. 最后 etcd server 调用 etcd raft,修改其 raftLog 模块的数据,将这条日志写入 raftLog storage 中。

从上面的流程可以看到:

etcd raft 模块在应答某条日志数据已经 commit 之后,是首先写入到 WAL 模块中的,因为这个模块只是添加一条日志,所以速度很快。即使在后面 applierV3 写入失败,重启的时候也可以根据 WAL 模块中的日志数据进行恢复。
etcd raft 中的 raftLog,按照前面文章的分析,其中的数据是保存到内存的,重启即失效,上层应用真实的数据是持久化保存到 WAL 和 applierV3 中的。

主要模块分析

Alt text

  1. 用于与客户端交互和底层 raft 模块通信的 etcd-server
  2. 用于与集群中其他 etcd 节点通信的 etcd-raft
    • 选主
    • 用于存储日志的 etcd-WAL
  3. 用于与客户端交互的 etcd-client
  4. 用于持久化用户数据的 etcd-storage
  5. 用于模块通信之间的网络协议
  6. 复制状态机
  7. 持久存储K-V数据库

标签:阅读,模块,server,源码,etcd,raft,日志,ETCD,客户端
From: https://www.cnblogs.com/chnjm/p/17277230.html

相关文章

  • vue+leaflet示例:克里金插值渲染显示(附源码下载)
    demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。运行工具:vscode或者其他工具。配置方式:下载demo源码,vscode打开,然后顺序执行以下命令:(1)下载demo环境依赖包命令:npmi(2)启动demo命令:npmrundev(3)打包demo命令:npmrunbuild:release示例效果......
  • 直播网站源码,Android中点击图片放大的简单方法
    直播网站源码,Android中点击图片放大的简单方法简单的思路就是把要放大的图片显示在一个对话框中显示出来 Java代码: publicvoidonThumbnailClick(Viewv){//finalAlertDialogdialog=newAlertDialog.Builder(this).create();//ImageViewimgView=getView();//di......
  • ChatGPT 微信接入 C#完整源码
    1.无需搭建服务器,操作极其简单。  2.winform运行程序扫码进行微信登录,勾上自动回复,就可以充当机器人调用chatGPT可实现自动回复,可以申请小号操作。  3.可以识别会话消息和群聊消息,拉入群聊@机器人可以进行群聊的消息回复,可以得到@自己的回复消息。4.代码是完整的也......
  • C#上位机开发源码 上位机项目源代码 采用基于RS485通讯总线的ModbusRtu协议
    C#上位机开发源码上位机项目源代码采用基于RS485通讯总线的ModbusRtu协议,支持用户权限管理、sqlite数据库、实时曲线、历史曲线、历史报表、导出Excel、主界面布局可调带记忆等功能YID:81150611746679046......
  • 构建之法阅读笔记2
    首先,软件会产生的原因是什么?没错,就是人们为了解决生活中遇到的问题。那么我们作为软件的开发者,就要最大程度上去把握用户们的需求,进而制作出用户们满意的产品。那么我们如何去把握用户们的需求呢,接下来我们一一道来。1、获取与引导需求,就是我们要找到软件产品的相关者,获取他......
  • 构建之法阅读笔记3
    创新是新时代所提倡的,但是有一些观点也随之而来(迷思):1、顿悟的传说,比如:牛顿被苹果砸中,发明了万有引力。我们都在想着什么时候灵光一闪,就能够改变世界,那是不切实际的,只有持续创新才能有成果。2、大家都喜欢创新。3、好的想法会赢,但是在现实中却是,好的想法不一定会赢......
  • 《程序员修炼之道:从小工到专家》阅读笔记七
    二十三、断言式编程在自责中有一种满足感,当我们责备自己时,会觉得再没人有权责备我们。--王尔德不要有“这绝不会发生...”的自我欺骗。如果它不可能发生,用断言确保它不会发生。对于算法操作,有时断言也是有用的检查。二十四、何时使用异常将异常用于异常问题异常表示即时的、......
  • 构建之法阅读笔记2
    第四部分是陈述,它是程序主体的基本组成单元,它高于变量。这部分主要描述语句的组织结构,如线性类型、循环控制、条件控制表驱动和其他常见方法,如条件循环,在大多数情况下并不常见。我应该对程序逻辑有高度的概括和灵活性。这仅在编写编译器课程实践代码时使用第五部分是代码改进。......
  • 3月阅读笔记-构建之法2
    第二章和第三章主要讲了个人技术和流程分为单元测试,效能分析工具,个人开发流程和实践。明白了好的单元测试应该用最基础的东西来验证,测试过后不应该改变机器状态,测试要快讲究效率,简洁但要保证其正确率更应该覆盖所有代码路径,而且单元测试也应该不断维护和更新,效能分析中一些名词解......
  • 人月神话阅读笔记(二)
    《人月神话》是一本软件工程领域的经典著作,作者是著名的计算机科学家弗雷德里克·布鲁克斯。这本书主要讲述了软件开发过程中的一些问题和解决方法,以及如何管理一个软件项目。以下是我对这本书的一些阅读笔记。首先,布鲁克斯在书中提到了一个非常重要的概念,即“人月”。他指出,软......