问题标签 [raft]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
etcd - Raft算法,防止项增加
在 Raft 算法中,项总是在增加。有什么好的办法可以解决这个问题,防止以后期限达到极限吗?因为我用的是tinyint类型的term,又不想修改类型,一分钟就会有一轮选举,所以term会快速增长。
我想在follower收到心跳后修改term=0,但是这样不行。
distributed-system - 在这种情况下,当我采用 Raft 的“从不通过计算副本来提交以前条款的日志条目”规则时,这是否会导致真正的问题?
我目前正在自己实现 Raft 共识算法,我遇到了以下问题。考虑有 4 个节点(A、B、C 和 D),因此可以提交超过 2 票的日志条目。现在我们启动集群并让 Leader A 用term = 0
. 然后发生以下事情:
- 从动 B/D 断开。
- 领导者 A 创建
LogEntry
X。 - 领导者 A 尝试复制到所有节点并最终失败,因为只有 2 个节点(A 和 C)。
- 节点 B 重新连接并超时,它使用 new 开始选举
term = 1
。 - 节点 A 失去了领导地位,因为它收到了节点 B 的
RequestVote
RPC。 - Node B can't win the election, because it has no
LogEntry
X. So there are no Leader in the cluster. - 节点A超时,再次被选为Leader。
- Leader A 成功将 X 复制
LogEntry
到 B。 现在节点 A/B/C 具有完全相同的
LogEntry
X,即(index = 0, term = 0)
. 然而,根据 Raft 论文,Leader A 不能提交 X,尽管它是自己生成的,并且多数同意 X。Raft 永远不会通过计算副本来提交先前条款的日志条目。只有来自领导者当前任期的日志条目通过计算副本来提交;
- 假设不再有
LogEntry
来自客户端的 s 来复制,所以LogEntry
X 保持未提交。
我的问题是:
- 这是一个真正的问题吗?
- 有一些解决方案吗?事实上,已经有一些关于 SoF 的帖子强调了这条规则的重要性。在这篇文章中,似乎说我们可以创建 X 的副本 Y,并复制 Y。它是否有效,或者是否存在通用解决方案?
java - 当所有节点日志条目都已提交时,如何安全地删除 raft 中的历史日志
最近在用RAFT搭建一个分布式系统,实现一个简单的功能就是将日志条目复制到每台服务器,以保持数据的一致性,所以我的问题是在RAFT中所有节点都登录的时候如何安全的删除历史日志条目已提交。
ethereum - 如何在不使用 geth 控制台的情况下在现有仲裁网络中添加新的对等点?
我正在尝试测试在现有仲裁网络中添加新节点。有没有其他方法可以做到这一点,而无需去 geth 控制台并执行 admin.addPeer()。
是否存在任何 API,我可以在其中调用和添加新的对等点,以便它可以相应地同步。
distributed-computing - 如何在 raft 中处理重新排序的 RPC
在实现 Raft 算法时,我发现有一种情况我认为可能对集群造成伤害,也可能不会。
假设一些来自 Leader 的 AppendEntriesRPC 被重新排序(网络延迟或其他原因)是合理的。考虑领导者向对等点 A 发送心跳 AppendEntriesRPC,使用prev_log_index = 1
,然后发送另一个带有条目 2 的 AppendEntriesRPC,然后它崩溃(我确保通过我的测试中的回调立即发生这种情况)。如果两个 RPC 按发送顺序处理,则条目 2 将成功插入。但是,如果心跳 RPC 延迟,那么 peer A 会首先插入 entry 1 并响应 Leader。然后是延迟的心跳,peer A 将删除条目 2,因为该条目与 Leader 的 冲突prev_log_index = 1
。所以对等体 A 错误地删除了一个日志条目。
再深入一点,如果Leader不立即崩溃,它会解决这个问题吗?我认为如果 peer A 正确响应延迟的心跳,Leader 会在以后的一些 RPC 中发现并修复它。
但是,如果对等体 A 对条目 2 的响应导致commit_index
前进怎么办?在这种情况下,节点 A 投票支持前进commit_index
到 2,即使它实际上没有条目 2。因此可能没有足够的票数来支持前进。现在当Leader崩溃时,日志较少的节点将被选为Leader。我在测试过程中确实遇到过这种情况。
我的问题是:
- 我的推理正确吗?
- 如果重新排序 RPC 是一个真正的问题,我应该如何解决?对所有 RPC 进行索引和缓存,并强制它们一一处理是一个好的解决方案吗?我发现在 gRPC 中很难实现。
distributed-system - 当每次写入都不需要 fsync 时,raft 如何实现强一致性
我了解基本的 raft 协议以及它如何实现强一致性。但是在我看来,要实现真正的一致性,您需要在每次写入时使用 fsync(不仅在领导者上,而且在追随者上),因为如果您不这样做,即使您认为自己处于安全区大多数“已提交”,这些日志将来可能会丢失,因为它们仍在页面缓存中。
但是在每次写入时使用 fsync 会使系统性能下降几个数量级。
所以我想知道如果我的理解是错误的,他们如何解决权衡或向我解释。
etcd - raft提交后如何处理保存失败
使用 raft 时,在提交日志条目后,我们应该将节点提出的数据写入我们的存储中。如果其中一个节点写入失败怎么办。假设磁盘坏了。故障节点是否应该自行终止?
distributed-computing - 在 PAXOS 或 RAFT 中重新上线的副本如何赶上?
在诸如 PAXOS 和 RAFT 之类的共识算法中,会提出一个值,如果法定人数同意,则将其持久地写入数据存储。在达到法定人数时无法参加的参与者会怎样?他们最终如何赶上?无论我在哪里看,这似乎都留给读者作为练习。
raft - RAFT 上是否丢弃了消息?
我正在阅读有关 raft 的信息,但在网络分区后达成共识时我有点困惑。
因此,考虑一个包含 2 个节点、1 个领导者、1 个跟随者的集群。
在分区之前,那里有X条消息写入,成功复制,然后想象网络问题导致分区,所以有2个分区,A(前领导)和B(前跟随),现在都是领导(接收写入):
在分区事件之后,我们已经弄清楚了,会发生什么?
a) 我们选出 1 个新的领导者并考虑它的日志?(删除新追随者的消息?例如:
甚至:
(取决于哪个节点成为领导者)
b) 我们选出一个新的领导者,并找到一种方法来就所有信息达成共识?
如果是b,有什么具体的方法吗?还是取决于客户端的实现?(例如:消息时间戳...)
distributed-system - 筏:状态未确定
- 假设有 7 个节点N1, N2, ...N7的集群,状态为
x=2
- 假设N1是领导节点
- 然后客户端发送
x=5
到领导节点N1,N1复制x=5
到节点N6 和 N7(未提交),但是N2~N5 没有收到这个 RPC 这时,N1 崩溃了,所以,触发了新的选举,我的问题如下:
- 如果N6 赢得这次选举,集群中的状态将是
x=5
(未提交将变为已提交) - 如果N2 赢得这次选举,集群中的状态将是
x=2
(N6/N7 中未提交的将被丢弃)
- 如果N6 赢得这次选举,集群中的状态将是
我是不是误会了什么?谢谢!