我们即将使用主从复制(总共只有 2 个主机 - 一个主服务器,一个从服务器)替换旧版 MySQL 数据库,并使用 MariaDB Galera 主主复制集群来确保更轻松的故障转移。我读过的教程通常指导在 Galera 节点前创建一个 HAproxy 实例,以便在它们之间进行负载平衡(如果需要高可用性,则使用更多使用 keepalived 共享虚拟 IP 的 HAproxy 实例)。这这是建议的拓扑结构。
然而在我们的环境中我们总共只会有 2 个 Galera 主机(负载较低因此一个主机就足够了)并且主要要求是冗余并且最终尽可能无缝地实现所连接应用程序的故障转移。
由于一台主机必须能够在另一台主机发生故障时处理所有负载,因此负载平衡只会掩盖何时需要升级硬件,还可能引入不必要的写入冲突。所有查询都应转到一台主机(另一台主机只是默默地进行复制),并且只有在第一台主机发生故障时,所有内容才应故障转移到第二台主机,此后第二台主机应成为“主”主机,并在恢复后能够将所有内容复制回原始故障主机。
问题是:如果我们只需要冗余而不需要负载平衡,那么完全省略 Galera 主机前面的 HAproxy 实例并让两个 Galera 实例直接共享 keepalived 虚拟 IP 是否合理?或者在我们的情况下仍然使用 HAproxy 有什么值得注意的优势(除了更简单地扩展到 3 个以上的 Galera 主机)?
答案1
是的,虚拟 IP 就足够了。
但是,您应该有第三台主机至少运行 Galera 仲裁器守护程序,它负责仲裁,即决定两个节点中的哪一个是同步的。
如果只有两个节点,而另一个节点以意外的方式发生故障,并且该节点被启动,则集群状态未知,因为两个节点都不知道它是否是最新的。
有关详细信息,请参阅https://www.sebastien-han.fr/blog/2012/10/10/galera-arbitrator-resource-agent/。