2

我想使用 AutoScaling 组在 ec2 中创建一个由 3 个 Percona Xtradb+应用程序服务器组成的集群,这样如果某个服务器由于某种原因出现故障,它可以被关闭,然后 ASG 将重新启动服务器,从其他 2 个获取所有当前数据工作服务器。

因此,为了实现这一点,我创建了 3 个实例(A、B 和 C),并在初始启动实例 A 测试实例 B 和 C 的端口 4567,如果其中任何一个端口打开,Xtradb 将以正确的wsrep_cluster设置启动, SST 是从正在运行的实例中获取的。

如果该端口在两个实例上都关闭,则 A 开始,wsrep_cluster=gcomm://因此它成为集群的“起点”,认为实例 B 和 C 根本就没有启动,等待它们稍后连接。

问题是,如果实例 B 和 C 正在运行,但 A 在启动时无法连接到它们,就会发生“脑裂”。我该如何避免这种情况?

4

1 回答 1

0

如果 A 启动时 A 无法与 B 和 C 通信,则 A 将引导。你不会真的有裂脑。您将有两个单独的集群。您将在 B/C 上拥有现有数据,而在 A 上没有数据。

您可能需要服务发现,例如 Consul 或 etcd,以自动化方式充当集群状态的“事实来源”,就像您试图实现的那样。在每个节点启动时,联系 Consul 并查找代表任何节点的密钥对。如果没有,引导然后注册发现服务。每个节点一旦上线,就应该定期更新 srv 光盘,上面写着“我还在这里”。

当所有节点都关闭并且 ASG 必须重建所有节点时,就会出现真正的问题。在这种情况下,数据来自哪里?不会有的。这是此类自动化配置的最大缺点之一。对您来说,最好对节点何时离线进行适当的监控,以便您采取更明智的行动。

于 2018-07-29T03:40:21.427 回答