为许多站点使用中央数据库服务器:看似合理吗?

时间:2011-01-28 18:07:22

标签: php mysql synchronization

基本上,我需要在几十个站点上同步数据库数据的某些部分。完美的解决方案是创建一个中央服务器来托管这些数据。

每个页面加载都必须从两个数据库服务器获取数据 - 本地和远程服务器,并且写入远程服务器也很常见。

虽然数据库服务器的硬件速度可以达到所需的速度,但我仍然对瓶颈问题持谨慎态度:

  • 必须在每个页面加载上建立多个数据库连接。
  • 信号在两个物理位置之间传播的延迟。

我有权担心吗?将数据库与cronjobs或其他技术同步会更明智吗?


除了分配奖金之外,我还要提出一个问题,希望有真实生活经验的专家出现:

还有哪些其他技术(除了cron)来同步MySql数据库?

8 个答案:

答案 0 :(得分:2)

这个问题实际上取决于您的情况,我相信您已经确定了中央数据库解决方案的两个主要问题 - 所以是的,您是正确的。

个人选择使用cron(或您选择的任何方法)将数据同步到服务器 - 减少硬件成本和页面加载时间。这对我来说是更技术性的解决方案,但就其优势而言(更快的页面加载时间,不依赖于中央数据库,降低成本)是正确的解决方案。

或者,您可以随时在远程服务器上设置一个小型MySQL数据库,并创建一些测试网站并运行一些基准测试,这可以为您提供一些数据,说明您是否对加载时间感到满意。

答案 1 :(得分:2)

MySQL复制肯定是要走的路。拥有单个数据库服务器的问题是,如果负载过高,您的所有站点都将关闭。您希望尽可能地分散负载,因为如果服务器出现故障或变得过载,那么这就是最重要的问题。

处理复制时要记住的一些事项

  • 您需要至少2个(最好是3个或更多,1个主服务器和2个从服务器)数据库服务器。
  • 您永远不会写入您的从属服务器。所有写入操作都将转到主服务器,该复制将很快同步服务器。
  • 您总是从从属服务器读取(除非您需要保证您拥有最新的数据)。通过分离服务器之间的读写操作,可以显着提高性能。

投入负载均衡服务器,数据库负载问题就会消失!

答案 2 :(得分:1)

谷歌解决这个问题的方式(你得到一些信息here。对不起,我没有实际发表的论文链接描述它)或多或少是通过一系列的触发器

有一个(并且一个,我的意思是数千个)中央数据中心和一系列克隆。每次需要写入时,都会请求集线器锁定,对克隆执行写入操作,然后将更改转发到集线器(从而释放锁定)。然后,集线器将数据推送到所有其他克隆。

这意味着读访问几乎可以保持即时(每个站点实例都有一个本地化克隆)。本地写访问也很快。其他所有内容都可以异步处理,这样两个服务器只需要在写入开始之前传递锁定请求和锁定接收消息,并且可以在用户移动之后进行推送。

这可能是 tad 非常符合您的需求,但Google就是这样做的。

答案 3 :(得分:1)

首先警告,你要做的事情并不容易;虽然MySQL支持主/从复制,你可以在各种级别的层级中运行多个主站和从站,你真正需要考虑的是“我如何从数据库服务器故障中恢复” - 你是否提升了一个奴隶?一致性如何(因为它保证了从服务器之间的复制失败)?您还需要考虑架构修改;只要你在所有服务器上拥有相同的模式,每件事情都很好,但是只要你需要推动需要同时进行数据库更改的代码更新,你就不能依赖于已经发布到复制的模式更改。

好的,警告,你怎么做?最简单的方法是启动最新版本的PhpMyAdmin,它允许您非常快速,轻松地配置复制。在此之前,请确保在所有MySql服务器中都启用了二进制日志记录,因为这将是您的崩溃恢复救星; http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

您的服务器站点位置是下一个重要问题。如果您的用户不是地理位置分散且查询负载很低,您可以将它们全部托管在同一数据仓库中的专用网络之后。主从复制将在任何情况下提供大的性能提升,因为所有数据库读取都应该针对从设备进行,并且只针对主设备执行写入。

如果您需要进行地理定位,以便它们不能全部存储在同一个数据仓库中,那么事情会变得更加困难;你现在有潜力可以应对。在这种情况下,由于互联网不是即时的,因此对主设备的写入将花费时间传播到从设备。因此,在写入后很快发生的任何选择查询可能都不会返回新数据,因为它还没有被复制到从属数据库。这被称为“最终一致性”,一旦你认识到它将要发生并且代码期望它就相对容易克服 - 即从不假设数据存在。

我不可能在这个网站上以任何真正的正义回答你的问题。你最好的选择是读一本书,我强烈推荐这本书;

MySQL高可用性 - ISBN-13:978-0-596-80730-6

答案 4 :(得分:1)

任何暗示脱机同步的方法都会浪费mysql复制的好处

(鉴于你提到的情况不明确)
您的解决方案可以像单独保持READ / WRITE一样简单

这意味着本地数据库,

  1. 确保仅对您要从集中式数据库同步的数据库启用本地读取
  2. 写操作是提交到集中式数据库(而不是本地数据库)
  3. 集中数据库将比将更新复制到所有本地数据库
  4. <强>问题

    1. 由于网络延迟导致的复制延迟
    2. <强>益

      1. 数据完整性,因为写入操作只能集中服务器并使用复制将更改复制到各种本地数据库
      2. 本地数据库可以允许单独的写操作(另一组数据/数据库)
      3. 从本地数据库读取比集中式数据库快得多(考虑读取操作比写入操作更频繁)

答案 5 :(得分:1)

我对此的快速回答是使用像Gearman这样的作业队列系统来卸载同步工作。这样,它不会影响页面加载或用户体验。您只需创建一个Gearman作业,它就会将作业发送到Gearman队列并尽可能地完成。

对于使用cron来说,这似乎也是一个更好,更快速的解决方案。因为这会立即将作业添加到队列中,并且几乎立即处理它。既然你似乎只想复制选择数据,我也不会看到MySQL Replication如何提供很多帮助。

之前我曾与Gearman合作过(即使使用PHP),当页面加载不需要等待该作业完成时,这是一个很好的解决方案,可以将工作分解到其他地方完成。

虽然这看起来并不简单,但由于你确实需要设置和学习Gearman,但它是一个非常方便的工具。

希望这有帮助!

答案 6 :(得分:0)

我想知道您是否使用SQL Server作为后端或其他东西。我很确定使用SQL,您可以使用SQL Replication http://technet.microsoft.com/en-us/library/ms151198.aspx来实现所需的目标。此时,本地应用程序将访问自己的SQL实例,而每个sql实例将与主DB服务器“复制”并“同步”其数据。最终结果是您的中央数据库将始终是最新的,并且具有来自每个卫星SQL服务器的聚合数据。 (虽然请不要引用我这个...我不是SQL专家。)

(对不起,我刚刚意识到你正在使用PHP / MySQL ......并且可能更喜欢开源......但是,我认为这值得研究。)

答案 7 :(得分:0)

我在客户端 - 服务器php应用程序之间进行了一些数据库同步,并使用了以下想法http://vitana-group.com/article/php/data-synchronization