问题标签 [consensus]

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.

0 投票
0 回答
2386 浏览

redis - 如何使用redis集群创建分布式锁

背景

我实现了一个redis客户端(支持集群),并且提出了redis集群支持分布式锁的问题。

我读过红锁算法和相关辩论的帖子

问题

实际上,不可能将一个密钥散列到redis集群中的不同节点,并且很难在特定规则中生成密钥并确保它们不会在集群中迁移。在最坏的情况下,所有密钥槽可能都存在于一个节点中。然后可用性将与一个节点中的一个密钥相同。

我的算法

我的解决方案是利用READONLY从属模式来确保锁定密钥从主控同步到其 N/2 + 1 个从属,以避免故障转移问题。既然是单键解决方案,迁移问题也无所谓。

  1. 随机令牌 + SETNX+ 获取集群主节点锁的过期时间
  2. 如果获取锁成功则使用READONLY模式检查从节点(可能有N个从节点)中的锁,如果N/2+1同步成功则中断检查并返回True
  3. 使用 redlock 算法中描述的 lua 脚本向拥有随机生成令牌的客户端释放锁,如果客户端崩溃,则等待锁密钥过期。

你能帮我看看算法是否错误吗?我已经考虑了几个关于它的极端案例,但我仍然不太确定。

0 投票
1 回答
1430 浏览

consensus - raft算法如何在写入失败后节点失败的情况下保持强读一致性

考虑三个节点(A、B、C)获取键/值数据。并发生了以下步骤

  1. 节点 A 接收 key:value (1:15)。它是一个领导者
  2. 它复制到节点 B 和节点 C
  3. 在预提交日志中对节点 B 进行的条目
  4. 节点 C 未能进入
  5. 来自节点 B 的 Ack 丢失。
  6. Nod A 输入失败并将失败发送给客户端
  7. 节点 A 仍然是领导者,而 B 不在仲裁中
  8. 客户端从节点 A 读取键 1 并返回旧值。
  9. 节点 A 已关闭
  10. 节点 B 和节点 C 已启动
  11. 现在节点 B 在预提交日志中有一个条目,而节点 C 没有。

此时日志匹配是如何发生的。节点 B 是要提交该条目还是要丢弃它。如果它要提交,那么它会被读取不一致或者如果它要丢弃,那么在其他情况下可能会丢失数据

0 投票
2 回答
821 浏览

blockchain - 谁是验证节点?

我在词汇表中没有看到术语 Validating Peer 和 Non-Validating Peer 的定义。有这个定义很重要,因为大量文献似乎取决于这些类型的同行。

来到我的主要问题。

将区块链视为数据存储,很明显,该数据存储将公开函数以更改和读取其存储状态。因此,验证节点是否是一个实体,它将验证以下事实:X 是在状态之前,T 是已应用的事务,而 X' 是结果状态?

或者,验证节点是否也会验证 T 表示的业务逻辑以及调用 T 时应该存在的访问级别?

一个集中的类比是使用 SQL 引擎公开存储状态的 RDBMS。这个存储可以通过业务逻辑(例如规则引擎)和 SQL 命令(例如 INSERT、SELECT 等)的组合来更新。我的问题是,验证器是否有兴趣确保 SQL 命令成功运行?或者,它是否也将验证扩展到规则引擎?

0 投票
3 回答
1771 浏览

consul - 领事支持或 2 个节点的替代方案

我想将 consul 用于 2 节点集群。缺点是两个节点没有容错能力:

https://www.consul.io/docs/internals/consensus.html

Consul 有没有办法只用两个节点进行一致的领导者选举?Consul Raft Consensus 算法可以改吗?

非常感谢。

0 投票
0 回答
174 浏览

apache-zookeeper - zab如何承诺客户端先进先出顺序

我想知道在以下情况下,zookeeper 是如何承诺客户端 FIFO 顺序的。

客户端向服务器发送三个操作,设置 a = 1,设置 b = 1,设置就绪 = true。

有没有可能这种情况set a = 1是leader处理的,那么这个tcp连接有问题,这个client重新连接一个新的tcp连接到leader,但是set b = 1操作正在进行中. 然后客户端将使用新的 tcp 连接发送 set ready = true 操作。所以设置 a = 1 被操作,设置 b = 1 不被操作,并且 set ready = true 也被操作。

问题是zab如何承诺客户端先进先出顺序?

zab 可以重新发送所有没有得到领导者回复的操作。那么在这种情况下,当客户端重新连接到leader时,它会重新发送操作set b = 1,set ready = true。

