5

我们正在使用 PHP 和 Symfony 框架开发一个应用程序。理想情况下,该系统将在远程服务器上运行,以便可以在任何地方在线使用。但是,也必须有离线可用性。

为此,系统将同时在远程服务器和本地服务器上运行。默认情况下,客户端将访问本地服务器,并且仅在设施外在线工作。

因此,我们需要为本地和远程数据库上的更改实现数据库同步,而无需任何类型的客户端交互。如果可能的话,它应该是一个后台运行的守护进程,同步数据库。主数据库将是本地数据库,因此它将优先处理任何冲突。

我们还没有决定要使用的数据库系统(我们正在使用 Doctrine,所以任何支持的数据库都可以),所以我们真的在寻找最适合我们场景的解决方案。

该解决方案可以是专用应用程序,无论是否商业化,只要它不需要客户端交互即可。

4

2 回答 2

3

我使用 MySQL 的同步,设置起来很简单,并且执行得完美无缺。与为您提供 UI 的 phpMyAdmin 结合使用,您可以在大约 6 次鼠标点击中立即设置它。

http://dev.mysql.com/doc/refman/5.0/en/replication.html

http://www.phpmyadmin.net/home_page/index.php

于 2011-06-17T00:11:49.807 回答
1

这实际上取决于您的应用程序。

最健壮的系统可能是具有 CouchDB 等面向对象数据库的主主环境。

有一些开箱即用的强大支持,但您也可以在应用程序端进行,这可能更灵活。

但是,此答案中描述的方法仅在您可以将修改归结为文档实体时才有效。

程序如下:

  • 每个文档都会收到一个 last_modification 时间戳。

  • 客户端在上次与服务器同步时存储时间戳。

  • 已删除的文档不会立即被删除,但会收到一个 deleted_at 时间戳

  • 当连接中断时,客户端可以继续修改本地文档

  • 当再次建立连接时,在获取最后一个同步时间戳之后发生的服务器和客户端上的所有修改。

  • 文档会双向更新。双方都修改过的文档的冲突解决是基于 lsat_modification 时间图完成的

  • 请记住,服务器和客户端上的时间可能存在小的偏移,因此您不能 100% 依赖它。需要同步。此外,您会丢失首先修改的一方所做的修改。但是,这应该是您可以在应用程序中处理的问题(例如 cvs 系统冲突)

  • 还可以选择基于文档合并和/或字段的修改时间戳

正如已经说过的,这实际上取决于您的应用程序,而更多地取决于您的数据。

您的问题也出现在软件开发中的 CVS 系统中(SVN 修订版和其他东西!)

想象一下总是执行 svn 签入,然后执行 svn 更新。如果您将数据存储在 XML 文件或类似文件中,这可能适用于您的应用程序吗?

SVN 有点老派,有一些缺点并且不太可靠,因此对于这种情况它不适合,但 GIT 可能非常有能力完成这项工作。

基于 SQL(Mysql 等)的主主复制系统也非常强大,但也很难维护,也不容易设置。

我希望这个答案很有用,因为我不太确定您的用例,但是如果您说得更详细一点,我可能会为您提供进一步的帮助。

于 2011-06-17T00:05:57.420 回答