推荐使用CappedCollection

在Gunosy,我们在日志分析和推荐引擎方面使用了MongoDB。
不久前,在一次研讨会上,我们谈到了使用MongoDB的MapReduce进行日志分析的情况。

    • MongoDBのMapReduceって遅くない?

 

    データ量増えるとリソース相当使わない?

とのツッコミを頂きました。
指摘自体は正しいと思っていて、データ増えるとすぐ計算時間やサーバのリソース使用量が大変なことになります。

为了避免这种情况,并实现节约运用,Gunosy 在其日志分析领域使用了Capped Collection。

Capped Collection是什么?

ご存知の方も多いと思いますが、念のため本家から引用すると、

Capped collections are fixed-size collections that support high-throughput operations that insert, retrieve, and delete documents based on insertion order.

要はサイズ固定で高速に使えるcollectionだと思っていただければ結構です。

优点/长处

    • サイズ固定なので不用意にリソースを使用し過ぎることがない

 

    割と高速

缺点

    後からcapサイズが変更しづらい。(できなくもないです)

如果使用Capped Collection,您可以通过以下命令进行确认。

// 新しくコレクションを作る場合
db.createCollection( "mycol", { capped: true, size: 100000 } )

// すでにコレクションが存在する場合
db.runCommand({"convertToCapped": "mycoll", size: 100000});

通过查看集合的统计数据,可以确认是否已达到上限。

> db.mycol.stats()
{
    "ns" : "test.mycol",
    "count" : 0,
    "size" : 0,
    "storageSize" : 12288,
    "numExtents" : 1,
    "nindexes" : 1,
    "lastExtentSize" : 12288,
    "paddingFactor" : 1,
    "systemFlags" : 1,
    "userFlags" : 0,
    "totalIndexSize" : 8176,
    "indexSizes" : {
        "_id_" : 8176
    },
    "capped" : true,
    "max" : NumberLong("9223372036854775807"),
    "ok" : 1
}

你是怎么使用的?

在日志分析部分,我们需要注意以下两点。

    • 解析項目に合わせてログフォーマットを毎度用意している

 

    計測に必要なログの保存日数に合わせてCapサイズを決定している。

在解析中,几乎不使用原始访问日志。
由于日志解析和服务器代码由同一人负责,因此我们根据解析项适时实现了仅发送必要的最小数据的记录器,并同时准备了用于日志汇总的脚本(使用Fluentd)。

由于访问日志中不可避免地包含路径和请求参数等内容,所以集合的大小会变得很大。但是,如果只将与分析项目真正必要的数据保存到MongoDB中,那么它不会占用太多的容量。

顺便提一下,原始的访问日志也会暂时保存在MongoDB中,但大部分会先保存到S3,然后流向Redshift。

从目前来看,这种运作方式使得分析本身并不需要太大的资源,但仍能维持下去。

这种运营方式的缺点

当需要对长期数据进行后期分析时,由于Collection内无法保存如此长期的数据,因此我们在内部使用RedShift进行存储。

总结

使用Capped Collection,即使在相对较大的规模下,也能在维持MongoDB性能的同时节约资源。

广告
将在 10 秒后关闭
bannerAds