分布式系统之Raft算法

2023-11-02

介绍

Raft是一种为了管理日志复制的分布式一致性算法。Raft 出现之前,Paxos 一直是分布式一致性算法的标准。Paxos 难以理解,更难以实现。Raft 的设计目标是简化 Paxos,使得算法既容易理解,也容易实现。Paxos 和 Raft 都是分布式一致性算法,这个过程如同投票选举领袖(Leader),参选者(Candidate)需要说服大多数投票者(Follower)投票给他,一旦选举出领袖,就由领袖发号施令。Paxos 和 Raft 的区别在于选举的具体过程不同。
Raft 可以解决分布式 CAP 理论中的 CP,即 一致性(C:Consistency) 和 分区容忍性(P:Partition Tolerance),并不能解决 可用性(A:Availability) 的问题。

在 Raft 中,任何时刻,每个服务器都处于这三个角色之一 :

  • Leader - 领导者,通常一个系统中是一主(Leader)多从(Follower)。Leader 负责处理所有的客户端请求。
  • Follower - 跟随者,不会发送任何请求,只是简单的 响应来自 Leader 或者 Candidate 的请求。
  • Candidate - 参选者,选举新 Leader 时的临时角色。

Raft 的基本原理

Raft 将一致性问题分解成了三个子问题:选举 Leader、日志同步、安全性。

Raft 的选举机制

协议为每个节点定义了三个状态:Leader、Candidate、Follower,将时间定义为 Term,每个 Term 有一个 ID。

Raft 使用一种心跳机制来触发 Leader 选举。Leader 需要周期性的向所有 Follower 发送心跳消息,以此维持自己的权威并阻止新 Leader 的产生。每个 Follower 都设置了一个随机的竞选超时时间,一般为 150ms ~ 300ms,如果在竞选超时时间内没有收到 Leader 的心跳消息,就会认为当前 Term 没有可用的 Leader,并发起选举来选出新的 Leader。开始一次选举过程,Follower 先要增加自己的当前 Term 号,并转换为 Candidate

  • Term 类似逻辑时钟,在每个 Term 都会有 Leader 被选举出来。
  • Leader 负责处理所有的写请求、发起日志复制、定时心跳,每个 Term 期间最多只能有一个 Leader,可能会存在选举失败的场景,那么这个 Term 内是没有 Leader。
  • Follower 处于被动状态,负责处理 Leader 发过来的 RPC 请求,并且做出回应。
  • Candidate 是用来选举一个新的 Leader,当 Follower 超时,就会进入 Candidate 状态。
  • 初始状态,所有的节点都处于 Follower 状态,节点超时后,递增 current Term 进入 Candidate,该节点发送广播消息 RequestVote RPC 给其他 Follower 请求投票。当收到多数节点的投票后,该节点从 Candidate 进入 Leader。Follower 在收到投票请求后,会首先比较 Term,然后再比较日志 index,如果都满足则更新本地 Current Term 然后回应 RequestVote RPC 为其投票。每个 Term 期间,follower 只能投一次票。

Raft 的日志同步机制

当 Leader 被选举出来后,就可以接受写请求。每个写请求即代表了用户需要复制的指令或 Command。Raft 协议会给写请求包装上 Term 和 Index,由此组成了 Raft 的 Log entry. Leader 把 Log entry append 到日志中,然后给其它的节点发 AppendEntries RPC 请求。当 Leader 确定一个 Log entry 被大多数节点已经写入日志当中,就 apply 这条 Log entry 到状态机中然后返回结果给客户端。

RAft的安全机制

Raft 还增加了一些限制来完善 Raft 算法,以保证安全性:保证了任意 Leader 对于给定的 Term,都拥有了之前 Term 的所有被提交的日志条目。

拥有最新的已提交的日志条目的 Follower 才有资格成为 Leader。
Raft 使用投票的方式来阻止一个 Candidate 赢得选举除非这个 Candidate 包含了所有已经提交的日志条目。Candidate 为了赢得选举必须联系集群中的大部分节点,这意味着每一个已经提交的日志条目在这些服务器节点中肯定存在于至少一个节点上。如果 Candidate 的日志至少和大多数的服务器节点一样新(这个新的定义会在下面讨论),那么他一定持有了所有已经提交的日志条目。
RequestVote RPC 实现了这样的限制:RequestVote RPC 中包含了 Candidate 的日志信息, Follower 会拒绝掉那些日志没有自己新的投票请求。

