当前位置: 首页 > news >正文

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

深入解析 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 高性能、高一致性和高可用性的核心理念,同时为扩展和调试提供了灵活性。

相关文章:

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

深入解析 etcd 的 EtcdServer.Start 函数 在 etcd 的代码中,EtcdServer.Start 是一个关键方法,用于初始化并启动服务器以便处理请求。本文将从源码的角度逐步分析此函数的每一步操作。 函数签名及注释 // Start performs any initialization of the Se…...

嵌入式驱动开发详解16(音频驱动开发)

文章目录 前言WM8960简介I2S协议接口说明 SAI音频接口简介驱动框架简介设备树配置内核使能声卡设置与测试 后续参考文献 前言 该专栏主要是讲解嵌入式相关的驱动开发,但是由于ALSA驱动框架过于复杂,实现音频编解码芯片的驱动不是一个人能完成的&#xf…...

【数据结构——查找】二分查找(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现二分查找的算法。 相关知识 为了完成本关任务,你需要掌握:1.根据键盘输入的一组有序数据建立顺序表,2.顺序表的输…...

探索云原生数据库 PolarDB

引言 在云计算时代,数据库的重要性不言而喻。随着企业数字化转型的加速,对数据库的性能、可靠性和灵活性的要求也越来越高。阿里云推出的云原生数据库 PolarDB,正是为了满足这些需求而设计的一款高性能、兼容性强、弹性灵活的关系型数据库产品。本文将详细介绍 PolarDB 的特…...

OGG FOR MYSQL同步DDL

以下实验测试OGG FOR mysql 同步DDL, OGG 21.3 MYSQL 8.0.27 --创建测试数据 create table oggddl_20241201 (oid int primary key ,oname varchar(10)); create table oggddl_20241202 (oid int primary key ,oname varchar(10)); create table oggddl_20241203…...

【CAN】asc报文格式文件合并(python版)

目录 一、简介二、合并asc格式报文1、准备多个asc文件2、根据时间合并asc文件3、结果 三、总结四、参考 一、简介 CAN通信:CAN(Controller Area Network)是一种多主方式的串行通讯总线。基本设计规范要求有高位速率、高抗电磁干扰性&#xf…...

C++之STL的map容器

map map的实现方式 set是一个有序的关联容器&#xff0c;是基于平衡二叉搜索树(红黑树)实现的&#xff0c;元素是有序的 map的用法 #include <iostream> #include <map> using namespace std;const int ADDSIZE 20; int main() {map<int, int> m;cout &…...

基于卷积神经网络的图像二分类检测模型训练与推理实现教程 | 幽络源

前言 对于本教程&#xff0c;说白了&#xff0c;就是期望能通过一个程序判断一张图片是否为某个物体&#xff0c;或者说判断一张图片是否为某个缺陷。因为本教程是针对二分类问题&#xff0c;因此主要处理 是 与 不是 的问题&#xff0c;比如我的模型是判断一张图片是否为苹果…...

react-dnd 拖拽事件与输入框的文本选中冲突

问题描述 当我们使用拖拽库的时候&#xff0c;往往会遇到拖拽的一个元素他的子孙元素有输入框类型的dom节点&#xff0c;当拖拽的事件绑定在该元素身上时候&#xff0c;发现子孙的输入框不能进行文本选中了&#xff0c;会按住鼠标去选中文本的时候会触发拖拽 实际的效果&…...

‘Close Project‘ is not available while IDEA is updating indexes的解决

XXX is not available while IDEA is updating indexes IDEA 1.Remove from Recent Projects 2.重新 Open工程即可...

如何解决samba服务器共享文件夹不能粘贴文件

sudo vim /etc/samba/smb.conf在samba的配置文件中增加一个选项 writable yes重启Samba服务以使更改生效&#xff1a; sudo service smbd restart...

Three.js入门-材质详解,构建视觉真实感的核心

Three.js 材质详解&#xff1a;构建视觉真实感的核心 Three.js 是一个强大的 3D JavaScript 库&#xff0c;它为开发者提供了丰富的工具来创建和渲染逼真的三维场景。在这些工具中&#xff0c;材质是一个非常重要的组成部分。材质定义了物体表面的外观特性&#xff0c;例如颜色…...

GitHub、Google等镜像加速地址收集

GitHub、Google等镜像加速地址收集 摘要 本文用于收集GitHub、Google等镜像/加速地址。 GitHub GitHub加速地址一览 fastgithub Https://www.fastgithub.com/&#xff08;推荐&#xff09; 站源地址缓存github.comwww.fastgithub.com无raw.githubusercontent.com无github.gi…...

五、网络层:控制平面,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》

目录 一、导论 二、路由选择算法 2.1 路由&#xff08;route&#xff09;的概念 2.2 网络的图抽象 2.2.1 边和路由的代价 2.2.2 最优化原则 2.3 路由的原则 2.4 路由选择算法的分类 2.5 link state 算法 2.5.1 LS路由工作过程 2.5.2 链路状态路由选择&#xff08;lin…...

Fix the “The repository no longer has a Release file” error on Ubuntu 23.04

背景信息 在Ubuntu 23.04操作系统上执行apt-get update命令更新操作系统时&#xff0c;得到以下错误 登录后复制 # apt-get update Ign:1 http://mirrors.aliyun.com/ubuntu lunar InRelease Ign:2 http://mirrors.aliyun.com/ubuntu lunar-updates InRelease Ign:3 http://mir…...

开源 AI 智能名片 S2B2C 商城小程序对私域流量运营的全方位助力

在当今竞争激烈的商业环境中&#xff0c;私域流量运营已成为企业实现可持续发展和提升竞争力的关键策略之一。开源 AI 智能名片 S2B2C 商城小程序凭借其独特的功能与特性&#xff0c;从多个维度为私域流量运营提供了强有力的支持与推动&#xff0c;以下将详细阐述其在各个方面的…...

Java Exception解决方法

Java中的Exception是所有异常的基类&#xff0c;它指的是程序在执行过程中发生的非严重错误&#xff0c;比如空指针异常、数组越界异常等。 为了解决Java中的Exception&#xff0c;从以下步骤进行排查解决&#xff1a; 阅读错误信息&#xff1a;查看异常的完整堆栈跟踪信息&a…...

HCIA-Access V2.5_2_2_2网络通信基础_IP编址与路由

网络层数据封装 首先IP地址封装在网络层&#xff0c;它用于标识一台网络设备&#xff0c;其中IP地址分为两个部分&#xff0c;网络地址和主机地址&#xff0c;通过我们采用点分十进制的形式进行表示。 IP地址分类 对IP地址而言&#xff0c;它细分为五类&#xff0c;A,B,C,D,E,…...

JeecgBoot passwordChange 任意用户密码重置漏洞复现

0x01 产品简介 Jeecg Boot是一个企业级低代码开发平台,基于前后端分离的架构,融合了SpringBoot、SpringCloud、Ant Design、Vue、Mybatis-plus、Shiro、JWT等多种主流技术,旨在帮助企业快速构建各种应用系统,提高开发效率,降低开发成本。采用最新主流的前后分离框架,使得…...

7-8 整型关键字的散列映射

给定一系列整型关键字和素数 p&#xff0c;用除留余数法定义的散列函数 H(key)key%p 将关键字映射到长度为 p 的散列表中。用线性探测法解决冲突。 输入格式: 输入第一行首先给出两个正整数 n&#xff08;≤1000&#xff09;和 p&#xff08;≥n 的最小素数&#xff09;&…...

谷粒商城—分布式高级①.md

1. ELASTICSEARCH 1、安装elastic search dokcer中安装elastic search (1)下载ealastic search和kibana docker pull elasticsearch:7.6.2 docker pull kibana:7.6.2(2)配置 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "h…...

MySQL SQL语句性能优化

MySQL SQL语句性能优化指南 一、查询设计优化1. 避免 SELECT *2. 使用 WHERE 进行条件过滤3. 避免在索引列上使用函数和表达式4. 使用 LIMIT 限制返回行数5. 避免使用子查询6. 优化 JOIN 操作7. 避免全表扫描 二、索引优化1. 使用合适的索引2. 覆盖索引3. 索引选择性4. 多列索引…...

【潜意识Java】期末考试可能考的选择题(附带答案解析)

目录 选择题一&#xff1a;Java 数据类型 选择题二&#xff1a;Java 控制结构 选择题三&#xff1a;面向对象编程 选择题四&#xff1a;Java 集合框架 选择题五&#xff1a;Java 异常处理 选择题六&#xff1a;Java 方法 选择题七&#xff1a;Java 流程控制 选择题八&a…...

修炼之道 --- 其一

序言 大家对面试中的面经八股文是怎样的看法呢&#xff0c;从他的名字 八股文 就可以看出来大家可能并不喜欢他&#xff0c;八股文一般是 死板、浮于表面、不重实际 的特点。但是&#xff0c;我们需要通过辩证的角度来看待一个事情&#xff0c;不能单方面来定性&#xff01;  …...

【前端】HTML

目录 一、HTML结构 1.1 HTML标签1.2 HTML文件基本结构1.3 快速生成框架 二、HTML常见标签 2.1 注释标签 !-- –2.2 标题标签 h1到h62.3 段落标签 p2.4 换行标签 br2.5 格式化标签2.6 图片标签 img2.7 超链接标签 a 三、表格标签 3.1 常用标签3.2 合并单元格 四、列表标签五、表…...

LabVIEW实现GPS通信

目录 1、GPS通信原理 2、硬件环境部署 3、程序架构 4、前面板设计 5、程序框图设计 6、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系…...

【Python 小课堂】第 2 课 Python 基础知识:语句、常量、变量和注释

第 2 课 基础知识&#xff1a;语句、常量/变量和注释 By Yichen Li 2024/12/14 一、内容简介 在本次课中&#xff0c;介绍Python语句、常量/变量以及代码注释的基本概念&#xff0c;一些详细的概念、扩展及用法等细节&#xff0c;留至后续介绍。 二、Python语句 一般来说&…...

基于STM32设计的工地扬尘与噪音实时监测系统(网页)

一、前言 当前项目使用的相关软件工具、传感器源代码工程已经上传到网盘&#xff08;实时更新项目内容&#xff09;&#xff1a;https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?fromfrom_copylink 1.1 项目开发背景 近年来&#xff0c;随着城市化进程的…...

LLM之RAG实战(五十)| FastAPI:构建基于LLM的WEB接口界面

FastAPI是WEB UI接口&#xff0c;随着LLM的蓬勃发展&#xff0c;FastAPI的生态也迎来了新的机遇。本文将围绕FastAPI、OpenAI的API以及FastCRUD&#xff0c;来创建一个个性化的电子邮件写作助手&#xff0c;以展示如何结合这些技术来构建强大的应用程序。 下面我们开始分步骤操…...

JavaScript 中的 Map方法

JavaScript 中的 Map方法 在 JavaScript 中&#xff0c;Map 是一种用于存储键值对的数据结构&#xff0c;相较于传统的对象&#xff08;Object&#xff09;&#xff0c;Map 提供了更高效的键值对操作方式适合处理需要频繁操作键值对的场景。 1. 创建 Map const map new Map…...

img引入svg如何修改颜色

方法1&#xff1a;通过css中filter:drop-shadow 首先需要一个容纳图标的父盒子(下方实例中的.svg-img)&#xff0c;通过css造一个图标的‘影子’&#xff08;.svg-color中的drop-shadow&#xff09;&#xff0c;然后设置‘影子’的颜色&#xff0c;再把图标本体移出父盒子&…...

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

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

构建centos docker基础镜像

1、介绍 比较老的版本docker镜像&#xff0c;不太好找&#xff0c;可以尝试自己构建 各版本构建基础镜像方法不太一样&#xff0c;方式也不同&#xff0c;自己尝试&#xff0c;本文只介绍了我自己的尝试 2、构建centos5.11 docker镜像 准备iso文件 &#xff08;1&#xff09;安…...

etcd命令大全

默认安装自带etcdctl 命令行客户端&#xff0c;分两个版本ETCDCTL_API2和ETCDCTL_API3&#xff0c;两个版本不一样&#xff0c;操作的数据也不相容。 本文以v3 为例。 使用之前需要先设置&#xff1a;export ETCDCTL_API3。 1 etcd查询集群节点列表及状态 标准输出&#xff1…...

Go有限状态机实现和实战

Go有限状态机实现和实战 有限状态机 什么是状态机 有限状态机&#xff08;Finite State Machine, FSM&#xff09;是一种用于建模系统行为的计算模型&#xff0c;它包含有限数量的状态&#xff0c;并通过事件或条件实现状态之间的转换。FSM的状态数量是有限的&#xff0c;因此称…...

使用torch模拟 BMM int8量化计算。

使用torch模型BMM int8计算。 模拟&#xff1a;BMM->softmax->BMM 计算流程 import torch import numpy as np torch.manual_seed(777) def int8_quantize_per_token(x: torch.Tensor, axis: int -1, attnsFalse):if x.dtype ! torch.float32:x x.type(torch.float32)…...

vue3的watch一次性监听多个值用法

vue3的watch一次性监听多个值 1、监听单个值 watch(() > route.params.keyword, (newValue, oldValue) > {console.log(监听值变化, newVal, oldVal)state.a newValue});2、监听多个值 watch(() > [route.params.id, route.params.keyword], (newValue, oldValue) &g…...

【one-api和ollama结合使用】

将Ollama接入one-api one-api是一个开源AI中间件服务&#xff0c;可以聚合各家大模型API&#xff0c;比如OpenAI、ChatGLM、文心一言等&#xff0c;聚合后提供统一的OpenAI调用方法。举个例子&#xff1a;ChatGLM和文心一言的API调用方法并不相同&#xff0c;one-api可以对其进…...

Oracle PDB的开启和关闭

[生产环境关闭与开启Oracle PDB] 【运维场景】 在运维Oracle PDB的时候经常要开启和关闭PDB&#xff0c;对关闭和开启PDB的操作要非常熟悉。 【操作方法】 1. PDB的打开与关闭 关闭和开启DB的时候要看DB的警告日志&#xff0c;日志位置&#xff08;在Oracle用户下查看&…...

十一、动态构建UI元素

装饰器Builder 装饰器BuilderParam <font style"color:rgba(0, 0, 0, 0.9);">BuilderParam</font> 该装饰器用于声明任意UI描述的一个元素&#xff0c;类似slot占位符。 链接 简而言之&#xff1a;就是自定义组件允许外部传递 UI // SonCom 的实现略…...

智能时代的基石:神经网络

智能时代的基石&#xff1a;神经网络 第一节&#xff1a;神经网络简介 课程目标 本节课程旨在全面介绍神经网络的基本概念、结构以及其在历史发展中的重要里程碑。通过深入理解神经网络的工作原理和演变过程&#xff0c;学员将能够掌握神经网络在现实世界中的多种应用&#…...

VScode配置GIT

在Visual Studio Code&#xff08;VSCode&#xff09;中检测不到已安装的Git可以通过以下步骤来解决‌&#xff1a; ‌确认Git是否正确安装‌&#xff1a;首先&#xff0c;确保在计算机上正确安装了Git。可以通过打开命令行窗口并输入git --version来检查是否能够显示Git的版本…...

【CSS】css 如何实现固定宽高比

今天和同事讨论这个问题&#xff0c;一时间还想不到了&#xff0c;于是学习了下&#xff0c;就顺便当个记录吧 要在CSS中实现固定宽高比&#xff0c;有两种主要的方法可以选择。一种是使用新的aspect-ratio属性&#xff0c;另一种是利用padding技巧。随着现代浏览器对aspect-ra…...

使用webrtc-streamer查看实时监控

摄像头配置&#xff08;海康摄像头为例&#xff09; 摄像头视频编码应改成H264格式 webrtc-streamer下载 webrtc-streamer下载地址 下载后解压出来双击运行&#xff0c;端口默认8000 VUE2项目引入文件 在项目静态文件“public”中需引入两个js文件“webrtcstreamer.js”与“…...

ansible部署nginx:1个简单的playbook脚本

文章目录 hosts--ventoryroles执行命令 使用ansible向3台centos7服务器上安装nginx hosts–ventory [rootstand playhook1]# cat /root/HOSTS # /root/HOSTS [webservers] 192.168.196.111 ansible_ssh_passpassword 192.168.196.112 ansible_ssh_passpassword 192.168.196.1…...

Ubuntu安装Gitlab详细图文教程

1、环境准备 1.1、Ubuntu环境 Ubuntu24.04Sever版安装教程 1.2、更新系统 sudo apt update -y sudo apt-get update sudo apt-get upgrade 2、安装Nginx 2.1 安装nginx # 安装 apt install nginx -y 2.2 修改nginx配置⽂件 # 修改nginx配置 vim /etc/nginx/si…...

前端面试准备问题2

1.防抖和节流分别是什么&#xff0c;应用场景 防抖&#xff1a;在事件被触发后&#xff0c;只有在指定的延迟时间内没有再次触发&#xff0c;才执行事件处理函数。 在我的理解中&#xff0c;简单的说就是在一个指定的时间内&#xff0c;仅触发一次&#xff0c;如果有多次重复触…...

uni-app之web-view组件 postMessage 通信【跨端开发系列】

&#x1f517; uniapp 跨端开发系列文章&#xff1a;&#x1f380;&#x1f380;&#x1f380; uni-app 组成和跨端原理 【跨端开发系列】 uni-app 各端差异注意事项 【跨端开发系列】uni-app 离线本地存储方案 【跨端开发系列】uni-app UI库、框架、组件选型指南 【跨端开…...

IntelliJ IDEA 使用技巧与插件推荐

目录 常用使用技巧 1. 使用快捷键提升开发效率 2. 多光标编辑 3. 代码自动补全 4. 使用 Find Action 快速执行操作 5. 集成版本控制系统&#xff08;VCS&#xff09; 6. 快速查看代码文档 推荐插件 1. Lombok Plugin 2. Rainbow Brackets 3. Key Promoter X 4. Chec…...

zookeeper基础命令详解

zookeeper基础命令详解目录 文章目录 zookeeper基础命令详解目录一、列出所有基础命令 一、列出所有基础命令 先启动一个zookeeper客户端连接zookeeper&#xff0c;如果还没有启动zookeeper集群的参考本文启动之后再做后续操作。 https://blog.csdn.net/weixin_42924400/artic…...