我们目前有一台运行在 Oracle Linux 上的 MySQL 8 服务器。它运行在德克萨斯州一个托管数据中心的虚拟机上。
大约 95% 的时间花在 SELECT 操作上,大约 5% 的时间花在 INSERT 和 UPDATE 上。
我们正在努力在单独的位置(MO)添加另一个 mysql 服务器,主要是为了实现冗余和灾难恢复目的。
我的想法是,在两个位置之间建立一个隧道,并使用主位置作为主服务器来设置 MySQL 复制。这样,如果发生灾难,我可以切换到从服务器。但有一个缺点,那就是除非发生意外,否则这台专用的从服务器就一直闲置在那里,可能没有任何好处。
我正在考虑如何利用它,也许更新我的应用程序以使用从属服务器来处理一些繁重的查询/报告。
我原本以为这是一个很棒的计划,直到我开始阅读有关 MySQL 集群的文章。我们实在没有办法搭建集群所需的第三台专用 MySQL 服务器。
我的问题是:
假设您在 2 个位置有 2 个 mysql 节点,您将如何最好地利用它们?
我们的应用服务器所有东西都在 Docker 容器中运行。为了构建 MySQL 集群而不是复制,在应用服务器中添加一个 MySQL 实例(在 Docker 容器中)会不会是个疯狂的想法?
如果集群确实可行(通过应用服务器上的 MySQL 实例),我的理解是写入速度可能会变慢,因为写入操作要等到集群中所有节点都写入完毕才能完成?这可能意味着,如果集群节点分布在多个位置,写入速度会显著降低,因为两个站点之间会存在一些延迟?
任何建议都将受到赞赏。
我会使用 VPN。
隧道(我假设您的意思是
ssh -L
)只能点对点地工作,并且只能用于一个端口。ssh 隧道也需要在主机上运行,因此如果主机重新启动或进程中断,它们就会断开。
我知道您说过您的预算有限,但是使用 ssh 隧道会迫使您做比您预期更多的工作来监视和重新启动该隧道。
是的,就是这个主意。提供灾难恢复服务似乎成本高昂。你需要冗余的基础设施,以便在主站点不可用时接管全部流量。
当然可以,但请记住,如果您的应用程序在德克萨斯州运行,而副本服务器在密苏里州运行,那么它们之间必然会存在一些网络延迟。德克萨斯州奥斯汀和密苏里州堪萨斯城之间的 ping 时间应该在 25 毫秒以下。这看起来可能不高,但比您的应用程序与本地网络上的源数据库之间的 <1 毫秒延迟要高得多。
延迟会应用到应用程序与副本数据库服务器之间发送的每个数据包。由于典型的 SQL 查询涉及应用程序与数据库之间的多次往返通信,并且您的应用程序可能会针对给定的报表运行多个查询,因此延迟可能会累积起来。
我建议您做一些计时实验来测试当您通过 WAN 运行报告时它们是否显得太慢。
在我以前的一个工作中,我们两个数据中心之间有一条较长的 WAN 链路:位于硅谷地区和北卡罗来纳州之间。ping 时间超过 60 毫秒。偶尔会有开发人员抱怨“数据库太慢了!”,结果发现他们只是意外地对数据库或应用程序进行了故障转移,而不是同时对两者进行了故障转移。一旦他们确保活动数据库和活动应用程序位于同一个数据中心,性能问题就迎刃而解了。
另一个考虑因素:如果您的应用依赖于在密苏里州副本数据库上运行大量查询/报告,那么当发生灾难恢复事件,所有查询突然需要在密苏里州的数据库上运行时,会发生什么?该数据库能否处理所有查询的负载?您可以暂时关闭报告功能吗?
我猜你说的是 InnoDB 集群。这没什么奇怪的,但你得考虑故障场景。如果你的主数据中心(包括应用服务器)宕机了,那么你的数据库集群会怎么样?
(如果您指的是 MySQL NDB Cluster,那么我会说完全不行,不要通过 WAN 执行此操作。NDB Cluster 是 HA 的解决方案,但不是跨数据中心的解决方案。NDB Cluster 的节点需要位于同一个低延迟网络上。)
这是可配置的,因为你的应用程序可能与其他应用程序的一致性要求不同。详情请阅读https://dev.mysql.com/doc/refman/8.4/en/group-replication-configuring-consistency-guarantees.html 。
但是,是的,由于 WAN 延迟自然高于本地网络延迟,因此无论您选择哪种一致性级别,它都必然会给写入增加一些开销。
在那个跨美国复制的任务中,我们没有使用 InnoDB 集群。我们使用的是传统的 MySQL 复制,使用 GUID 和基于行的复制。这是异步复制,因此从本地应用程序的角度来看,写入本地数据库的速度很快。副本站点通过异步下载的二进制日志进行更新。
该站点通过 VPN 连接,这比为每个 MySQL 副本集使用隧道要简单得多(我们在 Docker 容器中操作超过 10,000 个 MySQL 实例)。
故障转移数据中心中处于非活动状态的 MySQL 实例几乎完全没有被应用程序日常使用。开发人员如果需要构建读取查询的原型或检查数据,可以连接到非活动实例,但延迟过高,应用程序无法运行跨数据中心的查询。
我们很少发生整个数据中心瘫痪的故障转移事件。我记得我在那家公司工作了四年半,发生过两次。当然,那是一种影响相当严重的故障,能够将所有数据转移到另一端对业务来说非常有利。
但说实话,既然主数据中心在不到 24 小时内就恢复了,有人可能会说,对于特定的企业来说,他们是否宁愿承担平均每两年一次的 24 小时停机成本,而不是一直管理整个冗余灾难恢复站点的成本,这完全取决于他们的判断。两种答案都可能正确,这取决于业务需求。