5

我目前正在使用 Replica Set 和 GridFS 使用 mongoDB 开发一个“简单”的照片系统。

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

GridFS 是否使用文件名作为索引?希望是的,我在任何官方文档中都找不到它。

我的统计数据是:

     {
        "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 围棋,但它仍然太高了..

我的索引是:

{
    "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 的连接池:我正在使用一个简单的 Tomcat webapp 连接到 MongoDB,您是否建议为每个请求打开一个到 mongoDB 的新连接(我猜不是),或者将引用保留为 Mongo 对象上的单例(以持有人为例)或使用一个好的游泳池,但我没有找到一个标准的?

非常感谢你 !

4

2 回答 2

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提供的免费彩信监控系统中。有关更多信息,请从此处开始:https ://mms.10gen.com/help/

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

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

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

于 2012-07-16T22:24:57.320 回答
2

看起来您必须在每个“常规”文档中都有 _id 字段:

http

://www.mongodb.org/display/DOCS/Object+IDs 如果您不指定它的生成方式,MongoDB 将使用自动生成它BsonObjectId 数据类型并自动在其上创建索引。这是因为 Mongo 确信该字段的唯一性。但是,如果您不想使用它..就像您的情况一样,您可以将文件名+日期上传放在 _id 字段中,让 Mongo 处理其上的索引..

另外,您提到的.. 125084624 的事情,就是这样_id 上的索引大小。照片的总大小可能要大得多。RAM 中的 125MB 对我来说似乎无害。
我不知道您如何才能更好地调查故障,但是..我假设您使用的是 64 位。如果它是 32 位,则数据库大小限制为 2GB ..您的插入将在此之前的某个时候开始失败..

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

//jmeter.apache.org/

于 2012-07-16T19:25:17.337 回答