mongodb设定集合为固定大小方法Capped Collection

        在一些特殊情况下,需要将mongodb的集合设定为一个固定大小,这样数据文件就不会无限制的增大,有利于维护。

        本人碰到的问题就是ceilometer使用的mongodb,由于不断的采集数据,导致数据文件不断增大,有时候就会将磁盘占满,导致出现其他问题。采用这种设定一个固定大小的方法,有效解决了这个问题。

 1.Capped Collection介绍

        Capped Collection 是一种特殊的集合,它大小固定,当集合的大小达到指定大小时,新数据覆盖老数据。Capped collections可以按照文档的插入顺序保存到集合中,而且这些文档在磁盘上存放位置也是按照插入顺序来保存的,所以当我们更新Capped collections中文档的时候,更新后的文档不可以超过之前文档的大小,这样话就可以确保所有文档在磁盘上的位置一直保持不变。

由于Capped collection是按照文档的插入顺序而不是使用索引确定插入位置,这样的话可以提高增添数据的效率。MongoDB的操作日志文件oplog.rs就是利用Capped Collection来实现的。
除此之外,Capped Collection还有以下的一些特点,首先是不允许删除,但是可以调用drop()删除集合中的所有行,不许删除的原因也是为了保持每个文档在磁盘上的位置不变。在32位机器上一个capped collection的最大值约482.5M,64位上没有限制系统文件大小限制。不可以对 Capped Collection 进行分片,在 2.2 版本以后,创建的Capped Collection 默认在 _id 字段上创建索引,而在 2.2 版本或以前没有。 
Capped Collection主要用于存储日志信息和缓存一些少用的文档。

2.具体使用

2.1创建Capped Collection

db.createCollection("meter",{capped:true,size:1073741824,max:50})

    说明:通过 db.createCollection 命令创建 Capped Collection 集合,创建时必须指定

             集合最大值,用于预先分配空间。上面的例子是每个文件最大为1G,保留最多50个对象。一般可以不用限定对象的数量。

2.2查看集合是否是Capped collection   

> db.meter.isCapped()
> db.meter.stats()

下面是本人的测试结果:

> db.meter.drop()
> db.createCollection("meter",{capped:true,size:1073741824,max:50})
> db.meter.isCapped()
true
> db.meter.stats()
{
        "ns" : "ceilometer.meter",
        "count" : 5,
        "size" : 7452,
        "avgObjSize" : 1490.4,
        "storageSize" : 1073741824,
        "numExtents" : 1,
        "nindexes" : 1,
        "lastExtentSize" : 1073741824,
        "paddingFactor" : 1,
        "systemFlags" : 1,
        "userFlags" : 0,
        "totalIndexSize" : 8176,
        "indexSizes" : {
                "_id_" : 8176
        },
        "capped" : true,
        "max" : 50,
        "ok" : 1
}

 

猜你喜欢

转载自welcome66.iteye.com/blog/2170419