SQL数据库同步


SQL Database synchronization

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

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

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

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

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

我使用MySQL的同步,这是一个快速设置,并且执行得非常完美。结合phpMyAdmin,它为您提供了一个可使用的UI,您可以在大约6次鼠标点击中开箱即用地设置它。

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

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

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

最健壮的系统可能是具有面向对象数据库(如CouchDB)的master环境。

有些功能提供了开箱即用的强大支持,但您也可以在应用程序端这样做,这可能更灵活。

然而,只有当您能够将修改归结为文档实体时,这个答案中描述的方法才能很好地工作。

程序如下:

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

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

  • 删除的文档不会立即被删除,但会在时间戳处收到删除

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

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

  • 文档双向更新。基于lsat_modification timetmap 对双方修改的文档进行冲突解决

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

  • 此外,文件合并和/或基于字段的修改时间戳可能是的一种选择

如前所述,这实际上取决于您的应用程序,更多地取决于数据。

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

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

SVN有点老派,有一些缺点,而且不太可靠,所以在这种情况下它不合适,但GIT可能非常有能力完成这项工作。

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

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