我面临如下挑战:
我有很多位于不同地理位置的数据库,网络连接可能会经常失败(我使用蜂窝网络)。我需要让所有数据库保持同步,但没有必要实时同步。我正在使用 Java 编程语言,但我可以自由选择任何一个免费的数据库。
我该如何实现这一目标?
我面临如下挑战:
我有很多位于不同地理位置的数据库,网络连接可能会经常失败(我使用蜂窝网络)。我需要让所有数据库保持同步,但没有必要实时同步。我正在使用 Java 编程语言,但我可以自由选择任何一个免费的数据库。
我该如何实现这一目标?
这是一个已经有相当多研究成果的问题(但人们显然不知道)。我建议不要重复发明一个质量差、有缺陷的轮子,除非绝对必要(例如,为了允许一个简单解决方案而有非常特殊的需求)。
一些关键词:复制、移动数据库管理系统、分布式断开连接的数据库管理系统。
同时,以下研究论文与此研究领域相关(作为示例):
......等等。
我不知道是否有任何数据库可以为您提供这个功能;由于需要最终一致性和冲突解决(例如,如果网络分成两半并且您将某些内容更新为值123,而我在另一半上将其更新为值321,然后网络重新连接会发生什么?),这里存在很多复杂性。
您可能需要自己开发。
关于如何实现此功能的一些想法,请参考Yahoo的PNUTS系统的设计:http://research.yahoo.com/node/2304 和Amazon的Dynamo:http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html
请查看SymmetricDS。 SymmetricDS是基于web、独立于数据库的数据同步/复制软件。它使用web和数据库技术在接近实时的条件下,将表格在关系数据库之间复制。该软件旨在针对大量数据库进行扩展,在低带宽连接下工作,并经受网络中断期间的考验。
我不知道你的需求或应用程序,但这不是一个快速回答的问题。我非常想知道别人有什么说法。然而,我有一个建议,可能适合你,也可能不适合,这取决于你的要求和情况。特别是,如果你的用户需要在网络不可用时(离线访问),这将无济于事。
保持一堆小型数据库同步是一个相当复杂的任务,需要正确地完成。是否有可能只有一个集中式数据库,并让客户端应用程序直接连接到它,或者(我更喜欢的解决方案)编写一些Web服务来处理访问/更新数据,而不是拥有一堆客户端数据库?
我意识到这限制了离线访问,但是有各种缓存策略可以使用。(当然,这会让你回到最初的问题。)