在 RAFT 中,是否有可能对某个日志条目达成多数共识,但该条目尚未提交?

2024-03-20

考虑一下官方的这个模拟筏网页 https://raft.github.io/

Why is term 2 index 1尽管没有承诺S2 (leader) , S3 and S4同意日志吗?我运行了几分钟以确保所有通信均已完成。

奇怪的是,如果我再添加一个日志条目term 6 index 2 then term 2 index 1将致力于。

有谁知道阻止的规则是什么term 2 index 1承诺?


您的领导者处于第 6 学期,但没有任何日志条目来自第 6 学期;这会调用 Raft 中的一个特殊规则。领导者不会自动提交前一学期的条目,因为在某些情况下这样做是不安全的。第 5.3 节和第 5.4 节详细讨论了这一点(另请参见图 8)。

从第 5.4.2 节:

为了消除如图8所示的问题,Raft 从不通过计数提交之前术语的日志条目 复制品。仅记录领导者当前的条目 术语通过计算副本来提交;一旦进入 从本届任期起一直以这种方式承诺, 那么所有先前的条目都是间接提交的,因为 日志匹配属性。有一些情况 领导者可以安全地得出结论,较旧的日志条目 已提交(例如,如果该条目存储在每个 服务器),但 Raft 采用了更保守的方法 为了简单起见

您的示例完美地说明了为什么这是不安全的。我们假设S2确实承诺然后我们将通过将两个东西提交到同一个槽中来打破它。

  1. S2 提交槽 1(本地)。
  2. S2发送AppendEntries(commitIndex=1, []).
  3. S3 receives and applies AppendEntries(commitIndex=1).
    • 2现在已提交到两台主机上。
    • 其他主机不会收到该消息。
  4. S1 is elected leader
    • S1 比任何其他日志都“更新”(第 5.4.1 节),并且很容易赢得选举。
  5. S1 sends AppendEntries([4]).
    • 领导者做的第一件事就是让所有其他日志看起来像自己的日志。
  6. S4 receives and applies AppendEntries([4]).
    • 这会覆盖它的值2在插槽 1 处。
  7. S5接收并申请AppendEntries([4]).
  8. S1 commits 4 locally
    • 我们已经打破了它!!两个承诺的价值观
  9. S2,S3 receive and apply AppendEntries([4]).
    • 我们已经双重破坏了它,我们丢失了提交的数据!
    • 一个好的工程师会在这里放置一个断言来捕获这种覆盖。

发生了什么?本质上,我们为同一位置选举了两位不同的领导者。 (当 S1 更新时,S2 被选为领导者。)

那么为什么领导者可以安全地提交自己任期的条目而不等待后续请求呢?因为不可能出现上述情况。让我们考虑两个节点(S2、S1)分别在第 2 项和第 3 项中同时认为自己是领导者的情况。如果 S2 准备好提交2进入槽 1,然后大多数在那里具有相同的值。这意味着没有多数人投票支持第 1 任期中的其他任何具有更高任期的任何事物。这意味着 S1 要当选为第 3 任期的领导者,必须有2在插槽 1 中。

(顺便说一句,我花了一分钟才弄清楚你最初是如何陷入这种情况的。)

顺便说一句,Raft 被宣传为“Paxos 的更容易理解的版本”。我不同意:它似乎有同样多(如果不是更多)的极端情况,比如这些。但是,Raft 作者确实擅长让工程师轻松正确地实现一些实用的东西。这和作者如何写Raft论文有很大关系。

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

