问题标签 [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 投票
2 回答
248 浏览

consensus - raft 协议中复制但未提交的日志会发生什么

假设一个 3 成员 raft 集群 a[master],b,c

客户端将日志发送到 a,a 将其复制到 b 和 c,a 将日志应用到状态机并响应客户端。然后 a 在 b 和 c 有机会将提交的状态复制到 b 和 c 之前崩溃。

b 替换 a 作为集群领导者。当日志已经响应客户端时,未提交的日志会发生什么?

它会被 b 再次复制还是被丢弃?

然后假设一个 4 成员 raft 集群 a[master],b,c,d

客户端将日志发送到 a,a 将其复制到 b 和 c(而不是 d),a 将日志应用到状态机并响应客户端,然后 a 在将提交的状态复制到 b、c 和 d 之前崩溃。

d 替换 a 成为集群领导者。那么在日志已经响应客户端的情况下,未提交的日志会发生什么?它会被丢弃吗?

0 投票
2 回答
551 浏览

algorithm - Raft 算法正常操作

我已经阅读了 Raft 算法论文,并得到了一个与 Raft 在接收到客户端请求时执行的操作顺序相关的问题:

为了克服单点故障场景,Raft 依赖于在其他机器上维护一个复制的日志,该算法还参考了一个共识模块来进行完整的日志管理。操作顺序如下:

  1. 领导者的状态机接收到客户端请求,领导者将命令附加到其日志中。
  2. 领导者向他的追随者发送AppendEntries RPC 以在他们的本地日志中克隆命令,并等待大多数追随者确认该条目已成功附加到他们的本地日志文件中。
  3. 一旦接收到请求已成功记录在大多数追随者日志中的确认,然后该请求将提交到领导者的状态机,从而发生转换,将该转换的输出返回给客户端。
  4. 最终,领导者在后续的AppendEntries RPC中通知追随者提交的条目。

如果上述理解是正确的,那么我可以声称客户端请求被保留一段时间以完成复制过程,我也可以声称客户端请求的成功很大程度上取决于复制的成功进程(因为在收到多数确认之前,不会在领导者的机器上执行客户端命令/请求)。问题是,在复制过程完成后,客户端请求平均需要多长时间才能收到响应,这对于实时系统也有效吗?

0 投票
1 回答
175 浏览

python - 通过 Pandas 计算每行中共识的差异

我有一个看起来像这样的 DataFrame:

我想确定每一行中最常见的字符,并计算与共识的差异数量:

通过循环运行是一种方法,但它似乎效率低下:

(等等)

有没有一种直接的方法来获得共识并计算其中的差异?

0 投票
2 回答
594 浏览

apache-zookeeper - 在分布式存储中实现线性化是否需要复制日志

etcd 使用的 Raft 算法和 Zookeeper 使用的 ZAB 算法都是使用复制日志来更新状态机。

我想知道是否可以通过简单地使用领导者选举和版本化值来设计一个类似的系统。以及为什么这些系统决定使用复制日志。

如果我们有以下设置,我就是我的例子

  • 机器 A(Leader),包含版本 1
  • 机器 B(跟随者),包含版本 1
  • 机器 C(跟随者),包含版本 1

写入将是这样的:

  1. 机器 A 接收写入请求并存储待处理的写入 V2
  2. 机器 A 向机器 B 和机器 C 发送准备请求
  3. 追随者(机器 B 和机器 C)向领导者(机器 A)发送确认
  4. 领导者(机器 A)从机器的 quorum 收到确认后,它知道 V2 现在已提交,并向客户端发送成功响应
  5. Leader(机器 a)向 Follower(机器 A 和机器 B)发送 finalize 请求,通知他们 V2 已提交,V1 可以被丢弃。

为了使该系统正常工作,在获得领导者租赁后领导者发生变化时,领导者机器必须通过在接受请求之前从节点的法定人数中读取来获取最新的数据版本。

0 投票
0 回答
87 浏览

multithreading - 使用三个比较和设置对象的多个 2 线程 3 分配

我正在阅读“多处理器编程的艺术”一书,并被困在某个问题上。可以在此处找到问题以及建议的解决方案(问题 71)

我的问题是他们的解决方案对我来说似乎不正确。当线程调用 assign 方法时,Assign23 对象必须能够设置 3 个值中的 2 个,并且结果必须具有 2 的一致性。

换句话说,如果线程 A 和线程 B 调用 assign,都想写入 r[0] 和 r[1],A 设法将其值写入 r[0] 并将 B 写入 r[1],那么我们有一个违法的情况。线程 A 认为它设置了它的两个值,B 也是如此,而实际上两者都没有实现它们的目标。我是否误解了他们的解决方案?

你有更好的选择吗?我似乎无法想出适用于所有情况的东西。

0 投票
1 回答
167 浏览

algorithm - Raft - 它只处理故障停止故障吗?

斯坦福大学的 Raft 幻灯片 ( https://ramcloud.stanford.edu/~ongaro/userstudy/raft.pdf ) 表明 Raft 处理以下故障模型:故障停止(不是拜占庭)、延迟/丢失消息。这是否意味着在某些故障恢复情况下,它可能变得不一致,或者它对故障恢复故障具有弹性?

0 投票
1 回答
417 浏览

replication - RAFT:提交条目的期限条件

我一直在阅读有关 Raft 的几个文档,并且我得到了关于提交的相互矛盾的信息。我知道一个条目只有在已知存储在大多数服务器中时才能提交,但是还有其他条件吗?我已经读过,当前术语的条目也必须存储在每个服务器中,但其他一些文档对此只字未提。有什么帮助吗?

0 投票
1 回答
725 浏览

replication - RAFT 选举限制

我正在用Raft 论文从头学习 Raft ,我无法理解领导者选举过程。我在 5.4.1 中读到,领导者需要在其日志中包含集群的所有已提交条目:

Raft 使用一种更简单的方法,它保证从选举的那一刻起,每个新领导者上都存在之前任期内所有已提交的条目,而无需将这些条目转移给领导者。

Raft uses the voting process to prevent a candidate from winning an election unless its log contains all committed entries.

但后来,据说候选人持有所有提交的条目,如果它至少与大多数其他日志一样最新。确定这个最新的机制是比较最后条目的索引和术语。最后一个条目上具有较高期限的日志将是最新的。

这难道不会导致在没有所有先前提交的条目的情况下选举领导者的情况吗?例如:

在此处输入图像描述

在这种情况下,如果服务器 4 发生故障,服务器 2 可能会成为领导者,因为它有一个比大多数人更大的条目。但它不会在其日志中包含第 2 学期的两个已提交条目。对吗?我误解了一些东西,但我能明白它是什么......

0 投票
1 回答
466 浏览

perl - Emboss Cons 用于获得许多文件的一致序列,而不仅仅是一个文件

我安装并配置了 emboss 并且可以运行简单的命令行参数来获得一个先前对齐的 multifasta 文件的一致性:

%缺点

从多重比对创建共有序列

输入(对齐)序列集:dna.msf

输出序列[dna.fasta]:aligned.cons

这非常适合一次处理一个文件,但我要处理数百个文件。我已经开始编写一个带有 foreach 循环的 perl 脚本来尝试为每个文件处理它,但我想我需要在脚本之外运行这些命令。关于如何运行命令行友好程序以从先前对齐的 multifasta 文件中连续获取多个文件的 fasta 格式的单个一致序列的任何线索?我不必使用浮雕——我可以使用另一个程序。到目前为止,这是我的代码:

0 投票
1 回答
411 浏览

r - 是否有可能让 glmulti 在所有子集模型选择中只考虑选择 intaractions?

我一直在使用glmulti包来运行所有子集模型选择过程。我有一个大型数据集,我的全局模型包含 7 个候选预测变量。问题是我只想考虑两个主要预测变量之间的单一交互。当我在全局模型函数中包含交互项时,glmulti 在我使用 'level = 1' 指定仅考虑的主要影响时会忽略它。有没有人可以让我获得考虑主要影响和单一交互的程序?

这是一个小样本:

全球模型

rttdfit<- glm(ROCK~AREA+DRATIO+ELEV+SECC+BLDGD+MAXD*CLIM+I(CLIM^2),data=rttd,family=binomial(link="logit"))

所有子集选择

rttdASMS<-glmulti(rttdfit, confsetsize = 5, crit = "aic", level = 1, family = binomial("logit"))

可加权(rttdASMS)