在线和离线同步

时间:2015-02-26 08:38:12

标签: php mysql

我正在开发一个由于互联网不稳定而同步在线和离线功能的项目。我想出了一个可能的解决方案。这是为在线和离线创建2个类似的数据库并同步这两个数据库。我的问题是,这是一个好方法吗?还是有更好的选择?

我已就此主题进行过网上研究,但我还没有发现任何实质性问题。我发现一个有用的链接是数据库复制。但我希望离线版本能够检测互联网的存在并进行相应的同步。

请你帮我找到解决问题的方法或线索

3 个答案:

答案 0 :(得分:2)

A 计划:Primary-Primary 复制(以前称为 Master-Master)。您确实需要小心 PRIMARY KEYsUNIQUE 键。当“另一台”机器离线时,您可以将冲突的值写入表中。稍后,当他们尝试同步时,复制将冻结,需要手动干预。 (不是一个漂亮的景象。)

计划 B:将更改写入数据库以外的某些存储。这与计划 A 存在相同的缺点,而且您需要编写大量代码来实现它。

计划 C:具有 3 个节点的 Galera 集群。当所有 3 个节点都启动时,所有节点都可以进行写入。如果一个节点出现故障,或网络问题使其对另外两个节点看起来离线,它将自动变为只读。问题解决后,同步会自动完成。

计划 D:只写入可靠的主节点;让另一个成为只读副本。 (但这违反了您对“互联网不稳定”的要求。)

这些都不完全符合要求。 A计划似乎是唯一有机会的。让我们看看那个。

如果您在任何表中有任何 UNIQUE 键并且您可能会向其中插入新行,则问题存在。即使像“规范化表”这样无害的东西,在其中插入 name 并取回 id 以在其他表中使用,也存在问题。您可能会在具有相同 name 的两台服务器上执行此操作并获得不同的 ids。现在您遇到了几乎无法修复的烂摊子。

答案 1 :(得分:0)

我建议你有一个用于同步的在线存储和一个本地数据库(浏览器indexeddb,程序sqllite或类似的东西),并记录你本地数据库中的所有更改,但记录了最后输入的数据同步。

当您有连接时,您可以按设定的时间间隔将所有新数据与在线存储同步(例如,如果您有带宽/ CPU容量,则每5分钟一次或恒定流)

当用户从" fresh"在线数据库将所有数据推送到使用数据填充本地数据库的客户端,然后恢复正常的同步功能。

答案 2 :(得分:0)

不确定它是否超出了项目范围,但您可以尝试这些:

https://pouchdb.com/

https://couchdb.apache.org/

" PouchDB 是一个受 Apache CouchDB 启发的开源 JavaScript 数据库,旨在在浏览器中良好运行。

PouchDB 的创建是为了帮助 Web 开发人员构建离线工作和在线工作一样好的应用程序。 它使应用程序能够在离线时将数据存储在本地,然后在应用程序重新上线时将其与 CouchDB 和兼容服务器同步,无论用户下次登录何处,都可以保持用户的数据同步。 "