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

dledger原理源码分析系列(三)-选主

简介

       dledger是openmessaging的一个组件, raft算法实现,用于分布式日志,本系列分析dledger如何实现raft概念,以及dledger在rocketmq的应用

      本系列使用dledger v0.40

      本文分析dledger的选主

关键词

Raft

Openmessaging

心跳/选主

参考资料

In Search of an Understandable Consensus Algorithm  raft论文简版

选主

         选主是dledger的关键特性,主节点承担处理Client请求,复制日志到跟随者节点,dledger通过心跳发起选举。

关键属性

本节介绍关键属性,为下面分析准备

  • term 任期/轮次

任期: 新的选举开始到下一个选举开始,左闭右开的时间区间,包括选举期和工作期两部分

轮次:任期内选举的轮次,任期内可多轮不提升term选举

  • needIncreaseTermImmediately

需要立即增加term的设置,只提升任期,但不对其他节点发起投票请求,用于term落后的节点

  • nextTimeToRequestVote

下次请求投票时间

System.currentTimeMillis() + minVoteIntervalMs + random.nextInt(maxVoteIntervalMs - minVoteIntervalMs)

dledger根据情况有不同的设定,下次发起选举时间的差异正是选举的关键

  • currVotedFor

本节点投票给谁了,该值提升term时设置为null;该值设置地方只有一处,处理投票handlerVote,即,不提升term节点,投票给谁不会改变

  • currTerm

节点当前所处任期

  • ledgerEndTerm/ledgerEndIndex

已写入日志的term;已写入日志的索引

两个数据是节点成为leader的关键数据,作为leader已写入日志的term/已写入日志的索引越多越好

分析

选举分3块,第一投票邀请;第二投票;第三投票统计,部署下一步操作,其中

投票邀请

候选者定时维护状态,maintainAsCandidate方法发起投票邀请,邀请其他节点(包括自己)为自己投票

1 检查是否符合投票条件,投票时间到 或者 设置了需要立即提升term

2 double check 节点处于候选者角色

3 是否提升term

lastParseResult是上一轮发起投票分析结果,参考后面投票统计

只需提升term,追赶上该轮投票的term,不发起投票邀请

4 获取节点的已写入的term/index

5 重置needIncreaseTermImmediately

term落后,设置该标记为true,提升term后,恢复默认

6 邀请节点投自己一票,邀请也发给自己

投票

节点,包括发起投票的领导者,处理投票请求

1 投票发起者的合法性检查

投票请求的leader是发起者,投票实际是拉票,邀请其他节点投自己一票

1.1 leader是否组内的节点

目前版本不知道集群变更,实际不会出现

1.2 不应该出现的leader

参看问题分析

-----------------------------------------分割线------------------------------------------

2 检查已写入日志term和index

这个好理解,想做leader,写入的日志应该比我多;比我少的,没资格让我投你票

-----------------------------------------分割线------------------------------------------

term相关检测

3  请求节点的term < 本节点term,拒绝投票,请求节点的term落后了

4  term一致

4.1 currVoteFor为空,还没投票

后面的检测没问题的话,本节点投票给发起节点

4.2  currVoteFor不为空,已投票,而且投的是发起节点

4.3  currVoteFor不为空,投票给其他节点了

下面继续细分,本节点是否已有leader,这里考虑一个问题,有无可能currVoteFor为空,并且有leader?

不可能,分两种情况,

  1. 本节点是跟随者,本节点未进入本term选举,本节点term小于发起者term
  2. 本节点是候选者,提升term置空currVoteFor,成为候选者要置空leader

4.4 本节点term落后了

设置needIncreaseTermImmediately,提升term,但不发起投票请求

5 发起节点term与本节点已写入日志term比较

与2相同,发起节点资格不够,不能投你

-----------------------------------------分割线------------------------------------------


6 本节点用户设置优先当领导,而且条件符合,不投票给发起节点,自己优先

7 最后,投票给请求节点

投票统计

7 首先准备好统计量

-----------------------------------------分割线------------------------------------------

统计不详细分析,看注释便清楚

-----------------------------------------分割线------------------------------------------

7.3 提早通过latch等待,3个条件

1. 已有选出leader

2. 票数已过半,自己将成为leader

3. 本节点未够票,剩下的票不过半,即,也没有其他人选上

7.4 统计所有节点数

总数达到allNum.get() == memberState.peerSize(),所有心跳请求返回(包括连接不上),退出

* memberState.peerSize() 实为 memberState.peerSize()+1-1,peerSize从0开始,数量需+1,排除自己,数量-1

部署下一论投票行动

8 投票统计结果决定下一步投票行动

