我正在尝试在生产运行时从我们的生产 mongodb 中创建 mongodump。
我们有三个生产实例,一个是常规的 mongodb,一个在 gridfs 上只有很少几 GB 的数据,一个在 gridfs 上有大量的数据。所有 mongodb 实例都在 ubuntu 10.04 虚拟服务器上以 2.4.9 版本运行。
我使用 mongodump 命令将数据库导出到另一台服务器。
不幸的是我们的机器实际上托管在一个“低性能”数据中心(基于 vmware),所以当我尝试导出大型 gridfs db 时,磁盘 IO 达到 100%(并且 50% 的 CPU 也开始等待 IO)。
这对生产应用程序产生了非常负面的影响,因为数据库访问时间过度增加,导致应用程序无法使用。
我正在寻找一种方法来调节 mongodump,以便导出速度更慢但在硬件资源上更凉爽,从而为应用程序提供更好的运行性能。
有谁遇到过类似的情况吗?
答案1
没有办法限制读取 - 而这就是全部mongodump
操作,单次读取遍历您要转储的数据库的 _id 索引,然后以 BSON 格式写出数据。您看到的 IO 影响是因为它必须将数据分页到内存中才能读取(所有读取都是这种情况)。
至于建议,我想到以下几件事可能会有所帮助:
- 指向
mongodump
次要的而不是主要的 - 从集合中取出一个辅助节点(将其关闭),并使用它来获取数据的副本
第一个选项将隔离对辅助数据库的影响,然后它可能会在复制中落后并必须赶上,但除非您使用辅助读取,否则不会对您的应用程序产生影响。
如果您使用二次读取,那么您将看到对应用程序的影响。这就是第二个选项的作用所在 - 这意味着获取稍微“陈旧”的数据版本(但无论如何,只要您在之后写入任何内容,情况就会如此mongodump
),但通过关闭它并将其从集合中取出,您可以保证不会对您的应用程序产生影响。您也可以直接获取数据文件并直接使用它们 - 无需mongodump
(这通常要快得多)。