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/已写入日志的索引越多越好

状态维护

上图节点状态维护模型

ShutdownAbleThread 线程提供定时执行工作;等待执行两个特性

StateMaintainer 继承ShutdownAbleThread, 获得定时执行能力,定时执行维护状态的工作,维护工作分领导者,追随者,候选者

心跳

领导者通过状态维护线程定时发送心跳到其他节点(不发给自己),检测健康度。领导者收到心跳返回,统计,设置下一步动作准备。

心跳是选举的源头,跟随者记录心跳时间,跟随者状态维护线程检查收到心跳时间间隔,若超时转为候选者发起选举。

发送心跳

领导者定时发送心跳

1 准备和初始化统计量

2 发送心跳

2.1 跳过自身,心跳请求不发给自己

处理心跳

其他非leader节点接收心跳请求,处理

1  leader不在集群成员名单

dledger目前没有集群成员管理,实际不会出现

2  leader收到自己发来的心跳请求

这个在后面问题一章分析

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

3  term检查

3.1 leader的term落后于本节点

3.2 term一致,leader是心跳发送者,正常

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

4  同样是term检查,需要改变状态,加上线程锁

4.1 leader的term落后于本节点,返回告诉发起阶段,你term落后了

4.2 term一致

4.2.1  leader空

可能是term落后的节点,提升了term,又或是刚启动,设置leader,便可正常工作

4.2.2  leader是发起心跳节点,正常

4.2.3  leader不是发起节点,不一致

出现脑裂,然后网络正常,处理方法参看部署下一步行动

4.3  本节点term落后了

提升term,不需要发起投票

统计心跳返回结果

领导者心跳返回统计,为下一步行动准备

2.2 异步统计

2.2.1 节点存活记录,目前没有使用,应该是预留给集群成员管理

2.2.2 提前结束,2个条件

1)  正常返回数过半

对leader来说,最关心的是正常返回节点数量过半,这样就可以维持任期有效,因此,只要过半可以“下班”,多一个两个无关紧要

2)  正常返回数+term落后节点数过半

心跳最重要任务就是探测集群是否有效,同时,节点term落后,给予机会调整,这样保证集群的稳定性,不要急于发起选举,说到底,集群最重要的是正常工作,此时落后的节点正提升term,只要这些节点正常,正常节点就过半

2.2.3 总数累计

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

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

部署下一步心跳行动

领导者统计完成,依据统计结果部署下一步行动

3 等待

这里等待有两处,一个是latch,一个是线程sleep

我不确定,但我理解, latch可以提前退出,线程sleep时间固定,固定的这段时间是为了notReady退出条件的情况下,那时notReady节点正提升term,故而留点时间,提升term完成,接收心跳检测,便可成为正常节点

4 统计完毕,部署下一步的行动

4.1 本节点term落后了,自身是leader,需立即重新选举

4.2 集群有效性

心跳最重要任务就是探测集群是否有效,同时,有些节点term落后,给予机会调整,保证集群的稳定性,不要急于发起选举

4.2.1  正常节点过半,心跳检测完成

4.2.2  有效节点过半

notReady节点此时提升term,立刻心跳,term赶上可正常工作,参看处理心跳4.2,上面3

4.2.3  leader不一致

单单是一个节点的leader不一致,不用立刻发起选举,但到这里,

memberState.isQuorum(succNum.get() + notReadyNum.get())=false,意味着过半的节点没通讯上,很可能是脑裂,而且自己处于小数一边,需立刻选举

4.2.4  到这里,过半节点没通讯上,心跳检测失败

跟随者(follower)

跟随者检测心跳接收时间间隔,若超过最大心跳接收时间间隔,转为候选者角色发起选举,这里有个小心思,体现细节,

问题

选举未分析出来的点

不是预期的leader

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

