使用集合的“年”和“月”字段作为MongoDB中的分片键

时间:2012-04-05 15:04:52

标签: mongodb sharding

我们目前正在实施一个解决方案,根据以下字段我们要收集一个集合:

年(INT)

月(INT)

我们希望每年为该系列产生大约2GB的数据。

1 个答案:

答案 0 :(得分:6)

如果你不介意我问,你为什么要考虑分片? 2GB应该很容易适合单个服务器。

这就是说,如果你肯定要对你的集合进行分片,那么选择一个非常细化的非递增分片键非常重要,这样就不会出现无法分割哪些块的情况。

例如,如果一个集合仅按月拆分,则只有12个可能的块。如果1月是插入的一个受欢迎的月份,那么可能会出现这样的情况:一百万(只是选择一个任意大的数字)记录可以插入到该块中,并且它永远不能被分割。

选择增量(或减量)的分片键也很重要。当新文档插入到集合中时,每个后续文档将被添加到同一个块中,直到该块达到其大小限制并且必须被拆分。然后可以将较低的块移动到不同的服务器,创建“瀑布”效果(一个分片继续填充块,然后将其移动到其他分片)。同时,所有新文档都不断被写入同一个碎片,创建了所谓的“热点”。如果插入速率足够,则磁盘可能会在尝试写入新文档时达到其IO限制,同时将现有数据迁移到另一个分片。

Mongo“Sharding Introduction”文档详细介绍了如何使用 文档存储在分片集合中。 http://www.mongodb.org/display/DOCS/Sharding+Introduction

此外,Mongo文档“选择碎片密钥”提供了良好的信息 选择分片键时要考虑的细节。 http://www.mongodb.org/display/DOCS/Choosing+a+Shard+Key

如果可能,我建议阅读Kristina Chodorow的“Scaling MongoDB”。 http://shop.oreilly.com/product/0636920018308.do这提供了一个关于分片的精彩介绍,以及关于选择我上面提到的分片键的Dos和Donts的更详细的解释。

以下是其他用户提出的有关分片和选择分片键的一些问题的链接。 (您可能会认识到一些链接和一些作者)希望这些资源能够提高您对分片工作方式的理解,如果您仍然决定对分片进行分片,则允许您选择有效的分片键。

“分享不平衡” - http://groups.google.com/group/mongodb-user/browse_thread/thread/1328250382087448

“为此数据集设计分片索引的最佳方法是什么” - http://groups.google.com/group/mongodb-user/browse_thread/thread/5bda4a39d9be54f5

“低基数分片键” - http://groups.google.com/group/mongodb-user/browse_thread/thread/3c96d1c254f113b1

“分片键分析” - http://groups.google.com/group/mongodb-user/browse_thread/thread/9cf0b8657d4515e2