8.1 本节点term落后了

提升任期,再发起投票请求,这点跟投票者不一样,投票者term落后设置needIncreaseTermImmediately=true,即只提升,不发起投票请求,这样做容易理解,选出主节点,需要争票的少,投票的多,投票发起节点只有一个,投票的节点多个

8.2 集群已有leader,无需再发起投票,但不立即转为follower,延长下次投票,等待下一个leader的心跳,调整为正确的leader,便进入正常工作

8.3 有效返回节点数过少,通常是网络原因,只有等

8.4 除去日志比自身完整的节点,还不够票数当选,让贤,延迟下次投票邀请的时间,让其他节点发起投票

8.5 当选leader

8.6 加上term落后的节点够票数让本节点当选

此时,term落后的节点提升term,立即选举增加本节点当选的几率,但REVOTE_IMMEDIATELY实际没使用

8.7 选票分散,提升任期,投票

9 选上了,赶快坐上宝座当领导

总结:行动的目标是尽快选到领导者,策略上尽量逼近目标无疑是正确的。

有效性

本节去掉异常情况,只看选举的主体流程,分析一下选主的有效性,dledger的规则/逻辑怎样让分布节点获得过半票数

去掉的异常情况

1 本节点term落后

2 有效返回过少

3 写入日志term/index比投票节点小

4 投票节点term小于本节点

选举主体

1 已经选出领导者

2 获得投票过半

3 投票分散,未能选为领导者

1/2 两种情况选举完成

3,提升term;设置下次投票时间,投票时间有范围的随机值,只要有不多于2个节点率先发起投票,其他节点投票,这就可以选出主节点

问题

选举未分析出来的点

不是预期的leader

目前没有分析出怎么出现这种情况

系列文章

  • 架构,核心组件和rpc组件 完成
  • 心跳和选举 完成
  • 日志写入/复制和存储 TBD  包括日志写入和复制,日志存储组件
  • 集成rocketmq rocketmq使用dledger实现消息存储复制;broker控制器 元数据复制
  • 快照/状态机
  • 集群成员变更  成员变更管理,节点的上线下线发现,dledger v0.4未实现,但计划中,未来版本实现
  • jraft   “double check”  多重分析,jraft比较忠实实现了raft算法,在dledger基础上,再深入研究jraft对raft更深入的认识

相关文章:

dledger原理源码分析系列(三)-选主

简介 dledger是openmessaging的一个组件&#xff0c; raft算法实现&#xff0c;用于分布式日志&#xff0c;本系列分析dledger如何实现raft概念&#xff0c;以及dledger在rocketmq的应用 本系列使用dledger v0.40 本文分析dledger的选主 关键词 Raft Openmessaging 心跳/选…...

如何修改PDF文档的作者名称?

要修改一个 PDF 文档的作者名称&#xff0c;你可以按照以下步骤进行操作&#xff1a; 1. **使用 Adobe Acrobat**&#xff08;如果有&#xff09;&#xff1a; - Adobe Acrobat 是一个功能强大的 PDF 编辑工具&#xff0c;支持修改文档属性信息&#xff0c;包括作者名称。打开…...

从笔灵到AI去痕:全方位提升内容创作与学术诚信

内容为王&#xff0c;在内容创作的世界中尤为重要。然而&#xff0c;面对写作时常常感到无从下手&#xff1a;有时缺乏灵感&#xff0c;有时难以表达清楚自己的想法。AI写作助手的出现&#xff0c;为这些问题提供了创新的解决方案&#xff0c;极大地改变了内容创作的过程。 今…...

考试如果出现汉诺塔问题怎么办?

对于这道题来说 就按照测试案例里的数字进行输入 测试案例用100 那这三只鸡的具体最多能有多少只鸡呢&#xff1f; 用总数除以这只鸡的单价>>>>>>>即为这只鸡最多有 >>>>>>>> n / 单价 修改后 >>>>> 不只适…...

导出word模板开发记录

