【问题标题】:Reset state of synced CouchDB重置同步 CouchDB 的状态
【发布时间】:2021-08-01 20:09:22
【问题描述】:

我们使用 CouchDB 和 PouchDB 在浏览器中复制远程数据库。 我们会创建 CouchDB 的备份以防万一出现问题。

在数据丢失时引入备份是没有问题的,但是将系统重置为旧状态也会影响所有同步的 PouchDB 似乎很难实现。

例如:User1User2 将本地 PouchDB 与远程 CouchDB 同步。 User1 创建一个新文档D1,它也同步到远程数据库和User2。现在User1 想要将数据库重置为D1 创建之前的状态。为此,用户删除自己的本地数据库并将远程 CouchDB 重置为之前的状态。当User1 与远程CouchDB 同步时,D1 不会在那里。但是User2 在他的本地数据库中仍然有D1,一旦它与远程数据库同步,D1 也将回到 CouchDB 并同步到User1 的本地数据库。最终系统处于与重置之前相同的状态。

对于我们的项目,要求每个用户在备份系统之前删除本地数据库是不切实际的。

一个看起来像那样的过程怎么会将这样一个分布式系统重置为旧状态。

一些额外的挑战:

  • 这个例子很简单,应该只是给出一个大致的想法。最后可能会有大量的创建、编辑和删除操作必须通过备份撤消。
  • 系统重置时,部分客户端可能处于离线状态

【问题讨论】:

    标签: synchronization couchdb backup distributed pouchdb


    【解决方案1】:

    嗯,没有简单的出路。一些选项是:

    1. 实际上不要删除数据库。相反,请调整您的恢复方法,以便删除要恢复的数据库中的所有文档,然后像备份中一样单独重新创建。您可以比较修订/使用_changes 提要过滤掉可能保持不变的文档。

    2. 在尝试同步之前以编程方式删除其他用户的本地数据库,以防恢复。

    【讨论】:

      【解决方案2】:

      我不明白为什么在删除文档时必须从以前的状态恢复数据库 - 通常已删除的数据库条目也会在其他同步客户端上被删除。

      但是我有一个非常相似的设置,我必须定期删除 CouchDB 并设置一个新的。我所做的是向每个客户端发送一个信号,触发自动删除他的本地 PouchDB 并重新连接到数据库。效果很好。

      【讨论】:

      • 也许我的例子有点简单。目标是我们希望能够将数据库和所有本地副本完全恢复到以前的状态。这并不总是像删除一些文件那样简单,但可能包括大量必须撤消的编辑、删除和创建。您的解决方案听起来很有趣,您如何处理发送信号时客户端 PouchDB 可能离线的情况?
      • 我在“服务器应用程序”设置了一个变量(我的程序工作方式有点不同)。每次客户端重新连接时,他都会请求此变量。如果它与他得到的不同,则意味着有一个新的 CouchDB,他删除了他的 PouchDB 并将新的服务器变量设置为他自己的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      相关资源
      最近更新 更多