SQL数据库同步

5
我们正在使用PHP和Symfony框架开发一个应用程序。理想情况下,该系统将在远程服务器上运行,以便可以在任何地方在线访问。但是,也必须具备离线可用性。
为此,该系统将同时在远程服务器和本地服务器上运行。默认情况下,客户端将访问本地服务器,并在设施外工作时才在线。
因此,我们需要实现数据库同步,以便在本地和远程数据库上进行的更改都不需要任何客户端交互即可同步。如果可能,它应该是在后台运行的守护进程,同步数据库。主数据库将是本地数据库,因此它将优先于任何冲突。
我们尚未决定要使用哪个DB系统(我们正在使用Doctrine,因此任何支持的DB都可以),因此我们真正寻找的是针对我们的情况具有最可用或最成熟解决方案的DB系统。
解决方案可以是专用应用程序,商业或非商业,只要不需要客户端交互即可。

3
MySQL有一项功能叫做“复制”,详情请见http://dev.mysql.com/doc/refman/5.0/en/replication.html。 - Jared Farrish
你想创建一个主/主配置吗?还是远程数据库只会成为只读从属? - datasage
另外一个问题:你需要使用关系型数据库管理系统吗? - datasage
大多数SQL引擎都支持复制。对于那些不支持的,通常可以使用rsync设置同步。您可以尝试访问http://serverfault.com进行设置。 - netcoder
你想创建一个主/主配置吗? 是的,主/主。 - Hioushi
2个回答

3

谢谢,尽管这可能看起来很明显,但我们不知道正确的术语来搜索,“复制”没有想到,取而代之的是“同步”。语言障碍起了作用,我想。 - Hioushi

1

这真的取决于你的应用程序。

最强大的系统可能是使用面向对象数据库(如CouchDB)的主主环境。

有些系统可以直接提供很好的支持,但你也可以在应用程序端进行操作,这可能更加灵活。

然而,本答案中描述的方法只适用于将修改简化为文档实体的情况。

该过程大致如下:

  • 每个文档都有一个最后修改时间戳。

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

  • 删除的文档不会立即被删除,而是会收到一个删除时间戳。

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

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

  • 文档在双向更新中得到更新。对于在两侧都被修改的文档的冲突解决是基于最后修改时间戳完成的。

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

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

正如已经提到的,这确实取决于您的应用程序,更多地取决于您的数据。

您的问题也出现在软件开发中的CVS系统中(SVN修订等!)

想象一下,总是进行svn checkin然后进行svn update。如果您将数据存储在XML文件或类似文件中,则可能适用于您的应用程序?

SVN有点老派,存在一些缺点,不太可靠,因此对于这种情况不太合适,但GIT非常能够胜任这项工作。

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

我希望这个答案对您有用,因为我不太确定您的用例,但如果您稍微详细说明一下,我可能能够帮助您进一步。


非常感谢,对应遵循的过程进行了优秀的解释。 - Hioushi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接