exportWordDocx.js import JSZipUtils from “jszip-utils” import Docxtemplater from “docxtemplater” import {saveAs} from “file-saver” import PizZip from “pizzip” const exportWordDocx (demoUrl, docxData, fileName) > {// 读取并获得模板文件的二进制…...

PHP爬虫类的并发与多线程处理技巧

PHP爬虫类的并发与多线程处理技巧 引言&#xff1a; 随着互联网的快速发展&#xff0c;大量的数据信息存储在各种网站上&#xff0c;获取这些数据已经成为很多业务场景下的需求。而爬虫作为一种自动化获取网络信息的工具&#xff0c;被广泛应用于数据采集、搜索引擎、舆情分析…...

用Python将PowerPoint演示文稿转换到图片和SVG

PowerPoint演示文稿作为展示创意、分享知识和表达观点的重要工具&#xff0c;被广泛应用于教育、商务汇报及个人项目展示等领域。然而&#xff0c;面对不同的分享场景与接收者需求&#xff0c;有时需要我们将PPT内容以图片形式保存与传播。这样能够避免软件兼容性的限制&#x…...

机电公司管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;管理员管理&#xff0c;客户管理&#xff0c;公告管理&#xff0c;考勤管理&#xff0c;请假管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;公告&#xff0c;机电零件&…...

SQL中的子查询和CTE(with ....as..)

第一次看到with as 这种类似于python中读文件的写法还是挺疑惑的&#xff0c;其实它是CTE&#xff0c;功能和子查询很类似但又有不同点&#xff0c;在实际应用场景中具有着独特作用。 子查询 子查询是在主查询中的嵌套查询&#xff0c;可以出现在SELECT、FROM、WHERE等子句中…...

Cesium 基本概念:创建实体和相机控制

基本概念 Entity // 创建一个实体 const entity_1 viewer.entities.add({position: new Cesium.Cartesian3(0, 0, 10000000),point: {pixelSize: 10,color: Cesium.Color.BLUE} });// 通过经纬度创建实体 const position Cesium.Cartesian3.fromDegrees(180.0, 0.0); // 创…...

vue使用scrollreveal和animejs实现页面滑动到指定位置后再开始执行动画效果

效果图 效果链接&#xff1a;http://website.livequeen.top 介绍 一、Scrollreveal ScrollReveal 是一个 JavaScript 库&#xff0c;用于在元素进入/离开视口时轻松实现动画效果。 ScrollReveal 官网链接&#xff1a;ScrollReveal 二、animejs animejs是一个好用的动画库…...

在Ubuntu 16.04上安装和配置GitLab的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 GitLab CE&#xff08;Community Edition&#xff09;是一个开源应用程序&#xff0c;主要用于托管 Git 仓库&#xff0c;并提供额…...

STM32的SPI通信

1 SPI协议简介 SPI&#xff08;Serial Peripheral Interface&#xff09;协议是由摩托罗拉公司提出的通信协议&#xff0c;即串行外围设备接口&#xff0c;是一种高速全双工的通信总线。它被广泛地使用在ADC、LCD等设备与MCU间&#xff0c;使用于对通信速率要求较高的场合。 …...

机器学习引领教育革命:智能教育的新时代

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f4d2;1. 引言&#x1f4d9;2. 机器学习在教育中的应用&#x1f31e;个性化学习&#x1f319;评估与反馈的智能化⭐教学资源的优…...

6月29日,每日信息差

第一、位于四川省绵阳市的中广核质子治疗装备制造基地正式通过竣工验收&#xff0c;为全球装机数量和治疗患者数量最多的国际领先质子治疗系统全面国产化奠定了坚实基础。质子治疗作为目前全球最尖端的肿瘤放射治疗技术之一&#xff0c;与传统放疗技术相比&#xff0c;质子治疗…...

SpringCloud中复制模块然后粘贴,文件图标缺少蓝色方块

再maven中点击&#xff0b;号&#xff0c;把当前pom文件交给maven管理即可...

JS乌龟吃鸡游戏

代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>乌龟游戏</title><script type"text/javascript">function move(obj){//乌龟图片高度var wuGui_height 67;…...

第十节:学习ConfigurationProperties类来配置pojo实体类参数(自学Spring boot 3.x的第二天)

大家好&#xff0c;我是网创有方 。这节记录下如何使用ConfigurationProperties来实现自动注入配置值。。实现将配置文件里的application.properties的参数赋值给实体类并且打印出来。 第一步&#xff1a;新建一个实体类WechatConfig package cn.wcyf.wcai.config;import org…...

如何学习Node.js

Node.js是一个开源、跨平台的JavaScript运行环境&#xff0c;它允许你在服务器端使用JavaScript。以下是一些步骤和资源&#xff0c;可以帮助你开始学习Node.js&#xff1a; ### 1. 基础知识 首先&#xff0c;确保你熟悉JavaScript语言的基础。Node.js是基于JavaScript的&…...

云计算基础知识

前言&#xff1a; 随着ICT技术的高速发展&#xff0c;企业架构对计算、存储、网络资源的需求更高&#xff0c;急需一种新的架构来承载业务&#xff0c;以获得持续&#xff0c;高速&#xff0c;高效的发展&#xff0c;云计算应运而生。 云计算背景 信息大爆炸时代&#xff1a…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...