使用集合的"年"和"月"字段作为MongDB中的分片键

Nik*_*lja 0 sharding mongodb

我们目前正在实施一个解决方案,我们根据以下字段提供了一个我们想要分片的集合:

年(INT)

月(INT)

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

Mar*_*arc 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