AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 346257
Accepted
Matt F.
Matt F.
Asked: 2025-04-20 11:40:51 +0800 CST2025-04-20 11:40:51 +0800 CST 2025-04-20 11:40:51 +0800 CST

在两个不同位置使用 2 个 mysql 服务器的最佳设置是什么?

  • 772

我们目前有一台运行在 Oracle Linux 上的 MySQL 8 服务器。它运行在德克萨斯州一个托管数据中心的虚拟机上。

大约 95% 的时间花在 SELECT 操作上,大约 5% 的时间花在 INSERT 和 UPDATE 上。

我们正在努力在单独的位置(MO)添加另一个 mysql 服务器,主要是为了实现冗余和灾难恢复目的。

我的想法是,在两个位置之间建立一个隧道,并使用主位置作为主服务器来设置 MySQL 复制。这样,如果发生灾难,我可以切换到从服务器。但有一个缺点,那就是除非发生意外,否则这台专用的从服务器就一直闲置在那里,可能没有任何好处。

我正在考虑如何利用它,也许更新我的应用程序以使用从属服务器来处理一些繁重的查询/报告。

我原本以为这是一个很棒的计划,直到我开始阅读有关 MySQL 集群的文章。我们实在没有办法搭建集群所需的第三台专用 MySQL 服务器。

我的问题是:

假设您在 2 个位置有 2 个 mysql 节点,您将如何最好地利用它们?

我们的应用服务器所有东西都在 Docker 容器中运行。为了构建 MySQL 集群而不是复制,在应用服务器中添加一个 MySQL 实例(在 Docker 容器中)会不会是个疯狂的想法?

如果集群确实可行(通过应用服务器上的 MySQL 实例),我的理解是写入速度可能会变慢,因为写入操作要等到集群中所有节点都写入完毕才能完成?这可能意味着,如果集群节点分布在多个位置,写入速度会显著降低,因为两个站点之间会存在一些延迟?

任何建议都将受到赞赏。

mysql
  • 1 1 个回答
  • 33 Views

1 个回答

  • Voted
  1. Best Answer
    Bill Karwin
    2025-04-20T23:38:06+08:002025-04-20T23:38:06+08:00

    我的想法是,我们将在两个地点之间建一条隧道

    我会使用 VPN。

    隧道(我假设您的意思是ssh -L)只能点对点地工作,并且只能用于一个端口。

    ssh 隧道也需要在主机上运行,​​因此如果主机重新启动或进程中断,它们就会断开。

    我知道您说过您的预算有限,但是使用 ssh 隧道会迫使您做比您预期更多的工作来监视和重新启动该隧道。

    专用[副本]服务器只会坐在那里,除非发生不好的事情,否则可能不会提供任何好处。

    是的,就是这个主意。提供灾难恢复服务似乎成本高昂。你需要冗余的基础设施,以便在主站点不可用时接管全部流量。

    也许更新我的应用程序以使用[副本]服务器来处理一些繁重的查询/报告。

    当然可以,但请记住,如果您的应用程序在德克萨斯州运行,而副本服务器在密苏里州运行,那么它们之间必然会存在一些网络延迟。德克萨斯州奥斯汀和密苏里州堪萨斯城之间的 ping 时间应该在 25 毫秒以下。这看起来可能不高,但比您的应用程序与本地网络上的源数据库之间的 <1 毫秒延迟要高得多。

    延迟会应用到应用程序与副本数据库服务器之间发送的每个数据包。由于典型的 SQL 查询涉及应用程序与数据库之间的多次往返通信,并且您的应用程序可能会针对给定的报表运行多个查询,因此延迟可能会累积起来。

    我建议您做一些计时实验来测试当您通过 WAN 运行报告时它们是否显得太慢。

    在我以前的一个工作中,我们两个数据中心之间有一条较长的 WAN 链路:位于硅谷地区和北卡罗来纳州之间。ping 时间超过 60 毫秒。偶尔会有开发人员抱怨“数据库太慢了!”,结果发现他们只是意外地对数据库或应用程序进行了故障转移,而不是同时对两者进行了故障转移。一旦他们确保活动数据库和活动应用程序位于同一个数据中心,性能问题就迎刃而解了。

    另一个考虑因素:如果您的应用依赖于在密苏里州副本数据库上运行大量查询/报告,那么当发生灾难恢复事件,所有查询突然需要在密苏里州的数据库上运行时,会发生什么?该数据库能否处理所有查询的负载?您可以暂时关闭报告功能吗?

    为了构建 mysql 集群而不是复制,向应用程序服务器添加 mysql 实例(在 docker 容器中)是一个疯狂的想法吗?

    我猜你说的是 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 小时停机成本,而不是一直管理整个冗余灾难恢复站点的成本,这完全取决于他们的判断。两种答案都可能正确,这取决于业务需求。

    • 1

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve