Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 对许多站点使用中央数据库服务器:合理吗?_Php_Mysql_Synchronization - Fatal编程技术网

Php 对许多站点使用中央数据库服务器:合理吗?

Php 对许多站点使用中央数据库服务器:合理吗?,php,mysql,synchronization,Php,Mysql,Synchronization,基本上,我需要在多达几十个站点上同步数据库数据的某些部分。完美的解决方案是创建一个中央服务器来承载这些数据 每个页面加载都必须从两个数据库服务器(本地和远程服务器)获取数据,对远程服务器的写入也很常见 虽然db服务器在硬件方面可以达到所需的速度,但我对瓶颈持谨慎态度: 必须在每个页面加载上建立多个数据库连接 信号在两个物理位置之间传输的延迟 我担心对吗?将数据库与cronjobs或其他技术同步是否更明智 除了分配赏金,我还希望有一位具有这方面实际经验的专家出现: 除了cron,还有什么其他

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

每个页面加载都必须从两个数据库服务器(本地和远程服务器)获取数据,对远程服务器的写入也很常见

虽然db服务器在硬件方面可以达到所需的速度,但我对瓶颈持谨慎态度:

  • 必须在每个页面加载上建立多个数据库连接
  • 信号在两个物理位置之间传输的延迟
我担心对吗?将数据库与cronjobs或其他技术同步是否更明智


除了分配赏金,我还希望有一位具有这方面实际经验的专家出现:


除了cron,还有什么其他技术可以同步MySql数据库?这个问题实际上取决于您的情况,我相信您已经确定了central DB解决方案的两个主要问题-因此,您的担心是对的

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


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

我想知道您是否使用SQL server作为后端或其他什么。我非常确信,使用SQL,您可以使用SQL复制来实现所需的目标。此时,您的本地应用程序将访问它们自己的SQL实例,而每个SQL实例将与主DB服务器“复制”并“同步”其数据。最终结果是,您的中央数据库将始终是最新的,并具有来自每个卫星SQL server的聚合数据。(尽管在这一点上请不要引用我的话……我不是SQL专家。)


(很抱歉,我刚刚意识到您正在使用PHP/MySQL…并且可能喜欢开源…但是,我认为这是值得研究的。)

MySQL复制绝对是一条可行之路。使用单一数据库服务器的问题在于,如果负载过高,所有站点都将停机。您希望尽可能分散负载,因为如果服务器出现故障或过载,这将是一个大问题

在处理复制时需要记住的一些事情

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

加入负载平衡服务器,您的数据库负载问题就会消失

谷歌解决这个问题的方式(你得到了一些信息。很抱歉,我没有到描述它的实际发表论文的链接)或多或少是通过一系列触发因素实现的

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

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


这可能有点满足你的需要,但谷歌就是这样做的。

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

好了,警告结束了,你怎么做?最简单的方法是启动最新版本的PhpMyAdmin,它允许您非常快速、轻松地配置复制。在此之前,请确保在所有MySql服务器中都启用了二进制日志记录,因为这将是您的崩溃恢复救星

下一个大问题是服务器的位置。如果您的用户在地理上不分散,并且查询负载较低,那么您可能可以在同一数据仓库中的专用网络后面托管它们。在任何情况下,主从复制都会给您带来很大的性能提升,因为所有数据库读取都应该针对从机进行,而只针对主机执行写入

如果您需要地理定位,使它们不能全部存储在同一个数据仓库中,那么事情就变得有点困难;您现在需要处理延迟问题。在这种情况下,由于互联网不是即时的,对主机的写入将需要时间传播到从机。因此,任何在