【ETCD】【源码阅读】深入解析 etcd 的 `EtcdServer.Start` 函数

news2024/12/12 23:43:19

深入解析 etcd 的 EtcdServer.Start 函数

在 etcd 的代码中,EtcdServer.Start 是一个关键方法,用于初始化并启动服务器以便处理请求。本文将从源码的角度逐步分析此函数的每一步操作。


函数签名及注释

// Start performs any initialization of the Server necessary for it to
// begin serving requests. It must be called before Do or Process.
// Start must be non-blocking; any long-running server functionality
// should be implemented in goroutines.
func (s *EtcdServer) Start() {
    ...
}

核心含义

  • 功能:完成服务器初始化,使其准备好接收并处理请求。
  • 非阻塞:方法本身不得阻塞,任何耗时的功能都需要放到 goroutine 中。
  • 调用要求:必须在调用 DoProcess 方法之前执行。

源码解析

1. 调用 s.start() 初始化服务器

s.start()
  • 功能
    • s.start() 是对服务器内部状态的核心初始化。主要工作包括:
      1. 设置快照配置。
      2. 初始化等待队列、通知器和上下文控制。
      3. 启动服务器主循环(s.run())。
  • 运行模式
    • s.start() 本身不是并发的,它完成初始化后会启动主循环,主循环在单独的 goroutine 中运行。
  • 详细分析:详见【ETCD】【源码阅读】 深入解析 EtcdServer.start 函数。

2. 使用 GoAttach 启动多个协程任务

GoAttach 是 etcd 提供的辅助方法,用于安全地启动协程,同时与服务器的生命周期关联。这确保了当服务器关闭时,这些协程也能被优雅停止。

以下是每个 GoAttach 调用的分析:

