数据库复制:具有本地数据库的多个地理位置,一个主远程数据库

时间:2014-01-23 12:20:16

标签: mysql database replication cluster-computing

我有一个非常具体的用例,因为我不太熟悉数据库复制,所以我愿意接受有关如何以最佳方式完成以下任务的建议和想法:

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

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

主要问题:远程服务器可能不可用或其中一个位置的互联网连接可能无法正常工作,导致远程应用程序不可用;但我们希望应用程序即使在远程服务器关闭或出现互联网连接问题时也能作为高可用性解决方案(现场)工作。

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

到目前为止一直很好......(至少我相信如此?)

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

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

但是......读写支持怎么样?我想在这种情况下我们需要多主复制,但我担心使用像(例如)MySQL Cluster或Galera这样的东西进行同步复制会减慢速度,特别是因为L1,L2和L3处于较低带宽连接上。它们通过WAN连接。 (此外,L1,L2或L3可能并不总是在线。)

真正的问题:您如何处理这个特定用例?目前,我倾向于多主复制,如果它不会减慢太多的速度。应用程序本身主要由现场员工使用,但也由WAN上的一些外部人员使用。多主复制会很好吗?如果例如L1停机24小时然后突然重新上线怎么办?如果无法访问R怎么办?

EXTRA:不是我的主要问题,但我还需要通过SSL安全地发送同步数据,如果可能的话,请考虑到这一点来解答。

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

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

1 个答案:

答案 0 :(得分:0)

由于您尚未决定,我强烈建议您查看MS-SQL 合并复制。它强大,高度可靠,通过局域网和HTTPS进行复制(所谓的 Web复制),并不是那么昂贵。

术语与mySql Master \ Slave的想法不同。我们在这里谈论一个发布者和多个订阅者。在订阅者级别完成的所有更改都将被收集并发送给发布者,然后重新分发给所有订阅者(如果需要,还可以使用“过滤订阅”等精彩选项)。

标准架构将是:

  • 发布者,位于服务器上的某个位置,用于收集和重新分配订阅者之间的更改。最终用户可能无法访问Publisher。
  • 其他数据库订阅者服务器,用于本地或Web访问,与发布者一起复制。最终用户可以访问订阅者。

我们多年来一直在使用这种架构,包括:

  • 一位网络用户
  • 一个内部网访问用户
  • 当地访问的数十名订阅者:一些订阅者正在我们的建设项目中,在沙漠中的某个地方....

这种架构不能通过MySQL“从架子上”获得。我想它可以构建,但它肯定比购买相应的MS-SQL许可证贵很多。不要忘记免费的SQLEXPRESS版本的MS-SQL可以是订阅者。

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