我们正在实施在 MySQL 上运行的新 CMS (Drupal 6.x)。我们有两个数据中心——主要的和次要的——它们之间的延迟是已知的。我们不确定我们将运行哪个版本的 MySQL ......无论是社区版还是企业版,但这是一个待定。看起来我们将运行 InnoDB 引擎,操作系统将是 RedHat EL 5.5 主服务器将处于活动状态,而辅助服务器将是被动或热备用。
我想在 MySQL 中跨两个数据中心实现复制、高可用性和自动故障转移。
在故障转移到辅助服务器后,当我们故障恢复到主服务器时,我们希望将数据从辅助数据库快速完整地同步到主数据库,以便我们可以继续提供来自主服务器的内容。
我有兴趣了解可以使用哪些技术/工具/最佳实践来解决/解决这些问题。此外,任何陷阱或啊哈时刻也将不胜感激。我已经阅读了 MySQL 复制、集群以及 Tungsten 和 Dolphinics 等一些 3rd 方工具,但我不确定什么是最好的行动方案。
感谢您的时间!
公里
为了简单起见,我只推荐 MySQL 循环复制。原因如下:
有许多技术和拓扑远远优于 MySQL 循环复制。我最喜欢的是DRBD(分布式复制块设备)。但是,当服务器对位于同一建筑物、数据中心和机架中时,DRBD 工作得很好。在 DRBD Primary 和 DRBD Secondary 之间的 192.168.xx 子网中使用交叉电缆会更好。不幸的是,尽管 DRBD 仍然可以工作,但 DRBD 在两个位置之间的距离上性能很差。周围没有网络拓扑可以为您提供两个数据中心之间所需的令人满意的 DRBD 性能。
在两个不同数据中心的两个数据库服务器之间设置 MySQL 循环复制后,唯一需要的调整就是网络。本质上,复制性能是网络设置(MySQL Replication Setup 中二进制日志传输的速度/延迟)和磁盘 I/O (DRBD) 的函数。
例如,您可能希望获得更好的冗余的替代方法如下:
在两个位置设置一个 DRBD 对
站点 #1 中的
DRBD 对与 VIP 111.111.111.111 站点#2 中的 DRBD 对与 VIP 222.222.222.222
在以下条件下在 DRBD 主服务器之间设置 MySQL 循环复制:
对于站点 #1,使用 222.222.222.222 作为 MySQL 中的 Master_Host
对于站点 #2,使用 111.111.111.111 作为 MySQL 中的 Master_Host
尽管引入了一定程度的复杂性,但现在您有两个级别的冗余:每个站点内的 DRBD 和站点之间的 MySQL 循环复制。您还可以通过 mysqldump 在热备用服务器的 DRBD 主服务器上运行备份。
至于故障转移,DRBD 在任何一个站点都提供自动故障转移。
只有在数据中心完全不可用的情况下,您才会在热备用站点使用 DB VIP。
更新
我只是仔细看了一遍,发现您使用的是 Drupal6。我很高兴您将所有的 drupal 表都转换为 InnoDB。这将消除 MyISAM 表更新导致表锁冻结仅读取 MyISAM 表的数据库连接的任何机会。针对 MyISAM 表的任何 DML 更新(插入、更新、删除)将始终执行全表锁定!使用 InnoDB 将引入行级锁定,从而消除全表锁定。
此外,当一切都是 InnoDB 时,DRBD 成为您的朋友,因为崩溃恢复将在 DRBD Pair 之间保持一致。相反,带有 MyISAM 的 DRBD 对您没有任何好处,因为 DRBD 主节点上的崩溃 MyISAM 表只是简单地复制到 DRBD 辅助节点,正如您猜到的那样,崩溃的 MyISAM 表。
更新#2
您应该使用两个级别的冗余
级别 1:在每个数据库中心,使用 DRBD。
http://dev.mysql.com/doc/refman/5.1/en/ha-drbd.html
在 DRBD Primary 上设置一对 DB Servers
Startup DRBD Startup MySQL
这会在磁盘级别创建冗余数据。
级别 2:您应该在 DataCenter#1 的 DRBD Primary 和 DataCenter#2 的 DRBD Primary之间设置 MySQL 循环复制
每个 DRBD 主节点都将运行 MySQL,并将
作为彼此的主从节点
我已经为这样的客户端拓扑设置了,我认为它非常稳定。