Zea*_* Ke 39 repair diskspace mongodb
mongodb文件说
要压缩此空间,请从mongo shell运行db.repairDatabase()(请注意,此操作将阻止并且速度很慢).
在http://www.mongodb.org/display/DOCS/Excessive+Disk+Space中
我想知道如何让mongodb 自动删除磁盘空间?
ps我们在mongodb中存储了许多下载任务,最高可达20GB,并在半小时内完成.
Jus*_*ins 65
通常,如果您不需要缩小数据文件,则根本不应缩小它们.这是因为在磁盘上"增长"您的数据文件是一项相当昂贵的操作,并且MongoDB可以在数据文件中分配的空间越多,您将拥有的碎片就越少.
因此,您应该尝试为数据库提供尽可能多的磁盘空间.
但是,如果必须缩小数据库,则应记住两件事.
MongoDB通过加倍来增加它的数据文件,因此数据文件可能是64MB,然后是128MB等,最高可达2GB(此时它会停止加倍以保持文件直到2GB.)
与大多数数据库一样......要进行收缩这样的操作,您需要安排一个单独的工作来执行此操作,MongoDB中没有"自动收缩".事实上,主要的noSQL数据库(讨厌这个名字)只有Riak会自动收缩.因此,您需要使用操作系统的调度程序创建一个作业来运行缩减.您可以使用bash脚本,或者让作业运行php脚本等.
Serverside Javascript
您可以使用服务器端Javascript进行收缩并通过mongo的shell通过作业(如cron或Windows调度服务)定期运行该JS ...
假设一个名为foo的集合,你可以将下面的javascript保存到名为bar.js的文件中并运行...
$ mongo foo bar.js
Run Code Online (Sandbox Code Playgroud)
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));
Run Code Online (Sandbox Code Playgroud)
这将运行并返回类似......
MongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153
Run Code Online (Sandbox Code Playgroud)
按计划运行(在非高峰时段),你很高兴.
上限收藏
然而,还有另一种选择,即上限集合.
上限集合是固定大小的集合,具有非常高性能的自动FIFO老化功能(老化时间基于插入顺序).如果您熟悉它们,它们有点像"RRD"概念.
此外,自动封顶集合具有高性能,可维护集合中对象的插入顺序; 这对于某些用例(如日志记录)非常强大.
基本上你可以限制一个集合的大小(或者文档的数量)来表示.. 20GB,一旦达到这个限制,MongoDB将开始丢弃最旧的记录,并在它们进入时用更新的条目替换它们.
这是保存大量数据的好方法,随着时间的推移丢弃旧数据并保持使用相同数量的磁盘空间.
Moj*_*ojo 26
我有另一个解决方案可能比db.repairDatabase()更好,如果你不能锁定系统,或者没有双倍的存储.
您必须使用副本集.
我的想法是,一旦你删除了吞噬你的磁盘的所有多余数据,停止辅助副本,擦除其数据目录,启动它并让它与主机重新同步.
这个过程非常耗时,但是当你执行rs.stepDown()时,它只需要几秒钟的停机时间.
这也不能自动化.好吧它可以,但我不认为我愿意尝试.
小智 8
运行db.repairDatabase()将要求您具有等于文件系统上可用数据库的当前大小的空间.当您知道剩下的集合或您需要在数据库中保留的数据当前使用的空间比分配的空间少得多并且您没有足够的空间来进行修复时,这可能很麻烦.
作为替代方案,如果您实际需要保留少量集合或仅需要数据的子集,则可以将需要保留的数据移动到新数据库中并删除旧数据库.如果您需要相同的数据库名称,则可以使用相同的名称将它们移回新的数据库.只需确保重新创建任何索引.
use cleanup_database
db.dropDatabase();
use oversize_database
db.collection.find({},{}).forEach(function(doc){
db = db.getSiblingDB("cleanup_database");
db.collection_subset.insert(doc);
});
use oversize_database
db.dropDatabase();
use cleanup_database
db.collection_subset.find({},{}).forEach(function(doc){
db = db.getSiblingDB("oversize_database");
db.collection.insert(doc);
});
use oversize_database
<add indexes>
db.collection.ensureIndex({field:1});
use cleanup_database
db.dropDatabase();
Run Code Online (Sandbox Code Playgroud)
具有许多集合的数据库的导出/删除/导入操作可能会获得相同的结果,但我还没有测试过.
此外,作为一项策略,您可以将永久集合保存在与瞬态/处理数据不同的数据库中,并在作业完成后删除处理数据库.由于MongoDB是无模式的,因此除了索引之外的任何内容都不会丢失,并且当下一个进程的插入运行时,将重新创建数据库和集合.只需确保您的作业包括在适当的时间创建任何nessecary索引.
| 归档时间: |
|
| 查看次数: |
35375 次 |
| 最近记录: |