我正在开发一个Web应用程序,用户将向系统上传大量文档,并对文档执行不同类型的操作,包括聚合。但是,每个用户上传的文档数量差别很大 - 有些可能会上传十几个文档,有些可能会上传一百万个文档。
文档看起来像这样:
doc{
_id: <self generated UUID>,
uid: <id of user who uploaded the document>,
ctime: <creation timestamp>,
....
<other attributes, etc>
....
}
现在选择分片键时出现问题:
1.如果我选择UUID作为分片键,则同一用户上传的文档不太可能在同一个分片中结束,聚合操作将会很昂贵。
2.如果我使用uid作为分片键,则存储在分片中的数据将不均匀。
任何人都可以建议哪种方法可以实现这一目标?
我是分区和分片的新手,我对谷歌的研究以及堆栈溢出并没有产生任何结果。如果需要,我可以更改文档的模式,因为项目仍处于设计阶段。
答案 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