Couchbase 3.1.0 - 执行完全备份时出现内存不足错误

时间:2015-10-05 12:52:22

标签: backup couchbase

我们最近迁移到Couchbase 3.1.0。奇怪的是 - 当执行存储桶的完整备份时,Web UI会发出警报并且“内存不足”出现错误。节点Y上的Bucket X已满。分配给此存储桶的所有内存都用于元数据"。 Web UI中RAM使用的数字与之相反 - 使用了大约75%,但不是100%。我查看了日志,但没有发现任何类似的错误 这是否正常?

2 个答案:

答案 0 :(得分:1)

这是Couchbase Server 3.x版本中的已知问题。

要理解这个问题,我们还必须首先了解数据库变更协议(DCP),这是用于在整个系统中传输数据的协议。在高水平上,DCP的流量控制如下:

  1. Consumer与Producer建立连接并发送Open Connection消息。消费者然后发送控制消息以指示每个流的流量控制。此消息将在键部分中包含“stream_buffer_size”以及消费者希望每个流在值部分中具有的缓冲区大小。
  2. 然后,消费者将开始打开流,以便可以从服务器接收数据。
  3. 然后,Producer将继续为具有可用缓冲区空间的流发送数据,直到达到最大发送大小。
  4. 步骤1-3继续,直到连接关闭,因为Consumer继续使用流中的项目。
  5. cbbackup实用程序不实现任何流控制(数据缓冲区限制),但它会尝试同时从所有节点流式传输所有vbucket,缓冲区大小没有上限。 虽然这并不意味着它将使用与总体数据大小相同的内存量(因为cbbackup进程缓慢地耗尽了流),但它确实意味着需要大量内存开销才能存储数据流。 当您处于繁重的DGM(磁盘大于内存)情况时,存储流所需的内存量可能比cbbackup可以消耗它们的速度更快,因为它会从磁盘上传输大量数据,导致非常大流,如前所述占用大量内存。

    显示有关占用所有内存的元数据的轻微误导消息,因为没有剩余的数据存储空间,因此所有剩余的内存都分配给元数据,当使用值驱逐时,无法从内存中弹出。

    这仅影响4.0之前的Couchbase Server版本的原因是,在4.0中,对DCP流管理进行了服务器端改进,允许暂停DCP流以减少内存占用,这被跟踪为{{ 3}}。 因此,您不应在Couchbase Server 4.x +版本上遇到相同的问题,无论您的存储桶是如何使用DGM。

    解决方法

    如果您发现自己处于发生此问题的情况,则终止备份作业应立即释放流所占用的所有内存。 不幸的是,如果您已经将大部分数据从备份中驱逐出内存,那么您将不得不在一小段时间内从磁盘而不是RAM中检索大量数据,这可能会增加您的数据得到延迟。 随着时间的推移,“热”数据将在请求时被带入内存,因此这只会在一段时间内出现问题,但这仍然是一个非常不合适的情况。

    完全避免此问题的解决方法是在执行备份时仅一次流式传输少量vbucket,而不是默认情况下cbbackup执行的所有vbuckets。

    这可以使用cbbackupwrapper来实现,cbbackupwrapper与所有Couchbase Server 3.1.0及更高版本捆绑在一起,使用-n的详细信息可以在MB-12179中找到。 特别要注意的参数是cbbackupwrapper标志,它指定一次批量备份的vbucket的数量。 顾名思义,cbbackup只是-n之上的包装脚本,它将vbuckets分区并自动处理所有目录创建和备份生成,同时仍然使用cbbackup。 例如,批量大小为50,cbbackupwrapper将首先备份vbuckets 0-49,然后是50-99,然后是100-149等。

    建议您在一个镜像生产环境的测试环境中使用cbbackupwrapper进行测试,以便为-P-n找到合适的值(它控制一次运行多少个备份进程,组合这两个中控制了备份引起的内存压力以及整体速度。 您不应该发现将-P的值从默认值100降低会降低备份速度,在某些情况下,您可能会发现备份速度实际上会增加,因为服务器上的内存压力要小得多。 但是,如果您希望进一步加快备份速度,您可能希望明智地调整cbbackupwrapper http://[host]:8091 [backup_dir] -u [user_name] -p [password] -n 50参数。

    以下是一个示例命令:

    cbbackupwrapper

    应该注意的是,如果您使用cbrestorewrapper执行备份,那么您还必须使用cbrestorewrapper来恢复数据,因为cbbackupwrapper会自动了解所使用的目录结构。 {{1}}。

答案 1 :(得分:0)

运行完整备份时,默认情况下,备份工具通过网络从所有节点流式传输数据。这不是最好的方法,因为它会导致大量额外负载并增加内存使用量,尤其是在其中一个Couchbase节点上运行cbbackup时。我会使用cbbackup的数据复制模式,它直接从磁盘上的文件复制数据:

> sudo /opt/couchbase/bin/cbbackup couchstore-files:///opt/couchbase/var/lib/couchbase/data/ /tmp/backup

当然,将数据路径更改为实际存储Couchbase数据的位置。 (在我的示例中,它以sudo身份运行,因为只有root对/ opt / couchbase / blabla具有读取权限。)在每个节点上执行此操作,然后收集所有备份文件夹并将它们放在某处。请注意,备份是非常可压缩的,因此您可能希望在通过网络复制之前将其压缩。