基于Raft算法的DLedger-Library分析

这篇具有很好参考价值的文章主要介绍了基于Raft算法的DLedger-Library分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 背景

在分布式系统应用中,高可用、一致性是经常面临的问题,针对不同的应用场景,我们会选择不同的架构方式,比如master-slave、基于ZooKeeper选主。随着时间的推移,出现了基于Raft算法自动选主的方式,Raft是在Paxos的基础上,做了一些简化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者和候选人三种状态,在理解和算法实现上都相对容易许多。

1)DLedger 是openMessaging发布的一个基于 Raft 实现的JAVA类库,可以方便引用到系统中,满足其高可用、高可靠、强一致的需求,其中在RocketMQ中作为消息Broker存储高可用实现的一种解决方案。

2)Raft将系统中的角色分为领导者(Leader)、跟从者(Follower)和候选人(Candidate):

  • Leader:接受客户端请求,定时发送心跳包,并向Follower同步请求日志,当日志同步到大多数节点上后告诉Follower提交日志。
  • Follower:接受并持久化Leader同步的日志,在Leader告之日志可以提交之后,提交日志。
  • Candidate:Leader选举过程中的临时角色,该状态下的节点会发起投票,尝试选择自己为主节点,选举成功后,不会存在该状态下的节点

2 DLedger架构设计

DLedger 的实现大体可以分为以下两个部分:

  • 选举 Leader
  • 日志复制
  • 其整体架构如下图

注:图引用官网

从上面的架构图中,有两个核心类:DLedgerLeaderElector 和 DLedgerStore,选举和文件存储。选出 leader 后,再由 leader 去接收数据的写入,同时同步到其他的 follower,这样就完成了整个 Raft 的写入过程

3 DLedger选主源码分析

3.1 下载源码

