【ETCD】【源码阅读】深入解析 EtcdServer.run 函数
EtcdServer.run
是 etcd 的核心运行逻辑之一,负责管理 Raft 状态机的应用、事件调度以及集群的核心操作。本文将逐步从源码层面分析 run
函数的逻辑,帮助读者理解其内部机制和设计思想。
函数签名与关键职责
func (s *EtcdServer) run() {...
}
关键职责
- 读取和应用 Raft 状态机的日志。
- 管理领导者变更及其他关键状态。
- 调度和执行异步任务。
- 清理和关闭资源。
源码解析
1. 初始化阶段
1.1 日志器初始化
lg := s.Logger()
获取当前日志记录器,便于后续操作记录和调试。
1.2 获取 Raft 快照
sn, err := s.r.raftStorage.Snapshot()
if err != nil {lg.Panic("failed to get snapshot from Raft storage", zap.Error(err))
}
- 目的:通过
raftStorage.Snapshot
获取当前快照的元数据,包括配置状态和日志索引。 - 重要性:快照提供了集群的一致性视图,是状态恢复的关键。
- 详见:【ETCD】【源码阅读】 深入解析 raftNode.start`函数:Raft 核心启动逻辑剖析
1.3 调度器初始化
sched := schedule.NewFIFOScheduler(lg)
FIFOScheduler
:- 一个先进先出的任务调度器,确保任务按照提交顺序执行。
- 提升并发性能,防止任务阻塞。
1.4 初始化 Raft 准备处理程序
rh := &raftReadyHandler{...
}
s.r.start(rh)
raftReadyHandler
:定义 Raft 状态处理逻辑,包含以下功能:- 领导者管理:通过
updateLeadership
处理领导者状态变更(如暂停或恢复 compactor)。 - 提交索引更新:动态更新已提交的日志索引。
- 领导者管理:通过
- 启动 Raft:调用
s.r.start
,绑定处理程序,开启 Raft 逻辑。
1.5 初始化 etcdProgress
ep := etcdProgress{confState: sn.Metadata.ConfState,diskSnapshotIndex: sn.Metadata.Index,memorySnapshotIndex: sn.Metadata.Index,appliedt: sn.Metadata.Term,appliedi: sn.Metadata.Index,
}
etcdProgress
:记录服务器的快照应用进度,包括:- 配置状态:
ConfState
表示当前集群成员的配置信息。 - 快照索引:分为磁盘和内存中的快照索引。
- 应用状态:记录快照的日志条目和任期。
- 配置状态:
2. 资源清理阶段(defer 块)
defer func() {...
}()
- 关键功能:
- 停止调度器、Raft 逻辑和周期性任务(如
SyncTicker
)。 - 等待所有 goroutine 完成,防止资源泄漏。
- 释放上下文和信号通道。
- 停止调度器、Raft 逻辑和周期性任务(如
3. 主循环逻辑
run
函数的核心部分是主循环,用于监听事件和执行相应操作:
for {select {case ap := <-s.r.apply():...case leases := <-expiredLeaseC:...case err := <-s.errorc:...case <-s.stop:...}
}
3.1 应用日志
case ap := <-s.r.apply():f := schedule.NewJob("server_applyAll", func(context.Context) { s.applyAll(&ep, &ap) })sched.Schedule(f)
- 作用:当 Raft 提交日志时,触发
applyAll
将日志应用到状态机。 - 调度:通过
sched.Schedule
将任务交由调度器管理。
3.2 处理过期租约
case leases := <-expiredLeaseC:s.revokeExpiredLeases(leases)
- 背景:etcd 使用租约机制管理资源锁。
- 功能:移除过期租约,释放对应资源。
3.3 错误处理
case err := <-s.errorc:lg.Warn("server error", zap.Error(err))lg.Warn("data-dir used by this member must be removed")return
- 作用:
- 记录发生的错误。
- 提示用户移除当前成员的数据目录,确保一致性。
3.4 停止信号
case <-s.stop:return
- 功能:当收到停止信号时,退出主循环并进行清理。
总结
运行逻辑概述
run
函数整体可以分为三个阶段:
- 初始化阶段:准备运行所需的快照、调度器和 Raft 处理器。
- 主循环阶段:监听并处理日志应用、租约管理和错误。
- 清理阶段:释放资源,确保服务器安全退出。
设计亮点
- 高效调度:通过
FIFOScheduler
和异步任务管理,提升并发性能。 - 模块化设计:不同任务(日志、租约等)分离处理,职责清晰。
- 容错机制:详细的错误记录和退出逻辑,增强了系统稳定性。
EtcdServer.run
是 etcd 实现高可用、高性能的核心,理解其设计对掌握分布式系统的运行机制具有重要意义。
相关文章:
【ETCD】【源码阅读】深入解析 EtcdServer.run 函数
EtcdServer.run 是 etcd 的核心运行逻辑之一,负责管理 Raft 状态机的应用、事件调度以及集群的核心操作。本文将逐步从源码层面分析 run 函数的逻辑,帮助读者理解其内部机制和设计思想。 函数签名与关键职责 func (s *EtcdServer) run() {... }关键职责…...
springboot/ssm校内订餐系统Java代码web项目美食外卖点餐配送源码
springboot/ssm校内订餐系统Java代码web项目美食外卖点餐配送源码 基于springboot(可改ssm)vue项目 开发语言:Java 框架:springboot/可改ssm vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库ÿ…...
floodfill算法
目录 什么是floodfill算法 题目一——733. 图像渲染 - 力扣(LeetCode) 题目二——200. 岛屿数量 - 力扣(LeetCode) 题目三——695. 岛屿的最大面积 - 力扣(LeetCode) 题目四—— 130. 被围绕的区域 …...
【JAVA】六亮增加贴
James Gosling(詹姆斯.高斯林) Java 语言源于 1991 年 4 月,Sun 公司 James Gosling博士 领导的绿色计划(Green Project) 开始启动,此计划最初的目标是开发一种能够在各种消费性电子产品(如机顶盒、冰箱、收音机等)上运行的程序…...
git提交时出现merge branch main of xxx
git提交时出现merge branch main of xxx 原因: 1、同事commit了一个修改A,push到remote 2、我把这个修改直接pull了下来(pull是fetchmerge的操作,自动合并到本地workspace) 3、同事因为后续的commit有冲突,…...
lstm 输入数据的形状是怎么样的,他有两种输入方式,通过参数 batch_first来设置 默认是False
lstm 输入数据的形状是怎么样的,他有两种输入方式,通过参数 batch_first来设置 默认是False 当batch_firstFalse时,LSTM输入的数据形状通常是一个三维张量,其维度顺序为[sequence_length, batch_size, input_size]。下面是对这些维…...
Apache Doris 数据类型
Apache Doris 已支持的数据类型列表如下: 数值类型 类型名存储空间(字节)描述BOOLEAN1布尔值,0 代表 false,1 代表 true。TINYINT1有符号整数,范围 [-128, 127]。SMALLINT2有符号整数,范围 …...
编译问题 fatal error: rpc/rpc.h: No such file or directory
在编译一些第三方软件的时候,会经常遇到一些文件识别不到的问题,这里整理下做个归总。 目前可能的原因有(排序分先后): 文件不存在;文件存在但路径识别不了;…… 这次以常见的编译lmbench测试…...
linux 安装composer
下载composer curl -sS https://getcomposer.org/installer | php下载后设置环境变量,直接通过命令composer -v mv composer.phar /usr/local/bin/composer查看版本看是否安装成功 composer -v...
数据库公共字段自动填充的三种实现方案
背景介绍 在实际项目开发中,我们经常需要处理一些公共字段的自动填充,比如: createTime (创建时间)updateTime (更新时间)createUser (创建人)updateUser (更新人) 这些字段在每个表中都存在,如果每次都手动设置会很麻烦。下面介绍三种常用的解决方案。 方案一:M…...
《MySQL 入门:数据库世界的第一扇门》
一、MySQL 简介 MySQL 是一种开源的关系型数据库管理系统,在数据库领域占据着重要地位。它以其高效查询、高安全性、低成本和扩展性著称,广泛应用于网站、企业级应用、数据分析等领域。 MySQL 具有诸多优点。首先,它成本低,作为…...
Qt之第三方库QCustomPlot使用(二)
Qt开发 系列文章 - qcustomplot(二) 目录 前言 一、Qt开源库 二、QCustomPlot 1.qcustomplot介绍 2.qcustomplot下载 3.qcustomplot移植 4.修改项目文件.pro 5.提升QWidget类 三、技巧讲解 1.拖动缩放功能 2.等待更新 总结 前言 Qt第三方…...
JAVA-类与继承
啥是继承? 在JAVA中, 继承就是子类继承父类的特征和行为,使得子类拥有父类的特征和行为,同时还可以拥有父类所没有的特征和行为。 举个例子通俗来讲,兔子和羊是食草动物类,狮子和豹子是食肉动物类&#x…...
SSH连接报错,Corrupted MAC on input 解决方法
问题描述 客户在windows CMD中SSH连接失败,报错: Corrupted MAC on input ssh_dispatch_run_fatal: Connection to x.x.x.x port 22: message authentication code incorrect值得注意的是,客户通过别的机器做SSH连接可以成功,使用putty, mo…...
【C++】8___继承
目录 一、基本语法 二、继承方式 三、对象模型 四、继承中的构造与析构的顺序 五、继承中同名成员处理 六、多继承语法 七、菱形继承 一、基本语法 好处:减少重复的代码 语法: class 子类 : 继承方式 父类 子类 也称为 派生类 父类…...
C# 中的异常处理:构建健壮和可靠的程序
C#中的异常处理(Exception Handling)。异常处理是编程中非常重要的一部分,它允许开发者优雅地处理程序运行时可能出现的错误或意外情况。通过有效的异常处理,可以使应用程序更加健壮、可靠,并提供更好的用户体验。以下…...
基于智能合约的医院凭证共享中心路径探析
一、引言 随着医疗行业的不断发展和信息技术的进步,基于智能合约的医疗凭证共享中心解决方案成为了可能。在当今数字化时代,医疗领域面临着诸多挑战,如医疗数据的分散存储、信息共享的不便捷以及凭证管理的复杂性等问题。而智能合约的出现&am…...
vba学习系列(9)--按需求计数单元格数量
系列文章目录 文章目录 系列文章目录前言一、按需求计数单元格数量1.需求 二、使用步骤1.vba源码2.整理后 总结 前言 一、按需求计数单元格数量 1.需求 一个表中有多个类型的单元格内容,比如:文字、数字、特殊字符、字母数字…… 我们要计数字母数字的…...
scale index的计算
scale index定义 基本实现 需要注意,scale index的提出者分别构建了MATLAB和R语言的实现方式。 但是,需要注意,经过我向作者求证。 MATLAB编写的代码已经“过时了”,为了拥抱时代,作者构建了R语言包,名称为…...
鸿蒙实现Web组件开发
目录: 1、简介&使用场景2、加载网络页面3、加载本地页面4、加载HTML格式的文本数据5、设置深色模式6、上传文件7、在新窗口中打开页面8、管理位置权限 1、简介&使用场景 Web是一种基于互联网的技术和资源的网络服务系统。它是指由许多互连的计算机组成的全…...
Linux——linux系统移植
创建VSCode工程 1、将NXP官方的linux内核拷贝到Ubuntu 2、解压缩tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 NXP官方开发板Linux内核编译 1、将.vscode文件夹复制到NXP官网linux工程中,屏蔽一些不需要的文件 2、编译NXP官方EVK开发板对应的Linux系统…...
工业摄像头应对复杂环境的策略与解决方案
工业摄像头需应对复杂环境,如极端温度、振动、尘土、光照不足等。为确保稳定工作,它采用了先进技术和设计。详细分析如下: 一、增强环境适应性 采用高灵敏度传感器:使用CMOS或CCD图像传感器,适应低光照条件。 高精度、…...
重生之我在异世界学编程之C语言:深入动态内存管理篇
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一 动态内存管理的必要性二 动态…...
【经典论文阅读】Latent Diffusion Models(LDM)
Latent Diffusion Models High-Resolution Image Synthesis with Latent Diffusion Models 摘要 动机:在有限的计算资源下进行扩散模型训练,同时保持质量和灵活性 引入跨注意力层,以卷积方式实现对一般条件输入(如文本或边界框…...
智能指针中的weak_ptr(弱引用智能指针)
弱引用智能指针 std::weak_ptr 可以看做是shared_ptr的助手,它不管理 shared_ptr 内部的指针。std::weak_ptr 没有重载操作符*和->,因为它不共享指针, 不能操作资源,所以它的构造不会增加引用计数,析构也不会减少引用计数,它的…...
【电子通识】机电继电器和固态继电器的区别
机电继电器 机电继电器于19世纪中叶发明。这些器件将线圈与可移动的金属触点结合使用来充当电动开关。这些器件会因为金属触点出现磨损而发生故障,例如焊死在一起。因此,在完全失效之前器件能够进行的开关周期数有限,从而限制了其总体可靠性。 一般情况下继电器控制…...
工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet
论文:https://arxiv.org/pdf/2311.14897v3.pdf 项目:https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位,这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…...
如何创建对话窗口
文章目录 1. 概念介绍2. 使用方法3. 示例代码我们在上一章回中介绍了Dismissible Widget相关的内容,本章回中将介绍AlertDialog Widget.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们介绍的AlertDialog是指程序中弹出的确认窗口,其实我们在上一章回中删除ListView中…...
新手上路,学Go还是Python
对于新手来说,Go和Python都是很好的编程语言,它们各有特点,以下是详细的对比来帮助你决定先学哪一个: 一、语法和学习难度 Python 语法简洁易懂:Python以其简洁、优雅的语法而闻名,代码的可读性很高。例如…...
<!DOCTYPE html>的作用是什么
一、背景 从今天开始会不定时的发布一些前端的常见面试题,供大家参考。今天要发布的内容是关于html的面试题的作用是什么。接下来就一起讨论以下吧 二、概念 DOCTYPE 是html5中一种标准通用标记语言的文档类型的声明,它的目的就是为了告诉浏览器应该以…...
wordpress怎么上传ppt/网站运营师
提出需求做图像处理时,有时会遇到换色问题,就例如下面图片(网上找的小姐姐图片,侵删)的背景图并不喜欢,我想换成蓝色的要怎么做呢这时候肯定会有小伙伴会想到PS,PS 工具当然是首选,但是如果有大量图片需要更…...
wordpress 如何登录地址/搜索引擎营销
文章来源: http://www.tuicool.com/articles/qyEbya 多谢在网上搜集的资料主要有以下两个方面:第一方面:MySQL5.6.13安装步骤(Windows7 64位)1. 下载MySQL Community Server 5.6.132. 解压MySQL压缩包将以下载的MySQL压缩…...
公司网站建设价格/阿里云域名注册官网
前言 纵观神经网络的发展历程,从最原始的MLP,到CNN,到RNN,到LSTM,GRU,再到现在的Attention机制,人们不断的在网络里面加入一些先验知识,使得网络不过于“发散”,能够朝着人们希望的…...
遵义市网站制作/渠道推广平台
Epic 在昨天公布其最新次世代引擎「虚幻引擎5」,并重点介绍了新引擎的两项新技术 Nanite 和 Lumen。下面给大家简单介绍一下这两个新技术到底厉害在哪里,以及为什么许多游戏开发者们看完之后纷纷拍手叫好。 首先,整段 Demo 采用动态分辨率&…...
关于工装设计的网站/公司怎么建立自己的网站
今天又搞了下jsp servlet 的代码样例,感觉虽然搭了好多次,可是每次还是不记得那些参数,都要去网上搜索,索性自己把这次的简单demo给记录下来,供下次使用的时候直接复制吧。这个web逻辑 input.jsp ---->ReportServle…...
越南国家建设部网站/正规淘宝代运营去哪里找
本文首发于政采云前端团队博客:五分钟看懂 Nginx 负载均衡https://www.zoo.team/article/nginx前言对于电商平台而言,随着业务的不断发展壮大,网站访问量和数据量也随之急剧增长,该情况的产生给服务器带来了一定的负担。从用户体验…...