2014-01-23 58 views
1

我有一个非常具体的用例,因为我对数据库复制不太熟悉,所以我很乐意提供有关如何完成遵循最佳方式:数据库复制:具有本地数据库的多个地理位置,一个主远程数据库

  • Web应用程序+数据库正在远程服务器上运行。让我们把这个设置R称为远程。

  • 现在假设有3个独立的地理位置需要对数据库进行读写访问。我会将这些位置称为L1,L2和L3。

的主要问题:远程服务器可能不可用或位置可能并不总是有效,使远程应用程序不可用的一个互联网连接;但我们希望应用程序能够作为高可用性解决方案(现场)工作,即使在远程服务器关闭或互联网连接出现问题时也是如此。

部分解决方案:所以我想为每个地理位置提供一个本地的Web应用程序副本服务器。 Web应用程序本身可以在需要时从版本控制系统自动更新(例如使用git钩子)。

到目前为止好......(至少我这么认为?)

但对于我们的数据?真的很棘手的部分似乎是数据库复制。我们假设没有DNS或IP故障转移,并假设用户首先尝试直接访问远程服务器,如果这不起作用,用户仍可以使用本地服务器而不是现场服务器。这一切都发生在网络浏览器(或类似的客户端)内。

一种可能(但不令人满意)的解决方案是使用从R(主站)到L1,L2和L3(从站)的主从复制。当这样做异步这应该是相当快?我认为当主服务器损坏或无法访问时,这是临时本地只读数据库访问的可行解决方案。

但是......读写支持怎么样?我想在这种情况下我们需要多主复制,但恐怕使用像MySQL Cluster或Galera之类的东西进行同步复制会减慢速度,尤其是因为L1,L2和L3使用较低的带宽连接。他们通过广域网连接。 (另外,L1,L2或L3可能并不总是在线。)

真正的问题:您将如何解决这个特定的用例?目前我倾向于多主复制,如果它不会减慢太多事情。应用程序本身将主要由现场员工使用,但也由一些外部人员通过WAN使用。多主复制能够很好地工作吗?如果例如L1下降24小时并突然回到在线状态呢?如果R无法访问,该怎么办?

附加:不是我的主要问题,但我也需要通过SSL安全地发送同步数据,如果可能的话,请考虑到您的答案。

也许我还忘记了一些必要的细节;如果是这样,请回复一些反馈,我会尽力相应地更新我的问题。

请注意,我还没有确定数据库,数据库模式将从头开始开发,因此也欢迎使用其他数据库或数据库引擎的想法。 (目前我对MySQL和PostgreSQL有最丰富的经验)

回答

0

由于你还没有确定,我强烈建议你看一下MS-SQL 合并复制。它强大,高度可靠,通过局域网和HTTPS(所谓的网络复制)进行复制,而不是那么昂贵。

术语不同于mySql Master \ Slave的想法。我们在这里讨论一个发布者和多个订阅者。在订户级别完成的所有更改都会收集并发送给发布商,然后再重新分配给所有订户(如果需要,还可以选择诸如“过滤订阅”之类的奇特选项)。然后

标准架构将是:

  • 出版商,某处的服务器,它收集并重新分配用户之间的变化上。发布商可能不会被最终用户访问。
  • 其他数据库订户服务器,用于本地或网络访问,与发布者复制。订户被最终用户访问。

我们一直在使用这个架构里,包括:

互联网接入
  • 一个用户
  • 一个用户的内网接入用户进行本地访问的
  • 几十:一些用户都在我们的建筑项目,在沙漠中的某个地方......

这样的架构不可用“from the s helf“与MySQL。我想它可能会被构建,但它肯定比购买相应的MS-SQL许可证要昂贵得多。不要忘记,MS-SQL的免费SQLEXPRESS版本可以成为用户。

小心:如果您打算通过这样的配置,我会(真的)强烈建议您将所有主键设置为uniqueIdentifier数据类型,并随机生成。这将避免典型的复制陷阱,其中PK的自动增量设置为int,独立服务器在两次复制之间生成相同的主键(MS-SQL提出了一种避免此类问题的工具,您可以在其中分配每个服务器的PK范围,但这个解决方案是一个真正的PITA ...)。

相关问题