Raft 成员变更机制

成员变更就意味着集群节点数的增加或减少以及替换。Raft 协议定义时考虑了成员变更的场景,从而避免由于集群变化引起的系统不可用。Raft 是利用上面的 Log Entry 和一致性协议来实现该功能。成员的变更也是由 Leader 发起的,Leader 会在本地生成一个新的 Log entry,同时将 Log entry 推送到其他的 Follower 节点。

Follower 节点收到 Log entry 后更新本地日志,并且应用该 log 中的配置关系。多数节点应用后,Leader 就会提交这条变更 log entry。还要考虑新就配置的更替所带来的问题。更详细的不再赘述。

Raft应用

通过 RAFT 提供的复制状态机,可以解决分布式系统的复制、修复、节点管理等问题。Raft 极大的简化当前分布式系统的设计与实现,让开发者只关注于业务逻辑,将其抽象实现成对应的状态机即可。基于这套框架,可以构建很多分布式应用:

  • 分布式锁服务;
  • 分布式存储系统,比如分布式消息队列、分布式块系统、分布式文件系统、分布式表格系统等,比如大名鼎鼎的 Redis 就是基于 Raft 实现分布式一致性;
  • 高可靠元信息管理,比如各类 Master 模块的 HA

Raft算法实现braft

braft 是基于 brpc 的 Raft 协议工业级 C++ 实现,设计之初就考虑高性能和低延迟。由百度云分布式存储团队打造,在百度内部已经有比较广泛的应用,比如一些关键模块的高可用,以及分布式块存储、分布式文件系统、分布式 NewSQL 系统、分布式文件系统等存储系统。它有如下特点:

  • braft 是一个功能完备且经过可靠性验证的 Raft 实现,支持 configuration change、prevote、leader transfer 等特性;
  • 高性能也是 braft 追求的核心目标,在实现的很多环节都进行了精细优化,比如无锁任务队列、log 的批量提交和执行以及一些逻辑原地执行等;
  • 接口简单容易理解,支持自定义扩展其中的 storage,拥有比较完善的错误回调。用简单的接口实现简单的概念,braft配合brpc即使经验不丰富的工程师也可以很容易的快速构建出健壮的分布式系统。

项目地址如下:

https://github.com/brpc/braft

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式系统之Raft算法 的相关文章

