我想为MongoDb实施Sharding并需要你的一些建议。
洞察
经过研究,我们发现我们将使用分片并使其适用于多个服务器,这保证了两件事:
问题1: 我的问题是找到一个正确的分片键来分区数据。除了默认的ObjectId之外,我没有在集合中看到唯一键。在进一步阅读之后,我发现可以使用复合键,将复合键或自定义ObjectId作为键,其值可能类似于ObjectId: _是否有意义。这对于返回查询结果的性能非常关键。移动块。
问题2: 由于我们有大型集合,因此在动态创建集合时,每次在Mongo控制台中设置分片将变得很困难。有没有办法让它在mongo中自动化,这样每当为分片数据库创建一个集合时,它将为该集合定义分片键?
问题3: 是否真的有必要将shard-key传递给查询表达式?我不认为我们在任何查询表达式中使用过ObjectId,我怀疑我可以带有唯一的ID,因为数据的结构不像传统的DB。如果是,那么对于这样的查询有什么帮助:
示例:
{category:“Energy”,子类别:“Watt”,流程开始时间:{$ gte:132234234}}
提前感谢您介入并帮助我解决此问题。
答案 0 :(得分:3)
执行此操作的最简单方法可能是对数据库进行分片,但不保留集合。优点:
缺点是集合的所有流量都将转到其碎片,这对于您尝试的操作可能是不切实际的。
至于你的问题:
问题1:分片键不必是唯一的。你一般在询问什么?您可能更喜欢使用{category:1}
或{category:1,subcategory:1}
。
问题2:没有自动执行此操作的内置方法,获得该行为的最佳方式可能是设置cron作业。
问题3:否。可以将包含分片键的查询发送到特定分片和查询,而不必将分片键发送到所有分片,请参阅http://www.mongodb.org/display/DOCS/Sharding+Introduction#ShardingIntroduction-OperationTypes。