在 RAFT 中,是否有可能对某个日志条目达成多数共识,但该条目尚未提交? 的相关文章

  • 二进制字符串到十进制字符串

    下午好 如何将字符数多于语言最大整数类型中位数的二进制字符串转换为十进制字符串 换句话说 假设你有字符串 111001101001110100100 1001001111011100100 并且您不能先将其转换为整数 那么您将如何以 10
  • 获取无平方数的列表

    获得该值的一种方法是自然数 1 n 我们对每个因子进行因式分解 看看它们是否有重复的质因数 但这对于大的情况来说会花费很多时间n 那么有没有更好的方法从 1 中获取无平方数n 您可以使用埃拉托斯特尼筛法的修改版本 取一个布尔数组 1 n 预
  • 在未排序的整数列表中最优搜索 k 个最小值

    我刚刚接受采访时提出了一个问题 我很好奇答案应该是什么 问题本质上是 假设您有一个包含 n 个整数的未排序列表 您如何找到此列表中的 k 个最小值 也就是说 如果您有一个 10 11 24 12 13 列表并且正在寻找 2 个最小值 您将得
  • 给定两个(大)点集,我如何有效地找到彼此最接近的点对?

    我需要解决一个计算问题 该问题归结为搜索两个集合之间最接近的点对 问题是这样的 给定欧几里德空间中的一组点 A 和一组点 B 找到所有对 a b 使得 b 是 B 中与 a 最近的点 a 是 A 中与 b 最近的点 集合 A 和 B 的大小
  • 检查数独字段的很酷的算法?

    有谁知道一个简单的算法来检查数独配置是否有效 我想出的最简单的算法是 对于大小为 n 的板 伪代码 for each row for each number k in 1 n if k is not in the row using ano
  • 4 x 3 锁图案

    我遇到了这个 它要求计算在 4x3 网格中可以制作特定长度的锁定图案的方式数 并遵循规则 可能有些点不能包含在路径中 有效的模式具有以下属性 图案可以使用第一次接触的点序列来表示 与绘制图案的顺序相同 从 1 1 到 2 2 的图案与图案不
  • Bellman-Ford 算法检测什么?负重还是负循环?

    如果给定一个图 现在我们要从源头计算最短路径 现在 如果一条边具有负权重 但在到达目的地时有边到后边返回到该边 我的意思是如果没有循环 那么我们就没有负循环 但是here http en wikipedia org wiki Bellman
  • 用于插入/删除/排名/选择查询的最佳数据结构/算法

    到目前为止 我知道像AVL树和红黑树这样的自平衡BST可以在O log n 次内完成这些操作 然而 要使用这些结构 我们必须自己实现AVL树或RB树 我听说有一个算法 实现这四个操作而不使用自平衡 BST 有了我们自己定义的结构 我们就需要
  • 如何动态查找连接组件

    使用不相交集数据结构可以很容易地得到图的连通分量 而且 它只是支持增量连接组件 http www boost org doc libs 1 46 1 libs graph doc incremental components html 然而
  • 使到 n 个点的集合的欧氏距离之和最小的点

    我有一组点W x1 y1 x2 y2 xn yn 在 2D 平面上 你能找到一种算法 将这些点作为输入并返回一个点 x y 在 2D 平面上 距以下点的距离之和最小W 换句话说 如果 di Euclidean distance x y xi
  • 从日志文件中获取前 100 个 URL

    我的一位朋友在接受采访时被问到以下问题 谁能告诉我如何解决它 我们有一个相当大的日志文件 大约 5GB 日志文件的每一行都包含一个用户在我们网站上访问过的 URL 我们想要找出用户访问最多的 100 个 URL 怎么做 如果我们有超过 10
  • 我们应该在“编程基础”课程中教授指针吗?

    明年秋季 我将教授编程基础知识课程 即一年级计算机科学课程 在这样的课程中教授指针的优点和缺点是什么 我的立场 应该教导他们 Edit 我对 迎合你的观众 论点的问题是 在大学的头几年 我们 教授 不知道学生是否想成为科学家 我们希望我们知
  • 快速求解子集和

    考虑这种解决子集和问题的方法 def subset summing to zero activities subsets 0 for activity cost in activities iteritems old subsets sub
  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • 寻找距离原点最近的 100 颗恒星的算法

    首先让我提出正确的问题 问 有一个文件包含超过一百万个点 x y 每个点代表一颗星星 a b 处有一颗行星地球 现在 任务是构建一种算法 返回距离地球最近的 100 颗恒星 您的算法的时间和空间复杂度是多少 这个问题在各种采访中被问过很多次
  • 如何将一组重叠范围划分为不重叠范围?

    假设您有一组范围 0 100 一 0 75 b 95 150 c 120 130 d 显然 这些范围在某些点上重叠 您将如何剖析这些范围以生成不重叠范围的列表 同时保留与其原始范围相关的信息 在本例中为范围后面的字母 例如 运行算法后的上述
  • 解释一下从 N 个给定集合中的每一个中给出第 K 个最大数字的示例?

    今天我尝试解决一个Facebook 编程挑战赛 https facebook interviewstreet com recruit challenges 我遇到的挑战是 酒吧问题 可以找到here https github com alo
  • 有人可以解释以下异或属性

    我的一个论坛提到给定的数组n数字 arr 0 n 1 以下条件成立 is the xor运算符 f l r f 0 r f 0 l 1 where f l r arr l arr l 1 arr r 我检查了上面的数组数量和不同的值l an
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A

