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

news/2024/12/14 17:30:19/

etcd__EtcdServerStart__0">深入解析 etcdEtcdServer.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 启动多个协程任务

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

以下是每个 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.ppmy.cn/news/1555076.html

相关文章

【收藏】Cesium 限制相机倾斜角(pitch)滑动范围

1.效果 2.思路 在项目开发的时候,有一个需求是限制相机倾斜角,也就是鼠标中键调整视图俯角时,不能过大,一般 pitch 角度范围在 0 至 -90之间,-90刚好为正俯视。 在网上查阅了很多资料,发现并没有一个合适的…

蓝桥杯刷题——day3

蓝桥杯刷题——day3 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 每张票据有唯一的 ID 号,全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造…

开源分布式系统追踪-03-CNCF jaeger-01-入门介绍

分布式跟踪系列 CAT cat monitor 分布式监控 CAT-是什么? cat monitor-02-分布式监控 CAT埋点 cat monitor-03-深度剖析开源分布式监控CAT cat monitor-04-cat 服务端部署实战 cat monitor-05-cat 客户端集成实战 cat monitor-06-cat 消息存储 skywalking …

MongoDB-ObjectID 生成器

前言 MongoDB中一个非常关键的概念就是 ObjectID,它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能,还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID? 在 MongoDB …

第四章 奠基20 团队述职

最近三周的周会,都只讲了一件事:述职 上周大家完成了绩效自评,公司级的总结完成了,团队内部我另外安排了述职活动。 述职对组织和个人成长非常关键: 闭环思维,半年/年度述职是对之前工作的总结&#xff0…

题目 2778: 判断数正负

题目 2778: 判断数正负 时间限制: 2s 内存限制: 192MB 提交: 12161 解决: 6681 题目描述 给定一个整数N&#xff0c;判断其正负。 输入格式 一个整数N(-109 < N < 109) 输出格式 如果N > 0, 输出positive&#xff1b; 如果N 0, 输出zero&#xff1b; 如果N < 0, 输…

CV(4)--边缘提取和相机模型

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 边缘提取&#xff08;涉及语义分割&#xff09;&#xff1a; 图象的边缘是指图象局部区域亮度变化显著的部分,也有正负之分&#xff0c;暗到亮为正 求边缘的幅度&#xff1a;sobel&#xff0c;Canny算子 图像分高频分量和低…

自然语言处理基础及应用场景

自然语言处理定义 让计算机理解人所说的文本 语音 Imitation Game 图灵测试 行为主义 鸭子理论 自然语言处理的基本任务 词性标注&#xff1a;区分每个词名词、动词、形容词等词性命名实体的识别&#xff1a;名词的具体指代是哪一类事物共指消解&#xff1a;代词指代的是前面…