系列文章

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android14之RRO资源文件替换策略(二百二十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

.NET 一款利用内核驱动关闭AV/EDR的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

微服务 | Springboot整合GateWay+Nacos实现动态路由

1、简介 路由转发 执行过滤器链。 ​ 网关,旨在为微服务架构提供一种简单有效的统一的API路由管理方式。同时,基于Filter链的方式提供了网关的基本功能,比如:鉴权、流量控制、熔断、路径重写、黑白名单、日志监控等。 基本功能…

搜维尔科技:「研讨会」惯性动捕技术在工效学领域应用研讨会

Movella将于7月2日(周二)下午2点举行主题为惯性动捕技术在工效学领域应用的研讨会。来自Movella的伙伴赋能经理Jeffrey Muller作为嘉宾出席,届时主讲人将为大家带来Xsens惯性动捕技术在工效学领域的应用分享。同时,研讨会还邀请多…

最近写javaweb出现的一个小bug---前端利用 form 表单传多项数据,后端 Servlet 取出的各项数据均为空

目录: 一. 问题引入二 解决问题 一. 问题引入 近在写一个 java web 项目时,遇到一个让我头疼了晚上的问题:前端通过 post 提交的 form 表单数据可以传到后端,但当我从 Servlet 中通过 request.getParameter(“name”) 拿取各项数…

竞赛选题 python的搜索引擎系统设计与实现

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python的搜索引擎系统设计与实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:5分创新点:3分 该项目较为新颖&#xff…

如何用CSS样式实现一个优雅的渐变效果?

CSS渐变效果 CSS渐变(Gradients)是一种让两种或多种颜色平滑过渡的视觉效果,广泛应用于网页背景、按钮、边框等,以创造丰富的视觉体验。CSS提供了线性渐变(Linear Gradients)和径向渐变(Radial…

【软件实施】软件实施概论

目录 软件实施概述定义主要工作软件项目的实施工作区别于一般的项目(如:房地产工程项目)软件实施的重要性挑战与对策软件项目实施的流程软件项目实施的周期 软件企业软件企业分类产品型软件企业业务特点产品型软件企业的分类产品型软件企业的…

web安全渗透测试十大常规项(一):web渗透测试之深入JAVA反序列化

渗透测试之PHP反序列化 1. Java反序列化1.1 FastJson反序列化链知识点1.2 FastJson反序列化链分析1.3.1 FastJson 1.2.24 利用链分析1.3.2 FastJson 1.2.25-1.2.47 CC链分析1.3.2.1、开启autoTypeSupport:1.2.25-1.2.411. Java反序列化 1.1 FastJson反序列化链知识点 1、为什…

【scau大数据原理】期末复习——堂测题

一、集群安装知识 启动集群的命令start-all.sh位于 Hadoop安装目录的sbin文件夹 目录下。 bin文件夹下包含常见的Hadoop,yarn命令;sbin命令下包含集群的启动、停止命令。 启动集群的命令start-all.sh包含 同时启动start-dfs.sh和start-yarn.sh 功能。…

JetBrains PyCharm 2024 mac/win版编程艺术,智慧新篇

JetBrains PyCharm 2024是一款功能强大的Python集成开发环境(IDE),专为提升开发者的编程效率和体验而设计。这款IDE不仅继承了前代版本的优秀特性,还在多个方面进行了创新和改进,为Python开发者带来了全新的工作体验。 JetBrains PyCharm 20…

LED封装技术中SMD、COB和GOB的优缺点

在小间距LED显示屏的封装技术中,SMD、COB和GOB各有其优缺点,以下是对这些技术的详细分析: SMD(Surface Mounted Devices)表贴工艺技术 SMD技术是将LED灯珠焊接在电路板上的一种成熟技术,广泛应用于LED显示屏…

java+mysql通讯录管理

完整代码地址如果控制台打印出现乱码,进行如下设置

10分钟完成微信JSAPI支付对接过程-JAVA后端接口

引入架包 <dependency><groupId>com.github.javen205</groupId><artifactId>IJPay-WxPay</artifactId><version>${ijapy.version}</version></dependency>配置类 package com.joolun.web.config;import org.springframework.b…

DC-DC原理,升降压原理,BUCK,BOOST

DC-DC简述 开关电源包括电源模块&#xff0c;可以直接使用&#xff0c;不需要外部电路&#xff0c;提供的功率比较小。还有电源稳压器&#xff0c;这种功率MOS一般集成在芯片内部&#xff0c;但是需要选择外部电感。另外还有PWM控制器&#xff0c;需要选择功率MOS&#xff0c;二…

centos上部署Ollama平台,实现语言大模型本地部署

网上有很多大模型&#xff0c;很多都是远程在线调用ChatGPT的api来实现的&#xff0c;自己本地是没有大模型的&#xff0c;这里和大家分享一个大模型平台&#xff0c;可以实现本地快速部署大模型。 Ollama是一个开源项目&#xff0c;它提供了一个平台和工具集&#xff0c;用于部…

【Python】已解决:ModuleNotFoundError: No module named ‘LAC‘

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;ModuleNotFoundError: No module named ‘LAC‘ 一、分析问题背景 在开发或运行Python程序时&#xff0c;可能会遇到各种各样的报错&#xff0c;其中“ModuleNo…

stm32-hal库(5)--usart串口通信三种模式(主从通信)(关于通信失败和串口不断发送数据问题的解决)

问题&#xff1a; 最近发现&#xff0c;stm32cubemx最新版本f1系列的hal库&#xff08;1.85版本&#xff09;生成的hal库&#xff0c;其中stm32f1xx_hal_uart.c的库文件中&#xff0c;其串口发送接收存在一些问题&#xff1a; 1.没有使用 __HAL_LOCK 和 __HAL_UNLOCK 宏&…

多元时间序列分析——VAR(向量自回归模型)

VAR模型主要是考察多个变量之间的动态互动关系&#xff0c;从而解释各种经济冲击对经济变量形成的动态影响。这种动态关系可通过格兰杰因果关系、脉冲响应以及方差分解来进一步明确和可视化。VAR模型主要研究内生变量之间的关系&#xff0c;内生变量就是参与模型并由模型体系内…

【数据结构】(C语言):链表

链表&#xff1a; 基本单位是节点。节点至少两部分&#xff1a;数据&#xff0c;下一个数据的地址。头指针head&#xff0c;始终指向链表的第一个节点。若没有节点&#xff0c;则headNULL。链表在内存中是非连续的。不能使用索引&#xff08;下标&#xff09;查找元素。只能从…