在 MongoDB 上分片 GridFS

Posted

技术标签:

【中文标题】在 MongoDB 上分片 GridFS【英文标题】:Sharding GridFS on MongoDB 【发布时间】:2011-07-17 16:58:18 【问题描述】:

我正在记录有关 GridFS 以及在不同机器之间分片的可能性。

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

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

您对 GridFS 集合的分片有何建议? 有人遇到过热点问题吗?

谢谢。

【问题讨论】:

【参考方案1】:

您应该在files_id 上分片以将文件块保持在一起,但您是正确的,这将创建一个热点。如果可以,请在 fs.files 集合中为 _ids 使用 ObjectId 以外的其他内容(可能 MD5 会比 ObjectIds 更好)。

我们将为分片添加散列,这将解决这个问题,但至少要等到 2.0。

【讨论】:

嗨克里斯蒂娜。鉴于答案早在 2011 年,现在的状态如何?谢谢。 2.4 允许散列分片键,因此您可以在 files_id 上创建散列索引。 不幸的是,散列的 files_id 在最新的 2.4 中不起作用jira.mongodb.org/browse/SERVER-9888【参考方案2】:

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

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

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

【讨论】:

我想到了 filename,但它在 files 集合中,而不是在 chunks 中需要分片的集合。 我是这么认为的 ;) 但是文件很小的集合,它将存在于一个分片中。而且我只看到 gridfs 的两个分片键:fileId 和 fileId,n。【参考方案3】:

目前 MongoDB 1.8.1 版本仅支持对“file_id”字段进行分片,因为使用 md5 来验证上传,但它不支持 跨分片工作。因此,您不能跨分片拆分单个文件。 Answer on google group7

【讨论】:

以上是关于在 MongoDB 上分片 GridFS的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB分片搭建

在 MongoDB 上分片 GridFS

MongoDB 分片管理

MongoDB 分片管理

MongoDB基础教程系列--第九篇 MongoDB 分片

MongoDB学习笔记——分片(Sharding)