Raft共识算法领导者选举流程揭秘

目录

一、领导者选举

        1、成员身份

        2、领导者选举过程

        3、节点是如何通讯的?

        4、任期编号

        5、选举规则

        6、随机时间

二、强领导者存在的问题


        Raft算法是现代分布式系统开发首选的共识算法,Raft算法属于Multi-Paxos算法,是在兰伯特Multi-Paxos思想的基础上,做了一些简化和限制。

        Raft算法的应用非常广泛

  • Etcd:一个分布式、一致性的键值存储系统,用于服务发现、配置共享以及分布式锁等场景,Etcd 使用 Raft 一致性算法来保证在分布式系统中多个节点间的数据一致性和高可用性。
  • Consul服务发现与配置工具,它也使用了类似 Raft 共识算法来保证其KV存储的一致性。
  • TiDB:TiKV 作为 TiDB 分布式数据库系统的存储引擎部分,TiKV 采用 Raft 协议来实现数据强一致性复制。
  • InfluxDB:一个开源的时间序列数据库,其集群版本使用了基于Raft的领导者选举和日志复制机制。
  • JRaft阿里自研的Java版Raft一致性算法库,可以方便地嵌入到各种分布式中间件和微服务中。Nacos 中使用 JRaft 作为其一致性实现之一。
  • RocketMQ阿里巴巴的消息队列系统,在其高可用部署方案中,也利用了 Raft 协议确保元数据的强一致性。

        掌握这个算法,可以得心应手的处理大部分场景的容错和一致性需求。关于 Raft 算法分三期讲解,分别介绍领导者选举、日志复制、成员变更,这篇文章首先讲解领导者选举。

一、领导者选举

        如果要用一句话概括 Raft 算法,是这样的:从本质上说,Raft 算法是通过一切以领导者为准的方式,实现一系列值的共识和各节点日志一致。领导者就是 Raft 算法中的核心,通过的“一切以我为准”的方式,决定了日志中命令的值,也实现了各节点日志的一致。

        先来看一个案例。

        假设有一个由节点 A、B、C 组成的 Raft 集群,因为 Raft 算法一切以领导者为准,所以如果集群中出现了多个领导者,就会出现不知道谁来做主的问题。在这样一个有多个节点组成的集群中,在节点故障、分区错误等异常情况下,Raft 如何保证在同一时间,集群中只有一个领导者呢?

        既然要选举领导者,那要从哪些成员中选举呢?除了领导者,Raft算法还支持哪些成员身份呢?

        1、成员身份

        成员身份,又叫做服务器节点状态,Raft 算法支持领导者(Leader)、跟随者(Follwer)和候选人(Candidate)三种状态。任何时候,节点的状态都处于三个中的一个。

  • 跟随者:默默地接受和处理来自领导者的消息,当等待领导者心跳信息超时的时候,就主动站出来,推荐自己为候选人。
  • 候选人:候选人将向其他节点发送请求投票(RequestVote)RPC 消息,通知其他节点来投票,如果赢得了大多数选票,就晋升为领导者。
  • 领导者:一切以我为准,平常的主要工作内容有3部分,处理写请求、管理日志复制和不断地发送心跳信息,通知其他节点“我是领导者,我还活着,现在不要发起选举,找个新领导者来替代我”。

        需要注意的是,Raft算法是强领导者模型,集群中只能有一个领导者。

        2、领导者选举过程

        首先,初始状态下,集群中所有的节点都是候选人的状态。

        Raft 算法实现了随机超时时间的特性。也就是说,每个节点等待领导者心跳信息的超时时间间隔是随机的。上图集群中没有领导者,而节点 A 的等待超时时间最小(100ms),它会最先因为没有等到领导者的心跳信息,发生超时。

        这个时候,节点A就增加自己的任期编号,并推举自己为候选人,先给自己投上一票,然后向其他节点发送请求投票RPC信息,请他们选举自己为领导者。

        如果其他节点接受到候选人A的请求投票RPC信息,在编号为1的这届任期内,还没有进行过投票,那么将把选票投给节点A,并增加自己的任期编号。

        

        如果候选人 A 在选举超时时间内赢得了大多数选票,那么他就会成为本届任期内新的领导者。节点 A 当选领导者后,将周期性的发送心跳信息,通知其他服务器我是领导者,阻止跟随者发起新的选举。

        3、节点是如何通讯的?

        在 Raft 算法中,服务器间的沟通联络采用的是远程过程调用(RPC),在领导者选举中,需要用到这样两类的RPC:

  1. 请求投票(RequestVote)RPC,是由候选人在选举期发起的,通知各节点进行投票;
  2. 日志复制(AppendEntries)RPC,是由领导者发起,用来复制日志和提供心跳信息。

        日志复制RPC只能由领导者发起,这是实现强领导者模型的关键之一。

        4、任期编号

        Raft 算法中的领导者是有任期的,每个任期由单调递增的数字(任期编号)标识,比如节点A 的任期编号是1。任期编号是随着选举而变化的,这里说下面几点:

  1. 跟随者在等待领导者心跳超时后,推举自己为候选人时,会增加自己的任期编号,比如节点A的当前任期编号为0,那么在推荐自己为候选人时,会将自己的任期编号增加为1。
  2. 如果一个服务器节点,发现自己的任期编号比其他节点小,那么它会更新自己的任期编号为较大的编号值。比如节点 B 的任期编号为0,当收到来自A节点的请求投票 RPC 消失时,因为消息中包含了 A 的任期编号,且编号为1,那么节点 B 把自己的任期编号更新为1。

        5、选举规则

        在 Raft 算法中,约定了选举规则,主要有这样几点。

  1. 领导者周期性地向所有跟随者发送心跳消息(即不包含日志项的日志复制 RPC 消息),通知大家我是领导者,阻止跟随者发起新的选举。
  2. 如果在指定时间内,跟随者没有接收到来自领导者的消息,那么它就认为当前没有领导者,推举自己为候选人,发起领导者选举。
  3. 在一次选举中,赢得大多数选票的候选人,将晋升为领导者。
  4. 在一个任期内,领导者一直都会是领导者,直到它自身出现问题(比如宕机),或者因为网络延迟,其他节点发起一轮新的选举。
  5. 在一次选举中,每一个服务器节点最多会对一个任期编号投出一张选票,并且按照“先来先服务”的原则进行投票。比如节点 C 的任期编号为 3,先收到了 1 个包含任期编号为 4 的投票请求(来自节点 A),然后又收到了 1 个包含任期编号为 4 的投票请求(来自节点 B)。那么节点 C 将会把唯一一张选票投给节点 A,当再收到节点 B 的投票请求 RPC 消息时,对于编号为 4 的任期,已没有选票可投了。
  6. 日志完整性高的跟随者(也就是最后一条日志项对应的任期编号值更大,索引号更大),拒绝投票给日志完整性低的候选人。比如节点 B 的任期编号为3,节点C的任期编号为4,节点 B 的最后一条日志项对应的任期编号为 3,而节点 C 为2,那么当节点 C 请求节点 B投票给自己时,节点B将拒绝投票。

        选举是跟随者发起的,推举自己为候选人,大多数选票是指集群成员半数以上的选票,大多数选票规则的目标,是为了保证在一个给定的任期内最多只有一个领导者。

        其实在选举中,除了选举规则外,我们还需要避免一些会导致选举失败的情况,比如同一任期内,多个候选人同时发起选举,导致选票被瓜分,选举失败。那么在 Raft 算法中,如何避免这个问题呢?答案就是随机超时时间。

        6、随机时间

        Raft 算法使用随机时间,把超时时间分散开来,在大多数情况下只有一个服务器节点先发起选举,而不是同时发起选举,这样就能减少因选票瓜分导致选举失败的情况。

