0

我遇到了一个小问题。故事如下:

我有一个文档存档系统(用 PHP 编写),它在多个客户端(目前 23 个)上运行。在他们的系统上,他们只有他们的文件。每天晚上,它们都需要“同步”到现场的主数据库(中央服务器)。我可以从中央服务器访问每个 MySQL 数据库,因此连接到它们没有问题。

我有一个连接到客户端数据库的脚本,从同步列 = '0000-00-00 00:00:00' 的表中选择所有条目(默认指示它未同步)。然后,我将遍历每条记录,将其插入中央服务器,并将客户端数据库记录上的同步时间设置为脚本执行的时间。这行得通,但显然多个查询的开销很大,我现在才注意到这些问题。

每个客户每天最多可以生成 2000 - 3000 个奇怪的文档。有了这些大数字,它花费的时间太长了(1sec / 2documents)。

我的问题有更好的解决方案吗?最好是 PHP 脚本解决方案,因为我需要记录日志以检查一切是否成功。

谢谢

编辑: 我目前的流程是:

  1. 选择所有未同步的数据
  2. 开始交易
  3. 将记录插入中央数据库服务器
  4. 从客户端选择文档记录
  5. 将文档插入中央数据库服务器
  6. 更新客户端上的同步列
  7. 更新服务器上的同步列
  8. 提交事务

这是在中央服务器上运行的脚本。现在我想起来了,我可以删除第 7 步并将其作为第 5 步的一部分,但这不会大大减少处理时间。

4

4 回答 4

1

我建议使用auto_increment_increment来保持所有 id 在所有服务器上都是唯一的。然后,您需要做的就是一个SELECT * FROM blah WHERE sync = '0000-00-00 00:00:00', 然后生成插入语句并执行它们。您不必为冲突的主键处理任何类型的冲突解决...

至于较长的查询时间,您需要查看数据的大小。如果每条记录都很大(几百 kb +),那将需要时间......

一种选择可能是为每个子服务器的表创建一个联合表。然后在 master 上用 SQL 做所有的事情。 INSERT INTO master_table SELECT * FROM child_1_table WHERE sync = '0000-00-00 00:00:00'...您可以避免将所有数据拉入 PHP。您仍然可以运行一些检查以确保一切顺利,并且您仍然可以登录,因为一切仍然从 PHP 土地执行...

于 2010-08-19T11:04:35.057 回答
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 个(一个用于准备和发送数据,一个用于标记为完成)和一个在复制服务器上轮询数据并通知结果。

但这可能不会对性能产生重大影响,如果您只是复制有关图像的元数据(而不是图像本身),这似乎高得离谱。

C。

于 2010-08-19T13:13:02.570 回答
0

如果您不能使用同步框架,还有另一种可能性 -

您是否可以在一天中而不是一天结束时分配负载?比如说,每次有 10 个新文档进入或完成 10 次编辑时触发同步?(如果同步是从客户端启动的,则可以这样做)。

如果您想将同步逻辑带到服务器端,您可以考虑在客户端需要同步时使用消息队列将通知从客户端发送到服务器。然后服务器可以提取数据。为此,您可以使用内部服务总线或 azure appfabric/Amazon SQS 等按需平台。

于 2010-08-20T07:48:09.627 回答
0

我知道您更喜欢基于 PHP 的解决方案,但您可能想查看 Microsoft Sync Framework -

http://msdn.microsoft.com/en-in/sync/default(en-us).aspx

这将需要用 .net 编写同步模块,但在同步逻辑和异常处理(网络故障、同步冲突等)方面有很大的优势,这将减少您的时间。

只要有 .net 的数据库连接器,该框架也可以处理非 sql 服务器数据库。应该很容易支持 Mysql - 只需从以下链接中获取示例 -

http://code.msdn.microsoft.com/sync/Release/ProjectReleases.aspx?ReleaseId=4835

并适应mysql。

于 2010-08-19T14:27:14.373 回答