GridFS使用filename作为索引

时间:2012-07-16 15:04:31

标签: mongodb tomcat monitoring gridfs

我目前正在使用mongoDB使用副本集和GridFS处理一个“简单”的照片系统。

原理很简单,我使用GridFS放了很多照片,客户端知道文件名,从文件名中我可以检索文件。

GridFS是否使用filename作为索引?希望是的,我无法在任何官方文档中找到它。

我的统计数据是:

     {
        "ns" : "photos.socialphotos.files",
        "count" : 758086,
        "size" : 168295128,
        "avgObjSize" : 222.00004748801587,
        "storageSize" : 220647424,
        "numExtents" : 15,
        "nindexes" : 2,
        "lastExtentSize" : 43311104,
        "paddingFactor" : 1,
        "flags" : 1,
        "totalIndexSize" : 125084624,
        "indexSizes" : {
            "_id_" : 22925504,
            "filename_1_uploadDate_1" : 102159120
        },
        "ok" : 1
    }

编辑:通过reIndex()收藏,我赢了30 Go,但它仍然太高了..

我的索引是:

{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "ns" : "photos.socialphotos.files",
    "name" : "_id_"
},
{
    "v" : 1,
    "key" : {
        "filename" : 1,
        "uploadDate" : 1
    },
    "ns" : "photos.socialphotos.files",
    "name" : "filename_1_uploadDate_1"
}

索引大小:

"keysPerIndex" : {
    "photos.socialphotos.files.$_id_" : 758086,
    "photos.socialphotos.files.$filename_1_uploadDate_1" : 758086
}

我从不使用_id_因为我没有存储它,是否可以删除它? 索引大小是125084624,这意味着我几乎所有的照片都在RAM中,这有点奇怪?

其他问题:

  1. 统计:mongostats是基础知识,还有另一个很好的监控工具,还是我必须创建自己的工具?

  2. 错误:当我进行大量插入时,我可以看到很多(大约每秒100秒),我在控制台上什么也没有...我应该在哪里调查?

  3. 使用JAVA / Tomcat的Connecion Pool:我正在使用一个简单的Tomcat webapp连接到MongoDB,你是否会建议为每个请求打开一个新的mongoDB连接(我猜不是)或者保留一个引用作为Mongo对象上的单例(例如使用Holder)或使用一个好的池,但我找不到标准的?

  4. 非常感谢!

2 个答案:

答案 0 :(得分:4)

解决您的问题:

1)使用Java驱动程序初始化GridFS集合时,该驱动程序将自动在.files和.chunks集合上创建索引。

2)MongoDB要求你有一个'_id'字段和一个唯一的'_id'索引。默认的'_id'只有12个字节长 - 实际上没有显着的开销。

参考:http://www.mongodb.org/display/DOCS/Object+IDs

3)“filename_1_uploadDate_1”索引中的统计信息仅指示 索引 的大小。此索引仅包含文件名和上载数据字段的内容 - 它不包含任何照片数据本身。出于性能原因,您希望索引的活动部分适合RAM。

参考文献:

4)如果您想要进行高级统计和监控,请将您的系统注册到10gen提供的免费MMS监控系统中。有关详细信息,请从此处开始:https://mms.10gen.com/help/

5)加载新数据时,页面错误是正常的。 MongoDB使用内存映射文件,因此每次写入数据文件中的新位置时,操作系统都需要在该页面中出错。

有关内存映射文件的更多信息,请查看此处:http://docs.mongodb.org/manual/faq/storage/

6)MongoDB Java驱动程序提供了自己的连接池。除非你正在做一个非常高性能的应用程序,否则你最好将Mongo对象用作单例。

答案 1 :(得分:2)

看起来你必须在每个'常规'文件中都有_id字段:

http://www.mongodb.org/display/DOCS/Object+IDs

如果你没有指定它的生成方式,MongoDB将使用BsonObjectId数据类型自动生成它,并自动在其上创建索引。这是因为Mongo确定该字段的唯一性。但是,如果您不想使用它...就像在您的情况下,您可以将文件名+ dateupload放在_id字段中,让Mongo处理它上面的索引。

另外,你提到的关于... 125084624的东西,这是_id上索引的大小。你的照片总大小可能会更多..内存中的125MB看起来对我无害。我不知道你怎么能更好地调查故障,但是......我假设你使用的是64位。如果它是32位,则DB大小限制为2GB ..您的插入将在此之前的某个时刻开始失败。

无论如何,关于连接,尝试并测试一些请求,一次与个人连接和一次与单身..我猜一个单身应该表现更好。要测试性能或进行负载测试,您可以使用Jmeter:

http://jmeter.apache.org/