领事支持或2个节点的替代

时间:2017-10-31 14:00:45

标签: consul consensus raft

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

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

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

非常感谢。

3 个答案:

答案 0 :(得分:3)

听起来你只限于2台这种类型的机器,因为它们价格昂贵。考虑购买三到五台便宜的机器来运行您的业务流程层。

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

即使在Raft之外,也无法运行双节点集群并确保在单个故障时取得进展。这是一个基本限制。通常,如果要支持f故障(意味着保持安全和可用),则需要2f + 1个节点。

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

尽管如此,我还是不知道任何实际灵活的paxos实现。

考虑到甚至试图破解解决方案的费用,最好的办法是获得更多更便宜的机器,或者只是运行双节点集群并在失败时接受不可用。

答案 1 :(得分:1)

谈到改变协议,FLP无法证明,如果系统低于2f + 1 f失败(失败停止),则无法达成共识。虽然提供了安全,但无法确保进步(活力)。

我认为,早期帖子中提出的选项是最好的。

答案 2 :(得分:0)

根据领事文档本身选择领导者选举需要3个节点。这依赖于运行状况检查机制以及会话。会话本质上是由TTL或服务崩溃自动释放的分布式锁。

要构建2节点Consul群集,我们必须使用另一种方法,称为 Leader Lease 。由于我们已经有了带有CAS支持的Consul KV-storage,因此我们可以简单地在该时间到期之前向其写入哪个机器是领导者。只要领导者还活着并且健康,就可以定期延长时间。如果领导者去世,有人会迅速将其更换。为了使这种方法有效,使用ntpd同步计算机上的时间就足够了,当领导者执行任何操作时,请验证是否有足够的时间来完成此操作。

在KV存储中创建了一个密钥,其中包含诸如“节点X是时间Y之前的领导者”之类的密钥,其中Y计算为当前时间+某个时间间隔(T)。作为领导者,节点X每T / 2或T / 3单位时间更新一次记录,从而扩展了其领导角色。如果节点掉落或无法到达KV存储,则在间隔(T)之后,该节点将取代其位置,这将是第一个发现释放了领导角色的节点。 如果两个节点同时尝试成为领导者,则需要CAS来防止出现竞争状况。 CAS指定使用“检查并设置”操作。这对于构建更复杂的同步原语非常有用。如果索引为0,Consul将仅在密钥不存在时将其放置。如果索引不为零,则仅当索引与该键的ModifyIndex匹配时才设置键。