我的组织一直在研究如何在地理上分布我们的服务器,同时保持备份非常最新,并在理想情况下分散负载。
我首先想到的是 MySQL 上的 Rails。写入率不是太高(文章/评论每分钟不到 1 条,尽管有些带有大型媒体附件)。
所以,
- MySQL 复制是否在广域网中运行良好?
- 连接(或从服务器)断开是否意味着需要手动干预(一旦两台服务器可以再次相互通信)还是自动恢复?
- 如果主人消失了,从奴隶变成主人需要什么?是否有标准的脚本/工具来帮助管理它?
- 还有其他问题吗?
我的组织一直在研究如何在地理上分布我们的服务器,同时保持备份非常最新,并在理想情况下分散负载。
我首先想到的是 MySQL 上的 Rails。写入率不是太高(文章/评论每分钟不到 1 条,尽管有些带有大型媒体附件)。
所以,
我们在几个欧洲国家的数据中心之间使用复制(因此它们彼此不在世界各地,但它们肯定不是本地的)并且它可以正常工作。
如果可能,复制将自动重新启动。如果查询出现问题(例如,数据库存在于主服务器而不是从服务器,并且查询使用它),则默认情况下需要手动更正(但您可以将其设置为忽略此类错误)。如果数据库是精确的镜像,那么您永远不需要手动重新启动复制。
如果您有两台服务器并且主服务器消失了,那么要将从服务器变为“主服务器”,只需停止复制并更改您的代码(以写入新的“主服务器”)。如果您有三台或更多服务器并且主服务器消失了,则停止从服务器上的复制,将它们更改为使用新的主服务器,然后重新开始。如果它们不完全同步(取决于传输的数据量、服务器的繁忙程度、网络连接的好坏等),那么您可能需要做更多的工作。 MySQL 文档的复制部分对此进行了更详细的介绍。
我建议您确保您通过 SSL 进行复制(即将复制用户设置为需要 SSL 连接)。
MySQL 5.1 中的复制发生了巨大变化。在 5.0 中,仅使用了基于语句的复制。您现在可以选择执行基于行的复制或基于混合的复制。这将极大地影响您通过 WAN 进行复制的方式。
如果您有能力: A) IP 接管(如果您的服务器在地理上是分开的,这不太可能) B) 进行灵活的 DNS 更改 您可以避免修改应用程序代码/配置来更改主服务器。我们使用带有短缓存和假 .internal 域的内部 DNS。如果我们需要将 masterdb.internal 更改为其他服务器,则更改会在 5 秒内传播。
在单个数据中心内,我们使用 IP 接管。所有的数据库服务器都有虚拟接口(eth0:1、eth0:2、eth0:3),这些接口在启动时不是 ifup'ed。如果其中一个奴隶需要接管,你只需 ifup eth0:2 它就是主人。在这种情况下, eth0 是我们用来壳等的“if”。应用程序连接在 eth0:1 上,如果我的脚本检测到 IP 被占用,启动时不会激活该应用程序。(wikipedia STONITH) 其他 ifs 用于接管可能需要故障转移的主服务器的 IP。
我不建议在使用 MySQL 复制时跨越海洋。当奴隶在德克萨斯州时,我曾尝试从欧洲的主人那里复制。复制几乎每天都中断,直到我们放弃了这个项目。当然可以,但是主从距离越远越脆弱。