二、强领导者存在的问题

        Raft 算法是强领导者模型,一切以我为准,那这样会存在什么问题呢?

        首先写请求肯定都会落到领导者身上,领导者压力会大很多;其实,如果集群规模很大,有很多跟随者,那么领导者需要承担大量的心跳通知成本来维护元数据;另外,领导者还存在单点故障,虽然有领导者选举机制,但在选举期间,集群是不可用的;最后,选举过程中,如果跟随者数量很大,那收集选票的时间会变长,选举领导者的耗时会增加。

        关于 Raft 选举领导者的问题就介绍到这里,欢迎留言讨论。

往期经典推荐

揭秘Elasticsearch:一文读懂分布式搜索与分析引擎的核心概念-CSDN博客

深入浅出 Kafka 消费者:解密分布式消息流的幕后英雄_kafka消费-CSDN博客

MySQL计数优化探秘:COUNT(*)、COUNT(主键)与索引字段,谁是性能王者?-CSDN博客

Redis高性能的秘密原来在这,超越想象-CSDN博客

  • 34
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
raft共识算法是一种分布式一致性算法,用于解决分布式系统中节点之间达成一致性的问题。它主要包含了Leader选举、日志复制和安全性等基本机制。 在raft算法中,节点分为Leader、Follower和Candidate三种状态。初始状态下所有节点都是Follower,然后它们通过相互通信进行Leader选举。选出的Leader负责接收客户端请求并进行日志复制等操作。如果Leader出现故障或无法通信,那么其他节点会重新进行选举,选出新的Leader。 日志复制是raft算法的关键过程,Leader负责将客户端请求记录在日志中,然后将日志复制给所有的Follower节点。Follower节点在接收到Leader的日志之后进行存储,然后发送应答给Leader确认。只有当大多数节点都复制了同一条日志之后,这条日志才算是已提交的。 raft算法还通过逻辑时钟和心跳机制来保证系统的一致性。每个节点都有自己的逻辑时钟,用于识别事件的顺序。Leader节点会定期发送心跳信号给Follower节点,以确保它们的存活状态。 在raft算法中,安全性是非常重要的一部分。它通过限制节点之间的信息交换,避免了“脑裂”等问题的发生。同时,每个节点都有持久性的存储,当节点宕机之后可以通过快照恢复。 总的来说,raft共识算法通过Leader选举、日志复制和安全性等机制,实现了分布式系统中节点之间的一致性。它比Paxos算法更容易理解和实现,因此在实际应用中被广泛使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超越不平凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值