0

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

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

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

非常感谢。

4

3 回答 3

5

听起来您仅限于 2 台这种类型的机器,因为它们很贵。考虑购买三到五台便宜的机器来运行你的编排层。

要回答协议问题,不,没有办法在 Raft 中运行具有容错能力的两节点集群。需要明确的是,您可以安全地运行一个双节点集群,它会像任何其他集群一样可用并取得进展。只是当一台机器出现故障时,因为您的容错性为零,您将失去可用性并且不再取得任何进展。但安全性永远不会受到影响——您的数据仍会始终保存在这些机器上。

即使在 Raft 之外,也无法运行一个双节点集群并保证一次故障时的进度。这是一个基本的限制。一般来说,如果要支持 f 个故障(意味着保持安全和可用),则需要 2f + 1 个节点。

有非 Raft 方法可以改善这种情况。例如,Flexible Paxos 表明我们可以要求两个节点都进行领导者选举(因为它已经在 Raft 中),但只需要一个节点来进行复制。这将允许您的集群在 Raft 停止的某些故障情况下继续工作。但最坏的情况还是一样:总是有故障会导致任何两个节点的集群变得不可用。

也就是说,无论如何我都不知道有任何实用的灵活 paxos 实现。

考虑到甚至尝试破解解决方案的成本,最好的选择是要么获得更多更便宜的机器,要么只运行你的双节点集群并接受失败时的不可用性。

于 2017-11-06T19:37:42.607 回答
1

谈到改变协议,FLP 的不可能证明指出,如果系统小于故障(故障停止)2f + 1,则无法达成共识。f虽然提供了安全性,但无法确保进度(活力)。

我认为,之前帖子中建议的选项是最好的。

于 2017-11-10T05:22:00.620 回答
1

在 Consul 文档本身之上选择领导人选举需要 3 个节点。这依赖于健康检查机制以及会话。会话本质上是由 TTL 或服务崩溃时自动释放的分布式锁。

要构建 2 节点 Consul 集群,我们必须使用另一种方法,据说称为Leader Lease。由于我们已经有了支持 CAS 的 Consul KV-storage,我们可以简单地在某个时间到期之前向它写入哪台机器是领导者。只要领导者还活着并且身体健康,它就可以周期性地延长它的时间。如果领导者死了,有人会迅速取代它。要使这种方法起作用,使用 ntpd 同步机器上的时间就足够了,并且当领导者执行任何操作时,验证它是否有足够的时间来完成此操作。

在 KV 存储中创建一个密钥,其中包含“节点 X 是时间 Y 之前的领导者”之类的内容,其中 Y 计算为当前时间 + 某个时间间隔 (T)。作为领导者,节点 X 每 T/2 或 T/3 单位时间更新一次记录,从而扩展它的领导角色。如果一个节点跌落或无法到达KV-storage,在时间间隔(T)之后,它的位置将由该节点取代,该节点将最先发现领导角色已被释放。如果两个节点同时尝试成为领导者,则需要 CAS 来防止竞争条件。CAS 指定使用 Check-And-Set 操作。作为更复杂的同步原语的构建块,这非常有用。如果索引为 0,Consul 只会在 key 不存在的情况下放置它。如果索引不为零,

于 2018-12-03T12:41:15.497 回答