在MongoDB上对GridFS进行分片

时间:2011-03-17 20:06:56

标签: mongodb sharding gridfs

我正在记录GridFS以及在不同机器之间对其进行分片的可能性。

阅读文档here,建议的分片键是chunks.files_id。此键将链接到文件集合的_id,因此此_id是增量的。我保存在网格中的每个新文件都将有一个新的增量_id。

在O'Reilly的“Scaling MongoDB”一书中,不鼓励使用增量分片键来避免HotSpots(最后一个分片将接收所有的写入和读取)。

您对分割GridFS集合的建议是什么? 有没有人遇到HotSpot问题?

谢谢。

3 个答案:

答案 0 :(得分:17)

你应该在files_id上进行碎片以保持文件块在一起,但你是正确的,这将创建一个热点。如果可以的话,在 fs.files 集合中使用除ObjectId之外的其他内容_id s(可能MD5会优于ObjectIds)。

我们将为分片添加散列,这将解决此问题,但至少不会达到2.0。

答案 1 :(得分:5)

你可以对gridfs数据进行分片,因为gridfs它只是两个集合:块和文件。而gridfs分割它是非常有用和伟大的事情。关于gridfs分片键总是不好选择随机或增量分片键,因为数据不能均匀分布在分片上。在增量分片键的情况下,所有写入到最后一个分片并且它增长并且一旦差异变为10个或更多块,则平衡器将数据移动到另一个分片。将数据移动到另一个分片始终是一项应该尽可能避免的困难任务。
因此,当您选择分片键时,您应该关心均匀分布数据。
此外,如果你获得好运,那么' Scaling MongoDB 'kristina(非常专业的分片键)的作者会回答你的问题。
文档说,在常见情况下,您应该选择默认索引fileId:1,n:1作为分片键:

  

GridFS有不同的方式   可以根据需要进行分片。   一种常见的分片方法,基于   预先存在的索引是:

     

“files”集合未分片。所有   文件记录将存在于1个分片中。它   强烈建议这样做   碎片非常有弹性(至少3个节点   副本集)“chunk”集合获取   使用现有索引进行分片   “files_id:1,n:1”。一些文件在   范围结束可能有他们的块   分割分片,但大多数文件   将完全包含在   同样的碎片。

答案 2 :(得分:0)

目前MongoDB从版本1.8.1开始仅支持对“file_id”字段进行分片,因为使用md5来验证上传,但它没有 在整个碎片上工作。因此,您无法跨分片拆分单个文件。 Answer on google group 7