随机推荐

  • UITableView重新加载数据

    我正在为 iPhone 制作一个基于导航的应用程序 我的视图控制器之一如下所示 interface NewComputerViewController UIViewController
  • 什么时候会使用 BRICK 权限?

    在Android中 曾经有一个名为BRICK http developer android com reference android Manifest permission html BRICK可用于潜在地禁用该设备 除了将其视为都市神话
  • 除 None 之外的任何类型的 Mypy 注释[重复]

    这个问题在这里已经有答案了 我怎样才能注释一个类型 除了None 换句话说 这个类型是Any但不是None 你可以做Union int str 但排除None来自那个工会
  • Scala Futures 如何与 flatMap 链接在一起?

    我正在 Scala 中首次使用 Futures 并且正在研究使用 flatMap 组合器的示例 我一直在关注这个讨论 http docs scala lang org overviews core futures html http doc
  • 当构建系统已引用 System.Core 时,添加对 System.Core 的引用

    即使项目已生成 Visual Studio Intellisense 也无法识别动态关键字 我尝试添加对System Core来解决问题 我收到此错误 无法添加对 System Core 的引用 该组件是 已经被构建系统自动引用 我注意到我
  • 从 Eclipse 和命令行运行时,BufferedImage 字节具有不同的字节顺序

    我试图转换一个BufferedImage s byte 从 32 位 RGBA 到 24 位 RGB 根据这个答案 https stackoverflow com a 9470843 2581401最快的方式获得byte 从图像中可以看出
  • AWS - 对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头

    我对 AWS 还很陌生 所以请耐心等待 我目前正在制作一个具有上传照片功能的网络应用程序 我想将这些照片保存在 S3 存储桶中 并将对它们的引用保存在我的数据库中 我目前正在遵循本指南 http docs aws amazon com sd
  • 生成所有可能的字符串组合

    我正在尝试生成字符串的所有可能组合 例如对于以下列表 a1q5z H9 b1q5z H9 c1q5z H9 d1q5z H9 a2q5z H9 等 我不想做很多嵌套循环 而是想用 MODULO 尝试一些聪明的东西 但碰壁了 这是我想出的 J
  • NHibernate Session.SetReadOnly

    我面临着其他人已经在 SO 上发布的同样问题 在从数据库读取对象时 NHibernate 会更新所有对象 因为数据库中一个字段的值不正确 详细来说 新添加的日期列在所有行中都包含 1 1 0001 因此在映射时 NHibernate 会替换
  • jQuery URL 分割和抓取

    所以我有一个 URL 并且我知道如何从 URL 获取 GET 但我的 URL 是http www example com edit 2695 有没有办法抓取网址并在之后吐出部分 我想要编辑和 ID 您可以使用此代码 var url http
  • Django 时间问题

    我在 django 中的应用程序需要告诉用户操作发生的时间 除了询问用户他 她所在的时区之外 我是否可以在客户端生成时间 在我的脑海中 是否有一个与时区无关的时间的特定表示 unix时间 然后我可以简单地将其粘贴到html中并让客户端 浏览
  • 如何为该月中的几天提供后缀?

    我需要一个函数在显示 等文本时返回几天的后缀th in Wednesday June 5th 2008 它只需要处理数字 1 到 31 不需要错误检查 和英语 这是一个也适用于更大数字的替代方案 static const char dayS
  • R - 从 URL/HTML 对象/HTML 响应写入 HTML 文件

    我想使用 R 中的 URL 保存 HTML 文件 我尝试在使用后保存响应对象GET and read html的功能httr and rvest分别打包到网站的 URL 上 我想保存 的 HTML 但这并不能保存网站的实际内容 url ht
  • 带有 async/await 的 try/catch 块

    我正在深入研究节点 7async await功能并不断绊倒这样的代码 function getQuote let quote Lorem ipsum dolor sit amet consectetur adipiscing elit la
  • 是否有获取最新 Microsoft Edge 版本号的链接?

    我正在寻找一个链接来获取 Microsoft Edge 的最新驱动程序版本号 类似于 Google Chrome 的链接 https chromedriver storage googleapis com LATEST RELEASE ht
  • Swift 3:在 collectionView 中缓存图像

    我目前正在开发我的应用程序 将其更新为与 Swift 3 兼容 但还剩下一个问题 以前 我的图像缓存工作得很好 但自从更新后UIImageView获取图像时不会填充 s 这是代码 在 cellForItemAt 功能 if let img
  • 资源未发现异常?

    我从 android 市场收到崩溃报告 android content res Resources NotFoundException Resource ID 0x 我每周收到大约 17 个这样的东西 它指出我的代码中的以下内容 conte
  • 如何将 JDK GregorianCalendar 对象日期与 Joda 一起使用

    我正在尝试使用 Joda 库 因为使用 Java 本机方法计算周期是一件令人头疼的事情 而且我所有的尝试都给出了不精确的结果 我看过这个样本 int n Days daysBetween start toLocalDate end toLo
  • 如何使用外部vue npm组件

    我是 Vue js 的新手 目前正在尝试在现有解决方案中使用它 我不可能使用 vue 文件 它是一个独立的系统 不使用 webpack 我需要本地文件才能使其正常工作 在下面的例子中 我在线使用了 js 我想使用这个日期选择器 https
  • 在 RAFT 中,是否有可能对某个日志条目达成多数共识,但该条目尚未提交?

    考虑一下官方的这个模拟筏网页 https raft github io Why is term 2 index 1尽管没有承诺S2 leader S3 and S4同意日志吗 我运行了几分钟以确保所有通信均已完成 奇怪的是 如果我再添加一个