Couchbase文档说“磁盘持久性使您能够执行备份和还原操作,并使您能够扩展比内置缓存层更大的数据集”,但我似乎无法使其工作。
我正在三节点集群上测试Couchbase 2.5.1,为存储桶配置了总共56.4GB的内存。在大约124,000,000个100字节对象之后 - 大约12GB的原始数据 - it stops accepting additional puts。已配置1个副本。
是否有一个魔法“继续前进并溢出到磁盘”开关,我错过了?错误日志中没有可疑条目。
答案 0 :(得分:2)
它支持的数据大于内存 - 请参阅手册中的Ejection and working set management。
在您的实例中,您从应用程序中获得了哪些错误?当您开始达到内存不足的水印时,需要从内存中弹出项目,以便为较新的项目腾出空间。
根据磁盘速度/传入项的速率,这可能导致TEMP_OOM
错误被发送回客户端 - 告诉它需要在执行集合之前暂时退出,但这些通常很少见大多数情况。有关处理这些内容的详细信息,请参阅Developer Guide。
答案 1 :(得分:1)
我的猜测是,它不是填满你记忆的原始数据,而是与之相关的元数据。 Couchbase 2.5每个密钥需要56个字节,因此在您的情况下,大约需要7GB的元数据,远远少于您的内存配额。
但是......元数据可以在内存上分段。如果您在很短的时间内批量插入所有124M对象,我会假设您至少有90%的碎片。这意味着只有7GB的有用元数据,保存它所需的空间填满了你的RAM,每个分配的块中有很多未使用的部分。
您的问题的解决方案是对数据进行碎片整理。它既可以手动实现,也可以根据需要触发:
如果您需要有关为何需要压缩的更多见解,请阅读this blog article from Couchbase。
答案 2 :(得分:0)
即使您的文档都没有存储在RAM中,CouchBase仍会将所有文档ID和元数据存储在内存中(这将在版本3中更改),并且还需要一些可用内存才能高效运行。文档中的相关部分: http://docs.couchbase.com/couchbase-manual-2.5/cb-admin/#memory-quota
请注意,使用副本时,需要两倍的RAM。公式大致如下:
(56 + avg_size_of_your_doc_ID)* nb_docs * 2(副本)*(1 +净空)/(high_water_mark)
因此,根据您的配置,124,000,000个文档很可能需要56 Gb内存。