我的组织一直在研究如何在地理位置上传播我们的服务器,同时保持备份非常及时,并理想地分散负载。
我想到的第一件事是MySQL上的Rails。 写入率不是太高(文章/评论保持在每分钟不到1分,尽pipe有些媒体附件很大)。
所以,
我们在欧洲几个国家的数据中心之间使用复制function(所以它们彼此之间并不存在,但它们当然不是本地的),并且没有任何问题。
如有可能,复制将自动重启。 如果查询存在问题(例如,数据库存在于主服务器而不是从服务器上,并且查询使用该数据库),则默认情况下需要手动更正(但您可以将其设置为忽略此类错误)。 如果数据库是完全相同的镜像,则永远不需要手动重新启动复制。
如果你有两台服务器,主设备消失了,那么为了把从设备变成“主设备”,只需停止复制并修改你的代码(写入新的“主设备”)。 如果有三台或更多服务器并且主服务器消失,请停止从服务器上的复制,将其更改为使用新的主服务器,然后重新启动。 如果它们不完全同步(取决于传输的数据量,服务器的繁忙程度,networking连接的性能等),则可能需要做更多的工作。 MySQL文档的复制部分更详细地介绍了这一点 。
我build议你确保你正在复制SSL(即设置复制用户需要SSL连接)。
MySQL 5.1中的复制发生了显着变化。 在5.0中只使用了基于语句的复制。 您现在可以select“基于行的复制”或“基于混合的复制”。 这将极大地影响您通过WAN进行复制的方式。
如果您有能力:A)IP接pipe(如果您的服务器在地理上是分开的,则不太可能)B)进行敏捷的DNS更改您可以避免修改应用程序代码/configuration以更改主控。 我们使用内部DNS与短caching和假的。内部域。 如果需要将masterdb.internal更改为其他服务器,则在5秒钟之后更改通知。
在一个数据中心内,我们使用IP接pipe。 所有的数据库服务器都有虚拟接口(eth0:1,eth0:2,eth0:3),这些接口在启动时不会被启动。 如果其中一个奴隶需要接pipe,那么你只需要eth0:2,这是主人。 在这种情况下,eth0就是我们用来“壳”的“if”。 这些应用程序连接在eth0:1上,如果我的脚本检测到IP被占用,那么它将不会在启动时被激活。 (维基百科STONITH)其他ifs是接pipe可能需要故障的主人的IP。
在使用MySQL复制时,我不build议跨越海洋。 当奴隶在德克萨斯州时,我试图从欧洲的一位大师那里复制。 复制几乎每天都打破,直到我们放弃了这个项目。 当然,它可以工作,但是主和从之间的距离越大,它越容易变得脆弱。