这是 zab 用来启动 FIFO 订单的方式吗?

谢谢你们

0 投票
1 回答
199 浏览

distributed-system - 《自由选择的另一个优势:完全异步的协议协议》解释

请任何人澄清“完全异步协议协议”中的第 3 步(见下文):

过程 P:初始值 xp。

  • 步骤0:设置r := 1
  • 第 1 步:将消息发送(1, r, xp)到所有进程。
  • 第 2 步:等到收到N - t, 类型(1, r, x)的消息。如果多个N/2消息具有相同的值v,则将消息发送(2, r, v, D)到所有进程。否则将消息发送(2, r, ?)到所有进程。
  • 第 3 步:等待N - t类型的消息(2, r)到达。
    • (a) 如果有一个 D 消息(2, r, v, D),则设置xp := v
    • (b) 如果有多个tD 消息,则决定v
    • (c) 其他集合xp = 10每个集合的概率为 1/2。
  • 第 4 步:设置r := r + 1并转到第 1 步。

我对这个协议的理解如下。

在第一步中,每个节点都会通知其他每个节点其状态。

在第二步,每个节点决定它是否“看到”了足够的信息来确定值,换句话说,它等待多数。如果多数具有相同的值,它会开始广播此信息,例如“我看到多数认为v”。否则,它会发送消息,表明它没有下定决心。

最后,在第三步中,我们检查是否有多个t“决定性”消息(如果t节点的消息无法传递,则至少会有一个“决定性”消息)。但我不明白为什么我们xp := v只在收到一条D 消息时才设置。接收两个 D 消息属于 3c,在这种情况下,我们将为 v 分配随机值。为什么?

为什么我们不能像这样描述第三步:

  • (a) 如果 D 消息为零,则以 1/2 的概率设置xp = 10每个。
  • (b) 如果有多个tD 消息,则决定v
  • (c) 其他设置xp := v
0 投票
0 回答
72 浏览

graph - 具有对等网络中所有事件历史的 DAG 的共识

所有节点必须就代表网络上曾经发生的所有事件的 DAG 达成一致,从而允许找到这些事件的偏序。

学术论文链接优先。

(这似乎并不复杂,但我不想重新发明轮子。)

0 投票
1 回答
1183 浏览

blockchain - 在 Corda 中,哪些数据会发送到非验证公证服务?

这个问题经常出现在对话中:当 Corda 交易被发送到非验证公证服务进行最终确定时,公证服务可以看到和推断出什么?

0 投票
1 回答
489 浏览

events - 如何在分散的事件源数据库中处理共识?

假设我有 X 服务器的动态网络(随着时间的推移不固定),在仅附加数据库中具有所有事件的相同副本。现在我想支持在这 10 台服务器中的任何一台服务器上创建新事件,并让它们达成共识,复制事件并产生完全相同的事件顺序。我知道这是一个常见问题,并且有一些算法应该处理这样的事情。但我并没有完全掌握它们,我对特别是与事件溯源有关的共识有一些疑问。

我假设服务器永远无法完全确定它认为已达成共识的值真的是最终成为“正确”值的值吗?我基于这样一个事实,即新服务器可以随时加入网络并倾斜平衡以支持另一个价值。这也可能在很久以后发生。但是在这种情况下,服务器应该如何处理一个新的“正确”值呢?在事件溯源中,添加补偿事件以进行更正是正常的,但这些补偿事件是否也必须复制到所有服务器?为了确保所有服务器都具有完全相同的事件,我的意思是。

如果不添加补偿事件而只是“弹出”已经提交的事件,我猜我们不必复制这些事件,但我们会遇到其他问题。如果(错误地)提交的事件在事件总线上发送出去,以便其他服务可以对它们做出反应,我们不能只是将它们从我们的事件数据库中弹出而不搞砸。

还是在短时间内达成共识后,真正承诺一个价值会更好?然后冷冷对待所有新的/迟到的服务器?还是让他们接受结果?如果新服务器连接到它自己的网络,该网络比第一个更大,并且它们都已就另一个值达成共识,该怎么办?

0 投票
1 回答
943 浏览

hyperledger-fabric - 如何在 Hyperledger Fabric 1.0 中使用 PBFT 作为共识协议?

如何在 Hyperledger Fabric 1.0 中使用 PBFT 作为共识协议?设置超级账本结构区块链以使用 PBFT 作为共识算法时需要哪些配置?