我遇到了一个小问题。故事如下:
我有一个文档存档系统(用PHP编写),它运行在多个客户端(目前为23个)。在他们的系统上,他们只有他们的文件。每天晚上,他们都需要“同步”到站点上的主数据库(中央服务器)。我可以从中央服务器访问每个MySQL数据库,因此连接它们没有问题。
我有一个连接到客户端数据库的脚本,从sync column ='0000-00-00 00:00:00'的表中选择所有条目(默认表示它没有同步)。然后,我将遍历每条记录,将其插入中央服务器,并将客户端数据库记录上的同步时间设置为脚本执行的时间。这有效,但显然有多个查询的开销很大,我现在才注意到这些问题。
每个客户每天最多可以生成2000 - 3000个文件。由于这些数字很大,所以时间过长(1秒/ 2档)。
我的问题有更好的解决方案吗?最好是PHP脚本解决方案,因为我需要做日志来检查一切是否成功。
由于
修改 我目前的流程是:
这是在中央服务器上运行的脚本。 现在我开始考虑它,我可以删除第7步并将其作为第5步的一部分,但这不会减少处理时间。
答案 0 :(得分:1)
我建议使用auto_increment_increment来保留所有服务器上的所有ID。然后,您需要做的只是SELECT * FROM blah WHERE sync = '0000-00-00 00:00:00'
,然后生成插入语句并执行它们。对于冲突的主键,您不必处理任何类型的冲突解决方案......
对于较长的查询时间,您需要查看数据的大小。如果每条记录都相当大(几百kb +),那就需要时间......
一个选项可能是为每个子服务器的表创建一个federated表。然后在master上用SQL做整件事。 INSERT INTO master_table SELECT * FROM child_1_table WHERE sync = '0000-00-00 00:00:00'
...您可以避免将所有数据都移到PHP中。你仍然可以运行一些检查以确保一切顺利,你仍然可以记录,因为所有东西仍然是从PHP土地执行...
答案 1 :(得分:0)
基本方法听起来不错 - 但是用0.5秒做一次操作是非常过分的 - 你在网络上拉了多少数据?整个形象?你在做什么其他的操作吗?同步列上是否有索引?
通过在数据库中导出未同步的数据,您可以获得一个小的好处:
1) mark all records available for sync with a transaction id in a new column
2) extract all records flagged in first step into a flat file
3) copy the file across the network
4) load the data into the master DB
5) if successful notify the origin server
6) origin server then sets the sync time for all records flagged with that transaction id
这将需要3个脚本 - 原始服务器上的2个(一个用于准备和发送数据,一个用于标记为完成),另一个用于复制服务器以轮询数据并通知结果。
但是如果你只复制关于图像的元数据(而不是图像本身),这可能不会对性能产生重大影响,这似乎是非常高的。
下进行。
答案 2 :(得分:0)
我知道您更喜欢基于PHP的解决方案,但您可能需要查看Microsoft Sync Framework -
http://msdn.microsoft.com/en-in/sync/default(en-us).aspx
这需要将同步模块写入.net,但在同步逻辑和异常处理(网络故障,同步冲突等)方面有巨大的优势,这将减少您的时间。
只要有.net的数据库连接器,框架也会处理非sql server数据库。应该很容易支持Mysql - 只需从以下链接中获取样本 -
http://code.msdn.microsoft.com/sync/Release/ProjectReleases.aspx?ReleaseId=4835
并将其改编为mysql。
答案 3 :(得分:0)
如果你不能使用同步框架,那么另一种可能性 -
您是否有可能在一天中分配负载,而不是一天结束?比如,每次有10个新文件进入或进行10次编辑时触发同步? (如果从客户端启动同步,则可以执行此操作)。
如果您想将同步逻辑带到服务器端,您可以考虑使用消息传递队列在客户端需要同步时从客户端向服务器发送通知。然后,服务器可以提取数据。您可以使用内部服务总线或按需平台,如azure appfabric / Amazon SQS。