我的一位客户希望在两个数据中心运行 consul。两个数据中心柏林和法兰克福应该导致高可用性设置,其中一个数据中心可以离线或死亡而不会影响另一个数据中心。
两个数据中心应该具有相同的数据一致性状态,但遇到了一些问题。
尝试 1:一个节点在柏林、一个节点在法兰克福的集群,常见的“数据中心”选项
我原本以为,一个由两个服务器节点组成的简单 consul 集群就可以正常工作。但是,一旦两者之间的连接中断,它们都无法正常工作,因为不再选出领导者。
尝试 2:在柏林有一个服务器节点、在法兰克福有一个代理的集群,常见的“数据中心”选项
在这种设置下,当发生分裂时,柏林的服务器节点仍然工作,但法兰克福的代理节点停止工作。这确实引出了一个问题,Consul 中的代理到底有什么用处。
尝试 3:两个集群的“数据中心”选项设置为两个不同的值
如果一个集群/服务器位于柏林,并且数据中心选项也设置为“柏林”,另一个集群/服务器位于法兰克福,并且数据中心选项也设置为“法兰克福”,则存储将进行分片。分片后,两者均可正常工作,但柏林的密钥无法从法兰克福访问,反之亦然。
这需要以某种方式更新两个集群。一个解决方案是基于领事复制但是这会给整个设置增加一个单点故障,而这是我们想避免的。
尝试 4:获取另一个外部数据中心
我们唯一能想到的办法就是让第三个外部节点运行,希望不会有超过一个节点发生故障。这又带来了一系列需要考虑的事情(备份、安全、更新等),而我们希望避免这种情况。
目前,我们的最佳选择是运行两个完全独立的集群并通过外部管道更新密钥。这可能会导致不一致,但对我们的设置有效。
然而,这确实让我们怀疑,Consul 是否真的更喜欢拒绝服务,而不是可能的不一致。
我们是不是漏掉了什么?有没有其他方法可以在两个数据中心之间自动复制 Consul-Cluster,并且在出现裂脑情况或数据中心瘫痪时仍能正常工作?