为大量文档分割密钥(MongoDB)

时间:2012-06-28 19:12:35

标签: mongodb sharding

我正在开发一个Web应用程序,用户将向系统上传大量文档,并对文档执行不同类型的操作,包括聚合。但是,每个用户上传的文档数量差别很大 - 有些可能会上传十几个文档,有些可能会上传一百万个文档。

文档看起来像这样:

doc{
    _id: <self generated UUID>,
    uid: <id of user who uploaded the document>,
    ctime: <creation timestamp>,
    ....
        <other attributes, etc>
    ....
}

现在选择分片键时出现问题:
1.如果我选择UUID作为分片键,则同一用户上传的文档不太可能在同一个分片中结束,聚合操作将会很昂贵。
2.如果我使用uid作为分片键,则存储在分片中的数据将不均匀。

任何人都可以建议哪种方法可以实现这一目标?

我是分区和分片的新手,我对谷歌的研究以及堆栈溢出并没有产生任何结果。如果需要,我可以更改文档的模式,因为项目仍处于设计阶段。

2 个答案:

答案 0 :(得分:3)

这是我在选择分片键时看到的最佳指南:http://www.kchodorow.com/blog/2011/01/04/how-to-choose-a-shard-key-the-card-game/

您必须决定如何查询数据。也许uid和ctime的组合会产生一个好的分片键,但是我不确定这会在你查询时是否会让你感到悲伤,因为你没有对你打算如何查询提供太多的见解。

答案 1 :(得分:1)

您可以阅读有关shardkey选择和缩放的更多信息

1] Kristina Chodrow的书“Scaling MongoDB” http://shop.oreilly.com/product/0636920018308.do

2] Antoine Girbal关于Sharding Best Practices的演讲 http://www.10gen.com/presentations/MongoNYC-2012/Sharding-Best-Practices-Advanced