1

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

文件看起来像这样:

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

现在是选择分片键的问题:
1、如果我选择UUID作为分片键,同一个用户上传的文档不太可能最终在同一个分片中,聚合操作会很昂贵。
2.如果我使用uid作为shard key,那么shards中存储的数据就不会是偶数了。

谁能建议实现这一目标的最佳方法?

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

4

2 回答 2

3

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

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

于 2012-06-28T19:40:25.517 回答
1

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

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

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

于 2012-10-23T11:33:54.583 回答