我最近开始使用Couchbase。如上所述here Couchbase是仅附加数据库。据我所知,这意味着我的更新文档附在Couchbase的B + -tree上。或者它实际上是否取代了原始文件?
如果附加了更新的文档,原始文档会发生什么?是仅仅是持久存在还是会在某些时候通过自动压缩删除?
答案 0 :(得分:1)
Couchbase可以配置为将更新作为原子事务处理。在Couchbase的土地上,必须考虑Couchbase存储文件的两种方法:内存和磁盘。
我怀疑您的问题是在更新后Couchbase如何将文档存储在磁盘的背景下进行的。
文档发生变异后,Couchbase首先在内存中提供新变异的文档,供其他读者查看,然后最终将其保存到磁盘。顺便说一句,后者也可以配置为原子。
每个文档突变都会生成一个与更新文档关联的新CAS值。将两个CAS值视为文档的两个版本的唯一标识符:先前和当前。两者都作为两个单独的文档存储在内存和磁盘上。
因此,Couchbase不会重写存储早期版本文档的磁盘块,而是将新文档作为完全独立的文档存储在磁盘上。顺便提一下,Couchbase通过确定写入最后一个文档的位置并在其后立即将新文档写入磁盘来选择磁盘上的位置。
垃圾收集或Couchbase引用的压缩最终将停止并查找已过期的旧文档并将其弹出仅保留最新版本。此外,压缩过程将填补磁盘上的空白,试图保持连续的存储空间。
这些都是可配置的,可选择更像原子,但是当你有一个用例,最终的一致性是可以接受时,架构真的很闪耀。
这里提供了有关如何在应用程序层处理并发文档突变的参考,但在解释CAS值如何工作方面做得非常好:https://developer.couchbase.com/documentation/server/current/sdk/concurrent-mutations-cluster.html