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.mzph.cn/diannao/37694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术赋能教育:校园3D电子地图与AR导航解决方案

随着高考的落幕,又一批新鲜血液即将注入大学校园。面对陌生的环境,如何快速适应、准确找到目标地点,成为新生们的一大难题。同时,对于学校而言,如何向报考人员直观展示校园环境,提供沉浸式参观体验&#xf…

Mybatis-Plus学习|快速入门CRUD、主键生成策略(雪花算法、主键自增等)、自动填充、乐观锁、分页插件、逻辑删除

MyBatisPlus概述 为什么要学习它呢?MyBatisPlus可以节省我们大量工作时间,所有的CRUD代码它都可以自动化完成! JPA、tk-mapper、MyBatisPlus 偷懒的! MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变&#xff…

Day 48 消息队列集群RabbitMQ

消息队列集群-RabbitMQ 一、消息中间件 中间件 tomcat java web中间件 web容器 mysql php php mysql uwsgi python mysql mycat 数据库中间件 rabbitMQ 消息中间件 1、简介 MQ 全称为(Message Queue消息队列)。是一种应用程序对应用程序的通信方…

【全球首个开源AI数字人】DUIX数字人-打造你的AI伴侣!

目录 1. 引言1.1 数字人技术的发展背景1.2 DUIX数字人项目的开源意义1.3 DUIX数字人技术的独特价值1.4 本文目的与结构 2. DUIX数字人概述2.1 定义与核心概念2.2 硅基智能与DUIX的关系2.3 技术架构2.4 开源优势2.5 应用场景2.6 安全与合规性 3. DUIX数字人技术特点3.1 开源性与…

【Java Gui精美界面】IDEA安装及配置SwingX

SwingX 是一个基于 Swing 的 Java GUI 库,旨在为 Swing 提供额外的功能和丰富的组件 特点描述基于 Swing继承了 Swing 的所有特性和功能。丰富组件SwingX 提供了一组高级 UI 组件,例如 TreeTable仍在发展中不活跃的发展ing。。。支持搜索高亮如 TreeTab…

【分布式系列】分布式锁的设计与实现

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

steam社区加载异常、加载失败、无法加载、黑屏的解决方法

随着steam夏季特卖的临近,最近几天开启史低折扣的大作已经越来越少了,不过也并不是没有。最经典的知名大作文明6之前已经打到1折的骨折价了,没想到也能背刺,现在是新史低价0.5折11元,很多玩家入手后纷纷前往社区看新手…

ZABBIX-7.0LTS在线部署部署教程

ZABBIX-7.0LTS在线部署部署教程 环境: 操作系统: ubuntu 22.04zabbix-server版本: 7.0LTS系统配置[需结合监控的业务量提供配置]: 建议2C(CPU)8G(运行) 100GB(存储)架构:LNMP 第一步: 系统初始化 1.配置…

计算机网络知识整理笔记

目录 1.对网络协议的分层? 2.TCP/IP和UDP之间的区别? 3.建立TCP连接的三次握手? 4.断开TCP连接的四次挥手? 5.TCP协议如何保证可靠性传输? 6.什么是TCP的拥塞控制? 7.什么是HTTP协议? 8…

MySQL InnoDB支持几种行格式

数据库表的行格式决定了一行数据是如何进行物理存储的,进而影响查询和DML操作的性能。 在InnoDB中,常见的行格式有4种: 1、COMPACT:是MySQL 5.0之前的默认格式,除了保存字段值外,还会利用空值列表保存null…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-20填充与步幅

20填充与步幅 import torch from torch import nn# 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数 def comp_conv2d(conv2d, X):# 这里的(1,1)表示批量大小和通道数都是1#将输入张量 X 的形状调整为 (1, 1, height,…

Grafana-11.0.0 在线部署教程

Grafana-11.0.0 在线部署教程 环境: 操作系统: ubuntugrafana版本: 11.0.0 (建议不要按照最新版)grafana要求的系统配置不高,建议直接部署在监控服务器上,比如zabbix服务器、prometheus服务器…

从菌群代谢到健康影响——认识肠道丙酸和丁酸

谷禾健康 短链脂肪酸这一词经常出现在谷禾的文章和报告中,那你真的了解短链脂肪酸吗?短链脂肪酸(SCFA)主要是肠道微生物群在结肠内通过发酵碳水化合物(包括膳食和内源性碳水化合物,主要是抗性淀粉和膳食纤维)和一些微生物可利用的蛋白质而产生…

光线追踪:原理与实现

版权声明 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明文章内容不得删减、修改、演绎本文视频版本:见文末 各位同学大家好,今天我要给大家分享的是光线追踪的原理和实现大家知道在过往很多年里面&#x…

超简单的nodejs使用log4js保存日志到本地(可直接复制使用)

引入依赖 npm install log4js 新建配置文件logUtil.js const log4js require(log4js);// 日志配置 log4js.configure({appenders: {// 控制台输出consoleAppender: { type: console },// 文件输出fileAppender: {type: dateFile,filename: ./logs/default, //日志文件的存…

如何从0构建一款类似pytest的工具

Pytest主要模块 Pytest 是一个强大且灵活的测试框架,它通过一系列步骤来发现和运行测试。其核心工作原理包括以下几个方面:测试发现:Pytest 会遍历指定目录下的所有文件,找到以 test_ 开头或 _test.py 结尾的文件,并且…

MS-Net: A Multi-Path Sparse Model for Motion Prediction in Multi-Scenes

MS-Net: A Multi-Path Sparse Model for Motion Prediction in Multi-Scenes 基本信息 期刊:IEEE ROBOTICS AND AUTOMATION LETTERS (IF 4.6 SCI3区)单位:同济大学,上海人工智能实验室时间:2023年12月数据…

架构师必知的绝活-JVM调优

前言 为什么要学JVM? 首先:面试需要 了解JVM能帮助回答面试中的复杂问题。面试中涉及到的JVM相关问题层出不穷,难道每次面试都靠背几百上千条面试八股? 其次:基础知识决定上层建筑 自己写的代码都不知道是怎么回事&a…

C++中的虚函数表结构框架

一.虚函数表介绍 Virtual Table虚函数表是实现多态的 每个有虚函数的类的实现,都有个指向虚函数的指针表(不管是父类还是子类) 指向虚表的指针是作为数据成员存在实例对象中 当调用虚函数时,就去查找对象的虚表中指向整顿派生类函…

Bayes分类器设计

本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习笔记&#…