压缩具有连续复制的CouchDB数据库安全吗?

压缩具有连续复制的CouchDB数据库安全吗?,couchdb,database-replication,Couchdb,Database Replication,我们有两个生产couchdb数据库,它们已经扩展到30GB,需要压缩。这些由24/7运营网站使用,并使用连续复制与另一台服务器进行复制 根据我所做的测试,压缩这些数据库大约需要3分钟 在生产站点和复制仍在运行时压缩复制的一侧是否安全?是的,这是完全安全的 压缩的工作原理是在内存中构造新的压缩状态,然后将新状态写入新的数据库文件并更新指针。这是因为CouchDB有一个非常严格的规则,即数据库文件的内部永远不会更新,只会附加一个fsync。这就是为什么您可以粗暴地杀死CouchDB的进程,而不必像在

我们有两个生产couchdb数据库,它们已经扩展到30GB,需要压缩。这些由24/7运营网站使用,并使用连续复制与另一台服务器进行复制

根据我所做的测试,压缩这些数据库大约需要3分钟


在生产站点和复制仍在运行时压缩复制的一侧是否安全?

是的,这是完全安全的

压缩的工作原理是在内存中构造新的压缩状态,然后将新状态写入新的数据库文件并更新指针。这是因为CouchDB有一个非常严格的规则,即数据库文件的内部永远不会更新,只会附加一个fsync。这就是为什么您可以粗暴地杀死CouchDB的进程,而不必像在其他解决方案中那样恢复或重建数据库

这意味着您需要额外的可用磁盘空间来重新写入文件。因此,试图压缩CouchDB数据库以防止磁盘满警告通常是不可能的

此外,复制使用序列树(b+树)的内部表示。replicator未将整个数据库文件从磁盘流式传输到网络管道上


最后,系统资源利用率当然会提高。然而,您的测试应该向您大致显示了与空闲CouchDB相比,这在您的系统上花费了多少,您可以使用它来确定您将系统推向崩溃点的程度;复制数据库并写入
视图
以获取数据

我看到了它的复制行为并观察到了这一点,这可以回答您的问题:

  • 在复制过程中,不会将文档的以前版本复制到目标,只复制当前版本
  • 压缩数据库只会删除以前的修订。所以它不会引起任何问题
  • 压缩将在您当前登录的数据库上完成。因此,它不应该影响其复制副本,因为复制副本正在不断地侦听其中的更改。因为它侦听的是当前修订的更改,而不是以前的修订。要验证它,您可以看到以下内容:
  • 触发此查询将显示数据库所有序列的更改。它只在最新版本更改的基础上工作,而不是以前的更改(因此我认为压实不会造成任何伤害):

    结果很简单:

    {"results":[
    
    ],
    "last_seq":0}
    
    更多信息可在此处找到:


    这可能有助于你理解它。简而言之,您的问题的答案是,在连续复制中压缩数据库是安全的。

    您的陈述“在复制过程中,以前的文档修订版不会复制到目标,只复制了当前修订版”不太正确。复制目标尚未看到的修订树的所有边缘以及目标尚未看到的有关非边缘修订的元数据。获胜的修订版(您称之为当前修订版)是树中分支最长的修订版(即,当您解决冲突时,您正在进行另一次写入以使该分支更长)。此外,您的第二点“压缩[数据库]只删除以前的修订版”需要更详细一些。非边缘修订的主体(文档)已被删除,但标题仍然存在,以便在压缩的情况下重新构建完整的序列树。对于已删除的文档也是如此;删除只是另一个带有一些特殊标志的文档写入。但在实践中,我看到复制数据库不会启用任何“previous revision”按钮,因为它没有。而且复制数据库的大小将小于原始数据库,因为它不复制修订。这是我在实践中看到的。如果有人想复制修订版,那么他必须稍微调整一下replicator的现有默认设置。@SamBisbee我给出了我的答案,以便提问者理解它。我本想包括抽象的细节,但这些都不值得。这次我们需要澄清的是复制(同步)中的问题(如果有)?我还包括了序列检查查询,这将有助于获取数据库最新seq中的更改。
    {"results":[
    
    ],
    "last_seq":0}