从gitGub下载代码(https://github.com/openmessaging/dledger ),idea引入后,我们发现整个代码量很小,在分析代码时比较容易.

3.2 选主流程分析

3.2.1 原理

raft的选主过程实际是一个状态机的流转,在集群启动时每个节点的等待超时时间时随机的,在第一个节点超时时间到来,则主动向其他节点发起投票,在收到半数以上的投票后晋升为leader(投票过程是个循环的过程),同时发送心跳请求,其他候选节点收到主节点的请求后,改变自己为follower节点。

  • term: 任期,每一轮投票都是一个任期,默认从0开始
  • Quorum机制:简单说就是少说半数以上,比如3个节点,2个同意即可
  • 超时时间: 在选举时,每个节点的超时时间在一定范围内是随机的,这样可以保证能够顺利选举

3.2.2 代码分析

整个状态机的驱动,由线程每个10ms反复执行DLedgerLeaderElector.maintainState()方法。下面重点来分析其状态的驱动:

进入到核心方法maintainAsCandidate() :

1.step1 初始化

  • term : 投票轮次。
  • ledgerEndTermLeader: 节点当前的投票轮次。
  • ledgerEndIndex: 当前日志的最大序列,即下一条日志的开始 index
  • nextTimeToRequestVote: 下次发起投票的时间(随机的)
  • needIncreaseTermImmediately:是否立即投票,在后面中会说明

在DLedger中每个节点的初始状态WAIT_TO_REVOTE,所以第一轮只是做了初始化。其中只有 memberState.nextTerm()这个代码会更改投票轮次

2.step2 投票

进入到核心方法handleVote(),这个方法主要是判断其他节点请求来后,根据自己的term和请求者的等判断是否投赞成票

  • ledgerEndIndex因为在日志复制过程中,每个节点的进度有可能是不一样的,所以在新的一轮选举时,这时不能投赞成票的
  • 被选举者 term 小于 选举者的term,返回拒绝
  • 被选举者 term 大于 选举者的term,则选举者进行下面操作:
    • 变成candidate(或者保持candidate)
    • 把needIncreaseImmediately设置为true。
    • 返回 REJECT_TERM_NOT_READY,这个在后面提到。

这里补充说明:

选举者 的下一次状态循环会进入到maintainAsCandidate()函数,然后因为needIncreaseImmediately为true,所以把term更新,同时重置计时器。 但是并没有立刻发出投票(此时选举者 的CurrVoteFor还是null,使得接下来给之前的voting candidate 投赞成票可能)

获取所有node投票结果后开始计算票数:

3.step3 仲裁

在收到所有节点的投票结果计数后,进行仲裁,这里主要说明下图中这个条件

  • acceptNum:同意的数量
  • notReadyTermNum:未准备好的数量(即结果为REJECT_TERM_NOT_READY)

这里没有重置nextTimeToRequestVote的时间,即刻再发起一次投票。结合上面的说明,这样保证了被选者能尽快去拿到这些notRead的节点的赞成票。

最终经过多次投票后,当一个node节点获取到半数以上投票后,更新自己未leader角色,同时向其他node节点发送heartBeat,其他节点在收到心跳信息后,将自己从candidate 变为follower。

3.3 单元测试验证

3.3.1 编写单元测试

3.3.2 日志分析

3.4 应用场景

  1. DLedger 作为 RocketMQ ( version>=4.5.0)的消息存储已经发布
  2. 基于DLedger 实现多节点的缓存同步更新
  3. 基于日志复制的副本容错处理

4 总结

  1. 这里只简单分析了选主过程,在阅读源码过程中会涉及很多java的基础及netty的使用,比如AQS、CompletableFuture等,有助于提高我们的编码能力。
  2. DLedger在初始化时是将节点角色设置为candidate而不是follower 这个和原Raft是不同的地方,在节点角色转换过程中也稍有差别。

参考文献

  • https://github.com/openmessaging/dledger/wiki
  • https://www.usenix.org/system/files/conference/atc14/atc14-paper-ongaro.pdf

作者:京东物流 郭庆海

来源:京东云开发者社区 自猿其说Tech 转载请注明来源文章来源地址https://www.toymoban.com/news/detail-760532.html

到了这里,关于基于Raft算法的DLedger-Library分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式一致性算法——Paxos 和 Raft 算法

    本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见100个问题搞定大数据理论体系 Paxos和Raft算法都是 分布式一致性算法 ,它们的目的都是 在一个分布式系统

    2024年01月20日
    浏览(53)
  • 【分布式】分布式共识算法 --- RAFT

    CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance) It states, that though its desirable to have Consistency, High-Availability and Partition-tolerance in every system, unfortunately no system can achieve all three at the same time. 在分布式系

    2024年02月06日
    浏览(33)
  • 基于大数据背景下的全国各大城市地铁客流量分析

    目录 第一章 项目介绍 第二章 项目组织与项目计划 第三章 数据采集 3.1 数据采集目标 3.2 数据采集工具与方法 3.3 数据采集流程 3.4 数据采集保存 3.5 本章小结 第四章 数据预处理 4.1 数据预处理的目标 4.2 空值与重复值的处理 4.3 标点符号的处理 4.4 单位标准统一化 4.5 本章小结

    2024年02月11日
    浏览(42)
  • Improved Raft Consensus Algorithm in HighReal-Time and Highly Adversarial Environment(Raft算法改进区块链效率

    Raft缺点: 高实时高对抗环境中,无法抵御恶意节点攻击,恶意节点可以RequestVote RPC消息中包含的逻辑时间戳以获得更多选票,leader是恶意节点,它可以篡改客户端发送的日志项,导致其他正常节点接收到错误的日志。 网络分裂影响共识效率 hhRaft:新角色monitor,在领袖选举

    2024年02月11日
    浏览(31)
  • 基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真

    目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 MATLAB2013B        基于高斯混合模型(Gaussian Mixture Model, GMM)的视频背景提取和人员跟踪算法是一种广泛应用的计算机视觉方法,主要用于分离视频序列中的静态背景和动态前景

    2024年04月25日
    浏览(26)
  • 分布式一致性算法Paxos、Raft 及 Zookeeper ZAB

    国科大学习生活(期末复习资料、课程大作业解析、学习文档等): 文章专栏(点击跳转) 大数据开发学习文档(分布式文件系统的实现,大数据生态圈学习文档等): 文章专栏(点击跳转) 分布式一致性算法是用于在分布式系统中 确保数据一致性 的一类算法。在分布式计

    2024年02月04日
    浏览(48)
  • 基于OpenCV+CUDA实时视频抠绿、背景合成以及抠绿算法小结

    百度百科上描述抠绿“抠绿是指在摄影或摄像时,以绿色为背景进行拍摄,在后期制作时使用特技机的“色键”将绿色背景抠去,改换其他更理想的背景的技术。”绿幕的使用已经非常普遍,大到好莱坞大片,小到自媒体的节目,一些商业娱乐场景,几乎都用使用。但是很多

    2023年04月09日
    浏览(48)
  • 计算机视觉任务图像预处理之去除图像中的背景区域-------使用连通域分析算法(包含完整代码)

    通过连通域分析算法能够找到最大的连通域,即图片的主体部分,然后保存该连通域的最小外接矩阵,即可去除掉无关的背景区域 更多图像预处理操作工具集包含在这个github仓库中

    2024年02月06日
    浏览(37)
  • 视频监控汇聚平台羚通视频智能分析平台校园背景中保护学生安全的防摔倒算法应用策略

    在数字化时代的今天,视频监控技术已经成为校园安全保障的重要手段。为了更好地保护学生的安全,众多学校已经引入了视频监控汇聚平台羚通视频智能分析平台。其中,防摔倒算法的应用策略是该平台的核心功能之一,旨在实时监测校园内学生的安全状况,及时发现并预

    2024年02月02日
    浏览(42)
  • [Docker]十一.Docker Swarm集群raft算法,Docker Swarm Web管理工具

    Raft :一致性算法,在保证大多数管理节点存活的情况下,集群才能使用, 所以就要求如果集群的话, manager 节点必须 =3 台 ,如果是两个台,其中一台宕机,剩余的一台也将不可用,以致整个集群不可用 Manager : 管理节点,用于管理工作节点,为了利用 swarm 模式的容错特性

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包