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