随机推荐

  • 从0开始的算法大师(贰)

    从0开始的算法大师 标签 空格分隔 算法导论 常言道 算导 是本看不下去的好书 第二部分 排序和顺序统计量 数据结构 已经学过排序内容 第6章 堆排序 用数组A表示堆 根节点为A 1 A 0 代表A heap size 属性 说明 A le
  • SpringSecurity学习笔记

    SpringSecutity学习笔记 一 环境搭建 1 搭建一个Springboot工程 1 引入相关依赖
  • Windows mysql默认字符集修改

    一 通过MySQL命令行修改 set character set client utf8 set character set connection utf8 set character set database utf8 set chara
  • Python3,数据处理与计算,不得不掌握的高效计算函数之prod()函数,

    TOC 1 引言 小屌丝 鱼哥 你知道 prod 函数吗 小鱼 你这问的 是要打我脸吗 小屌丝 那我该怎么问呢 小鱼 你应该这要问 鱼哥 你能给我讲一讲 prod 函数吗 小屌丝 鱼哥 这话 我说不出口 小鱼 为啥 为啥 为啥子 小屌丝 因
  • java中Choice下拉列表怎么输入啊?

    小弟初学java 用Choice做了个下拉列表 当点击图中向下的箭头时 能选择出现的备选number 但是不能自己输入number 请问各位牛人 这个Choice new出来的下拉列表能不能输入啊 若能怎么输呢 谢谢各位了
  • OpenAI 何以掀翻 Google 布局多年的AI大棋?

    来源 飞哥说AI 作者 高佳 创意 李志飞 任何大卫击败歌利亚的故事 都值得我们重新思考 2023年从一场巨头之间的巨额合作开始 一场汹涌已久的AI暗战摆上了台面 随着微软和 OpenAI 融资的推进 双方在关系变得更加深厚复杂的同时 也在
  • 动画-Animation/@keyframes

    动画的使用流程有两步 分为定义动画和使用动画 定义动画相当于制作动画 有两种制作方法 一个是 from to 另一个是百分比 制作完动画之后 再在需要的地方通过 animation 来使用制作好的动画效果 1 定义动画 from to ke
  • (三)elasticSearch和MySQL的对比

    ElasticSearch和MySQL的对比 一 ES和MySQL的概念的比较 二 ES和MySQL使用场景的比较 1 MySQL更擅长的是事务类型的操作 可以确保数据的安全和一致性 如果是有事务要求 如商品的下单支付等业务操作 无疑使用M
  • Flink中的时间和窗口

    1 时间语义 在流式数据处理的过程中 有两个非常重要的时间点 一个是数据产生的时间 我们把它叫作 事件时间 Event Time 另一个是数据真正被处理的时刻 叫作 处理时间 Processing Time 我们所定义的窗口操作 到底是以那
  • 六一儿童节礼物(Python中turtle实现)

    目录 六一儿童节快乐 Python代码实现 好玩的海龟turtle 送给小朋友的节日小故事 六一儿童节快乐 一颗闪闪发光 五彩斑斓的儿童星星奉上 Python代码实现 好玩的海龟turtle import turtle as t impor
  • 阿里云推出基于大模型的工作学习AI助手“通义听悟”

    文章目录 人工智能福利文章 什么是通义听语 通义听语有哪些优势 通义听语能做什么 体验地址 写在最后 创作者 全栈弄潮儿 个人主页 全栈弄潮儿的个人主页 个人社区 欢迎你的加入 全栈弄潮儿的个人社区 专栏地址 AI大模型 人工智能福利文章
  • git stash 用法小结

    场景 有一天你正兴高采烈地coding 突然现网出现一个bug让你紧急修复 但是你本地已经有了修改 你又不想提交 也总不能全部回退吧 所以你正发愁怎么办的时候恰好看到了这篇文章 它将帮你完美解决此场景的困扰 那么今天的主角就是 git st
  • JS的几种关键词的查找方法

    1 var i str indexOf 关键词 开始位置 在str中 从 开始位置 开始 查找下一个 关键词 的位置 返回值 下一个 关键词 的第一个字的下标位置 如果找不到就返回 1 如果省略第二个参数 开始位置 默认从0开始找 查找最后
  • Java语言的跨平台性

    Java语言的跨平台性 什么是跨平台性 通过Java语言编写的应用程序在不同的系统平台上都可以运行 原理是什么 只要在需要运行java应用程序的操作系统上 先安装一个Java虚拟机 JVM Java Virtual Machine 即可 由
  • java ssh 访问linux,通过java使用ssh访问远程Linux

    需要做一个监控远程Linux磁盘空间的东西 绞尽脑汁终于发现一个东西 ch ethz ssh2 它可以通过用户名和密码登录可以ssh登录的机器 并且可以执行命令 并将命令显示的东西返回来 上代码了 Java代码 Connection con
  • 用jquery插件实现漂亮的日历效果

  • python爬虫时,将时间戳转换成北京时间、标准格式

    import time timestamp items get created 时间戳 time local time localtime int timestamp 注意 这里的整数不能超过11位数 pub date time strft
  • vue点击按钮次数

    显示点击次数
  • blender常用快捷键+动效制作

    文章目录 1 技术概述 2 技术详述 2 1常用快捷键 2 2镜像循环动画效果 3 遇到的难点和解决办法 难点 解决方法 4 总结 1 技术概述 Blender是一款免费的3D计算机图形软件 可用于创建动画 视觉效果 游戏开发和建筑设计等领
  • 分布式系统之Raft算法

    介绍 Raft是一种为了管理日志复制的分布式一致性算法 Raft 出现之前 Paxos 一直是分布式一致性算法的标准 Paxos 难以理解 更难以实现 Raft 的设计目标是简化 Paxos 使得算法既容易理解 也容易实现 Paxos 和