将 MySQL DB 拆分为两台服务器是个好主意吗

Cyp*_*ian 5 mysql replication aggregate

我有一个 MySQL 数据库服务器,它接受大量移动应用程序数据进行分析。我想知道出于优化原因,以下架构是否有意义且合适:

我想将 MySQL 数据库服务器拆分为两个单独的服务器,如下所示:

  • 服务器 A(主)将接收统计数据进行计算。
  • 服务器 B(主)将保留
    • 按需聚合(预先计算的数据)Master
    • 应用
    • 用户数据。

关系黑白服务器将是主-主。

  • 服务器 A -> 服务器 B:发送聚合(计算)数据
  • 服务器 B -> 服务器 A:发送新的应用程序和用户数据,以便为新跟踪的应用程序执行聚合。

如果我的推理是正确的,你能解释一下我如何准确地做到这一点吗?

Rol*_*DBA 3

选项#1:使用主/主

您只能在一种情况下使用 Master/Master:如果您写入 ServerA 上的数据库,请勿向 ServerB 发出写入,反之亦然。通过这种方式,您可以干净地拆分写入。如果您依赖于通过具有 AUTO_INCRMENT 属性的 ID 查找行,那么在 Master/Master 中拆分对同一数据库的写入可能会有点笨拙。如果您通过从服务器到服务器都不会改变的唯一键(例如社会保障号、驾驶执照、HashKey 等)查找行,则在 Master/Master 中的两个 Master 之间拆分写入同一个 DB 是没问题的。

选项#2:使用从属服务器

@DTest 已经描述了这一点,所以我不会在他的建议中添加任何额外内容(他为此获得+1)。

选项#3:在从属服务器中使用 MyISAM

当使用未用作其他服务器的主服务器的只读从服务器时,您应该对该 MySQL 实例中的数据执行两件事

  1. 将所有表转换为 MyISAM
  2. 在所有 MyISAM 表上运行 ALTER TABLE tblname ROW_FORMAT=Fixed

这应该会使读取速度提高 20%。

选项#4:使用 MySQL 5.5 进行半同步复制

MySQL 5.5之前,当一个Master有多个Slave时,SQL语句在Slave之间的处理方式是这样的(以一个Master有两个Slave为例):

SQL语句是

  • 在Master中执行
  • 记录在Master的二进制日志中
  • 传递到 Slave1 中继日志
  • 在Master中在Slave1中执行
  • 传递到 Slave2 中继日志
  • 在Slave2中Master执行

在MySQL 5.5中,当一个Master有多个Slave时,这是使用半同步复制在Slave之间处理SQL语句的方式(示例将是一个Master有两个Slave):

SQL语句是

  • 在Master中执行
  • 记录在Master的二进制日志中
  • 传递到 Slave1 中继日志
  • 由 Slave1 向 Master 确认接收
  • 传递到 Slave2 中继日志
  • 由 Slave2 向 Master 确认接收

复制更加稳健,至少 1 个从站与主站的同步更加紧密。