领事支持或替代 2 个节点

Consul support or alternative for 2 nodes

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

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

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

非常感谢。

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

要回答协议问题,不,没有办法在 Raft 中 运行 具有容错性的双节点集群。需要明确的是,您 可以 安全地 运行 双节点集群就好了——它将像任何其他集群一样可用并取得进展。只是当一台机器宕机时,因为你的容错为零你将失去可用性并且不再毫无进展。但安全永远不会受到损害 - 您的数据仍然始终如一地保存在这些机器上。

即使在 Raft 之外,也没有办法 运行 双节点集群并保证在单一故障时继续进行。这是一个基本限制。一般来说,如果你想支持f个故障(意思是保持安全和可用),你需要2f + 1个节点。

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

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

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

谈到更改协议,FLP 提供了不可能的证明,它指出如果系统因 f 次故障(失败停止)小于 2f + 1 就无法达成共识。虽然,提供了安全,但不能保证进度(活跃度)。

我认为,前面post中建议的选项是最好的。

在Consul的文档本身之上的leader选举的选择需要3个节点。这依赖于 health-checks 机制以及会话。 Session本质上是TTL或者服务崩溃时自动释放的分布式锁。

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

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