2.1 调整心跳(adjustTicks
s.GoAttach(func() { s.adjustTicks() })
  • 作用
    • 定期调整服务器的逻辑时钟,以确保心跳机制的准确性。
  • 必要性
    • etcd 的 Raft 协议依赖心跳机制来维持领导者和从节点之间的通信。如果心跳不准确,可能会导致选举超时或误选举。

2.2 发布服务信息(publishV3
s.GoAttach(func() { s.publishV3(s.Cfg.ReqTimeout()) })
  • 作用
    • 将节点的服务信息通过 etcd v3 协议发布到集群中,以便其他节点能够发现并与之通信。
  • 参数
    • s.Cfg.ReqTimeout():指定超时时间,确保在合理时间内完成操作。

2.3 文件清理(purgeFile
s.GoAttach(s.purgeFile)
  • 作用
    • 定期清理旧的快照和 WAL 文件,以释放存储空间。
  • 重要性
    • 如果未及时清理,日志和快照文件可能占用大量磁盘空间,影响性能甚至导致服务中断。

2.4 文件描述符监控
s.GoAttach(func() { monitorFileDescriptor(s.Logger(), s.stopping) })
  • 作用
    • 监控系统中的文件描述符使用情况,防止文件描述符耗尽。
  • 目的
    • etcd 在运行过程中会频繁打开文件和网络连接,此功能用于捕获异常情况并发出警告。

2.5 集群版本监控(monitorClusterVersions
s.GoAttach(s.monitorClusterVersions)
  • 作用
    • 检查集群中所有节点的版本是否一致。如果版本不匹配,可能会引发兼容性问题。
  • 背景
    • etcd 的集群升级需要协调所有节点版本的更新。

2.6 存储版本监控(monitorStorageVersion
s.GoAttach(s.monitorStorageVersion)
  • 作用
    • 监控存储引擎(如 BoltDB)的版本,并确保其与当前 etcd 版本兼容。
  • 重要性
    • 防止因存储格式变更导致的读写错误。

2.7 线性化读取循环(linearizableReadLoop
s.GoAttach(s.linearizableReadLoop)
  • 作用
    • 处理线性化读请求,确保客户端看到的结果是一致的。
  • 背景
    • etcd 使用线性化一致性(Linearizable Consistency)作为其强一致性模型的核心。

2.8 数据校验监控
s.GoAttach(s.monitorKVHash)
s.GoAttach(s.monitorCompactHash)
  • 作用
    • 定期校验数据一致性(monitorKVHash)。
    • 监控压缩后的哈希值以验证历史数据(monitorCompactHash)。
  • 背景
    • 数据校验可及时发现和修复集群中潜在的数据损坏问题。

2.9 降级模式监控(monitorDowngrade
s.GoAttach(s.monitorDowngrade)
  • 作用
    • 监控是否需要将集群降级到旧版本,以应对兼容性问题。
  • 重要性
    • 在集群的重大问题或特殊需求下,降级模式是一种安全保护机制。

总结

EtcdServer.Start 方法是 etcd 服务启动的核心逻辑,通过逐步初始化和启动多个协程,确保服务器能稳定运行并处理外部请求。以下是关键点总结:

  1. 初始化: 调用 s.start() 完成基本初始化,包括配置、状态和主循环启动。
  2. 并发任务: 使用 GoAttach 启动多个后台任务,覆盖心跳调整、服务发布、数据校验等关键功能。
  3. 非阻塞设计: 确保主线程不会被阻塞,所有长时间运行的功能均通过 goroutine 执行。
  4. 鲁棒性: 通过监控(如文件描述符、集群版本)和自动清理(如日志文件),提供高可用性。

该方法的设计体现了 etcd 高性能、高一致性和高可用性的核心理念,同时为扩展和调试提供了灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2258473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第三部分:进阶概念 9.错误处理 --[JavaScript 新手村:开启编程之旅的第一步]

在JavaScript中,错误处理是确保应用程序稳定性和用户体验的重要部分。JavaScript提供了几种机制来捕获和处理运行时错误(异常)。以下是几种常见的错误处理方式: 1. try...catch 语句 try...catch 语句是JavaScript中处理错误和异…

Java面试之多线程状态(三)

此篇接上一篇Java面试之实现多线程(二) Java线程可以拥有自己的操作数栈、程序计数器、局部变量表等资源,它与同一进程内的其他线程共享该进程的所有资源。Java线程在生命周期内存在多种状态,可以通过Thread.State枚举类获取线程状态。如图所示有NEW(新建…

数据仓库:智控数据中枢

数据仓库 一. 什么是数据仓库?二. 传统数据库与数据仓库的区别?三. 数据仓库详解(一). 数据分析(二). 特点1. 面向主题2. 集成的3. 反应历史变化 四. 如何搭建数据仓库(一). 数据平台…

【全连接神经网络】核心步骤及其缺陷

前向传播 计算公式(其中一种) x1/x2:输入值,一般是神经网络上一层的输出或者输入数据本身,上图中表示两个节点w11 w13:权重,在神经网络中,权重是学习的参数,表示每个输入…

微服务的问题

1.创建maven项目 然后配置对应的maven地址 2.创建父工程 删掉其中的src文件 在父pom中进行版本依赖和管理 如下图所示 3.在子文件中进行添加依赖 然后刷新maven进行下载

CAPL如何设置或修改CANoe TCP/IP协议栈的底层配置

在CANoe中创建网络节点作为以太网主机时,可以给其配置独立的TCP/IP Stack。 配置的协议栈有一些底层配置参数可以在界面上设置或修改,比如: MTU上图中MTU显示500只是图形界面显示错误,正确值是1500。 TCP延迟确认这些参数也可以通过CAPL动态配置,甚至CAPL还可以配置很多界…

计算机视觉与医学的结合:推动医学领域研究的新机遇

目录 引言医学领域面临的发文难题计算机视觉与医学的结合:发展趋势计算机视觉结合医学的研究方向高区位参考文章结语 引言 计算机视觉(Computer Vision, CV)技术作为人工智能的重要分支,已经在多个领域取得了显著的应用成果&…

微搭低代码AI组件单词消消乐从0到1实践

目录 1 为什么要开发单词消消乐2 需要具备什么功能3 采用什么技术方案实现4 逻辑设计4.1 数据结构设计4.2 游戏的核心逻辑4.3 数据设计 5 代码详解5.1 导入依赖5.2 定义函数组件5.3 数据初始化5.4 状态定义5.5 打乱解释的逻辑5.6 定义选择单词的函数5.7 定义选择解释的函数5.8 …

learn-(Uni-app)输入框u-search父子组件与input输入框(防抖与搜索触发)

1.父子组件u-search &#xff08;1&#xff09;父组件 <!-- 父组件 --> <template> <div><searchBar change"change" search"search"></searchBar> </div> </template> <script> // 子组件搜索 import…

SpringBoot【九】mybatis-plus之自定义sql零基础教学!

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE mybatis-plus的基本使用&#xff0c;前两期基本讲的差不多&#xff0c;够日常使用&#xff0c;但是有的小伙伴可能就会抱怨了&#xff0c;若是遇到业务逻辑比较复杂的sq…

electron 打包 webview 嵌入需要调用电脑摄像头拍摄失败问题

electron 打包 webview 嵌入需要调用电脑摄像头拍摄失败问题 这篇文章是接我cocos专栏的上一篇文章继续写的&#xff0c;我上一篇文章写的是 cocos 开发触摸屏项目&#xff0c;需要嵌入一个网页用来展示&#xff0c;最后通过 electron 打包成 exe 程序&#xff0c;而且网页里面…

webrtc学习----前端推流拉流,局域网socket版,一对一

提示&#xff1a;局域网socket版 文章目录 [TOC](文章目录) 前言一、教程二、webrtc工作流程三、推流端四、拉流五、socket服务六、效果七、备注总结 前言 ‌‌‌‌‌WebRTC&#xff08;Web Real-Time Communication&#xff09;‌是一种实时通讯技术&#xff0c;允许网络应用或…

net/http: TLS handshake timeout 问题

最近系统偶现”net/http: TLS handshake timeout“&#xff0c;而且都集中在同一个机房&#xff0c;这个报错还是第一次见&#xff0c;产生的原因和解决的方案都比较有意思。 现场 报错的信息为&#xff1a; Error sending request:%!(EXTRA *url.ErrorGet "https://**…

HTML简单贪吃蛇游戏

1.功能说明&#xff1a; 游戏网格&#xff1a;一个20x20的网格&#xff0c;每个格子的大小为20x20像素。 蛇的移动&#xff1a;玩家可以通过方向键&#xff08;左、上、右、下&#xff09;控制蛇的移动。 食物生成&#xff1a;食物会在随机位置生成&#xff0c;当蛇吃到食物时…

http 502 和 504 的区别

首先看一下概念&#xff1a; 502&#xff1a;作为网关或者代理工作的服务器尝试执行请求时&#xff0c;从上游服务器接收到无效的响应。503&#xff1a;由于临时的服务器维护或者过载&#xff0c;服务器当前无法处理请求。这个状况是临时的&#xff0c;并且将在一段时间以后恢…

基于SpringBoot医疗挂号系统(计算机毕业设计)+万字说明文档

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…

【青牛科技】D4800 AB类 立 体 声 耳 机 音 频 功 率 放 大器电路可应用在便携式数字 音 响 设 备 中 作 功 率 放 大 用

概 述 &#xff1a; D4800 是 一 块 AB类 立 体 声 耳 机 音 频 功 率 放 大器电路。 D4800 在5V电 源 时 输 出 功 率 最 高 可 达 290mW(8 Ω 负载&#xff0c; 失真度 10%)。适合在便携式数字 音 响 设 备 中 作 功 率 放 大 用 。 主要特点&#xff1a; 电源电压&#x…

vue3+vite接入iconify,支持离线

前言 找一个图标太难了。Element-plus Icon的不够用。阿里巴巴的iconfont又比较麻烦。如果有自己的UI组件也可以考虑。 为了快速开发&#xff0c;我选择unocss iconify。 网上的教程太多了&#xff0c;建议大家直接看文档&#xff0c;其实配置步骤只有几步&#xff0c;不多。…

SD Express 卡漏洞导致笔记本电脑和游戏机遭受内存攻击

Positive Technologies 最近发布的一份报告揭示了一个名为 DaMAgeCard 的新漏洞&#xff0c;攻击者可以利用该漏洞利用 SD Express 内存卡直接访问系统内存。 该漏洞利用了 SD Express 中引入的直接内存访问 (DMA) 功能来加速数据传输速度&#xff0c;但也为对支持该标准的设备…

网页核心页面设计(第8章)

一、伪元素 伪元素是 CSS 中的一种选择器&#xff0c;用于选择某些特定的元素或元素的一部分&#xff0c;而这些元素本身并不存在于文档的结构中。伪元素使得网页设计师可以更灵活地控制样式&#xff0c;从而可以为元素的内容、框架或文本提供额外的样式&#xff0c;增强网页的…