Sql 保持独立数据库同步的策略

Sql 保持独立数据库同步的策略,sql,caching,nosql,sync,Sql,Caching,Nosql,Sync,我有一个用于数据处理的NoSQL数据库,因为它可以比SQL更快地用于我的应用程序。我将我们的NoSQL数据库视为一个信息缓存,SQL是数据的权威,NoSQL存储将随着更改而更新。现在,这是通过我们的应用程序完成的,因此当请求进行更改时,会在SQL数据库和NoSQL数据库中进行。这有时会失败,因为有时NoSQL更新会失败,或者其他情况会导致NoSQL数据库不同步 我可以每X分钟进行一次批量更新,但是数据存储中有大量信息,需要几个小时才能确保它们同步。我们有一些时间戳来区分发生了什么变化,但这并不总

我有一个用于数据处理的NoSQL数据库,因为它可以比SQL更快地用于我的应用程序。我将我们的NoSQL数据库视为一个信息缓存,SQL是数据的权威,NoSQL存储将随着更改而更新。现在,这是通过我们的应用程序完成的,因此当请求进行更改时,会在SQL数据库和NoSQL数据库中进行。这有时会失败,因为有时NoSQL更新会失败,或者其他情况会导致NoSQL数据库不同步

我可以每X分钟进行一次批量更新,但是数据存储中有大量信息,需要几个小时才能确保它们同步。我们有一些时间戳来区分发生了什么变化,但这并不总是准确的


我想知道有什么推荐的策略可以使数据存储(辅助数据库缓存)与我的主存储保持同步?

我知道我过去已经通过消息传递实现了这一点,特别是JMS和ActiveMQ。我会使用队列将更新发送到NoSQL存储(Mongo)。通过这种方式,消息可以在队列中累积,如果与NoSQL存储的连接曾经被切断,它可以从中断的地方恢复

它工作得非常好,因为ActiveMQ非常稳定,使用起来非常简单

我经常看到像你提到的那样用diff来做这个。您可以在所有位置引入日期字段,然后跟踪最新的同步。这种方法的优点在于,它可以轻松地通过修改上次同步日期来重播事务


最后一条建议。。。围绕从点A到点B(在本例中为SQL到NoSQL)泵送数据编写好的工具。在我的上一份工作中,我编写了几个工具来从SQL大容量加载NoSQL存储,如果有什么东西真的不同步,它会让生活变得轻松。在脚本和批量加载过程之间,我始终可以恢复。

您提到了日期字段,您是在消息和NoSQL实体级别这样做的吗?您是执行了有状态更新(追加)还是无状态更新(JMS消息中的整个状态)?对于日期字段,如果您的NoSQL实体较新,是否忽略了任何“较旧”的JMS消息?我正在为我的CRUD使用Web服务,您在队列中对CRUD有类似的概念吗?我们在SQL中将日期字段放在记录级别。CreateDate,UpdateDate。然后,您可以针对这些差异运行您的差异,并发布已更改/新的内容。在应用程序级别,我们将向SQL写入一个对象,然后将其序列化为JSON并通过JMS发送。对于所有对NoSQL的写入,我们都做了一些改进。这避免了必须知道什么是更新的问题。有人在CMS中写了一篇新文章。我们将其写入SQL,并发送一条JMS消息,其中对象序列化为JSON。NoSQL写操作将向上插入(如果不存在,则写入新代码;如果存在,则更新)。这有帮助吗?如果有人删除了一篇文章,那是删除了一个单独的队列,还是您使用了一个队列并且它有一个字段用于操作(添加,删除),还是您有一个队列用于添加,一个队列用于删除?实时自白:我在实施删除之前离开了工作。哈这是一个非常罕见的情况,但是的,我会实现一个单独的队列来处理删除。我喜欢把队列分开,区分开来。尝试将一个队列用于多个目的变得很困难。我同意这一点,但我担心的是,如果您让某人对同一元素进行添加,然后删除,您如何解决队列可能被无序读取的可能性?