mongodb - 自动压缩mongodb中删除的空间?

mongodb 文档是这么说的

To compact this space, run db.repairDatabase() from the mongo shell (note this operation will block and is slow).

在 http://www.mongodb.org/display/DOCS/Excessive+Disk+Space

我想知道如何自动让mongodb释放已删除的磁盘空间?

附言我们在mongodb中存储了很多下载任务,最大20GB,半小时就完成了。

最佳答案

一般来说,如果您不需要缩小数据文件,则根本不应该缩小它们。这是因为在磁盘上“增长”数据文件是一项相当昂贵的操作,MongoDB 可以在数据文件中分配的空间越多,碎片就越少。

因此,您应该尝试为数据库提供尽可能多的磁盘空间。

然而如果你必须收缩数据库,你应该记住两件事。

  1. MongoDB 的数据文件通过以下方式增长 加倍所以数据文件可能是 64MB,然后是 128MB 等,直到 2GB(在 它停止加倍到哪一点 将文件保留到 2GB。)

  2. 与大多数数据库一样... 做一些操作,比如缩小你会 需要安排一个单独的工作 这样做,没有“自动收缩” MongoDB。事实上主要的 noSQL 数据库 (讨厌那个名字)只有Riak 会自动收缩。所以,你需要 使用您的操作系统创建工作 调度程序运行收缩。您可以使用 bash 脚本,或者让作业运行 php 脚本等。

服务器端 Javascript

您可以使用服务器端 Javascript 进行收缩并通过 mongo 的 shell 通过作业(如 cron 或 windows 调度服务)定期运行该 JS ...

假设有一个名为 foo 的集合,您可以将下面的 javascript 保存到一个名为 bar.js 的文件中并运行 ...

$ mongo foo bar.js

javascript 文件看起来像 ...

// Get a the current collection size.
var storage = db.foo.storageSize();
var total = db.foo.totalSize();

print('Storage Size: ' + tojson(storage));

print('TotalSize: ' + tojson(total));

print('-----------------------');
print('Running db.repairDatabase()');
print('-----------------------');

// Run repair
db.repairDatabase()

// Get new collection sizes.
var storage_a = db.foo.storageSize();
var total_a = db.foo.totalSize();

print('Storage Size: ' + tojson(storage_a));
print('TotalSize: ' + tojson(total_a));

这将运行并返回类似 ...

MongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153

按计划运行(在非高峰时段),一切顺利。

上限集合

但是,还有另一种选择,capped collections .

Capped collections are fixed sized collections that have a very high performance auto-FIFO age-out feature (age out is based on insertion order). They are a bit like the "RRD" concept if you are familiar with that.

In addition, capped collections automatically, with high performance, maintain insertion order for the objects in the collection; this is very powerful for certain use cases such as logging.

基本上,您可以将集合的大小(或文档数量)限制为 .. 20GB,一旦达到该限制,MongoDB 将开始丢弃最旧的记录,并在它们进入时用新条目替换它们。

这是保留大量数据的好方法,随着时间的推移丢弃旧数据并保持相同数量的磁盘空间使用。

https://stackoverflow.com/questions/4555938/

相关文章:

mongodb - 从现有 MongoDB 条目中删除键/值

mongodb - 如何列出 mongo shell 中的所有用户?

mongodb - 如何将 Robomongo 连接到 MongoDB

mongodb - Mongo按数组长度排序

arrays - 从 mongodb 数组中的所有元素中删除一个字段

mongodb - Cassandra、Membase、Hadoop、MongoDB、RDBMS等如

mongodb - "db.createUser is not a function"和 "pass

node.js - MongoDB Node findone如何处理没有结果?

java - java中使用mongodb的createIndex()和ensureIndex()的

mongodb - 如何在mongodb中删除N个文档