我想将consul用于2节点集群。缺点是两个节点没有容错性:
https://www.consul.io/docs/internals/consensus.html
领事是否有办法使一致……
听起来你只限于2台机器 这种类型 ,因为它们很贵。考虑购买三到五台便宜的机器来运行您的业务流程层。
要回答协议问题,不,没有办法在Raft中运行具有容错能力的双节点集群。要清楚,你 能够 安全地运行一个双节点集群就好了 - 它将可用并像任何其他集群一样取得进展。只有当一台机器发生故障时,由于您的容错能力为零,您将失去可用性,不再无法取得进展。但安全性永远不会受到影响 - 您的数据仍然在这些机器上持续存在。
即使在Raft之外,也无法运行双节点集群并确保在单个故障时取得进展。这是一个基本限制。通常,如果要支持f故障(意味着保持安全且可用),则需要2f + 1个节点。
有非筏方法来改善这种情况。例如,Flexible Paxos表明我们可以要求两个节点进行领导者选举(因为它已经在Raft中),但只需要一个节点进行复制。这将允许您的群集继续工作 一些 筏子会停止的失败案例。但最糟糕的情况仍然是相同的:总会有失败导致任何双节点集群变得不可用。
也就是说,无论如何我都不知道任何实用的灵活paxos实现。
考虑到甚至试图破解解决方案的费用,最好的办法是要么获得更多更便宜的机器,要么只运行双节点集群并在失败时接受不可用性。
谈到改变协议,FLP无法证明,如果系统小于,则无法达成共识 2f + 1 对于 f 失败(失败停止)。虽然提供了安全性但是不能确保进步(活力)。
2f + 1
f
我认为,早期帖子中提出的选项是最好的。
在领事文档本身之上选择领导者选举需要3个节点。这依赖于健康检查机制以及会话。会话本质上是由TTL自动释放的分布式锁,或者当服务崩溃时。
要构建双节点Consul集群,我们必须使用另一种方法,据称称为 的 领导租赁 强> 。由于我们已经拥有带有CAS支持的Consul KV存储,我们可以简单地向它写入哪个机器在这样的时间到期之前是领导者。只要领导者活得很好,它就可以定期延长它的时间。如果领导者死亡,有人会迅速更换。要使这种方法起作用,使用ntpd同步机器上的时间就足够了,当领导者执行任何操作时,验证它是否有足够的时间来完成此操作。
在KV存储器中创建一个密钥,其中包含类似于节点X在时间Y之前的领导者,其中Y被计算为当前时间+一些时间间隔(T)。作为领导者,节点X每T / 2或T / 3单位更新一次记录,从而扩展其领导角色。如果某个节点落入或无法到达KV存储,则在间隔(T)之后,节点将占用其位置,这将是第一个发现领导角色已被释放的节点。 如果两个节点同时试图成为领导者,则需要CAS来防止竞争条件。 CAS指定使用Check-And-Set操作。这对于更复杂的同步原语是非常有用的构建块。如果索引为0,则Consul仅在不存在密钥时才放置密钥。如果索引非零,则仅在索引与该键的ModifyIndex匹配时才设置该键。