自动为动态集合定义分片键并对设计提出建议

时间:2012-04-26 08:08:45

标签: mongodb sharding

我想为MongoDb实施Sharding并需要你的一些建议。

洞察

  1. 我们有很多cron-job收集有关机器和设备的各种信息。将它们写入自己的集合。
  2. 集合是动态创建的。
  3. 每个集合都有数百万个数据。
  4. 每个集合的Structure1是Name,Category,Subcategory,NodeId,Process-Start-Time,Process-End-Time,Value。
  5. 每个集合的Structure2是Name,Category,Subcategory,Subtype,Date,Value。
  6. 每个集合的Structure3是Name,Category,Subcategory,NodeId,Process-Start-Time,Process-End-Time,Value,Flag1,Flag2,Flag3。
  7. 经过研究,我们发现我们将使用分片并使其适用于多个服务器,这保证了两件事:

    1. 不用担心空间不足。
    2. 跨服务器的平衡性能
    3.   

      问题1:   我的问题是找到一个正确的分片键来分区数据。除了默认的ObjectId之外,我没有在集合中看到唯一键。在进一步阅读之后,我发现可以使用复合键,将复合键或自定义ObjectId作为键,其值可能类似于ObjectId: _是否有意义。这对于返回查询结果的性能非常关键。移动块。

           

      问题2:   由于我们有大型集合,因此在动态创建集合时,每次在Mongo控制台中设置分片将变得很困难。有没有办法让它在mongo中自动化,这样每当为分片数据库创建一个集合时,它将为该集合定义分片键?

           

      问题3:   是否真的有必要将shard-key传递给查询表达式?我不认为我们在任何查询表达式中使用过ObjectId,我怀疑我可以带有唯一的ID,因为数据的结构不像传统的DB。如果是,那么对于这样的查询有什么帮助:

      示例:

        

      {category:“Energy”,子类别:“Watt”,流程开始时间:{$ gte:132234234}}

      提前感谢您介入并帮助我解决此问题。

1 个答案:

答案 0 :(得分:3)

执行此操作的最简单方法可能是对数据库进行分片,但不保留集合。优点:

  • 集合将分布在整个分片中(但每个集合仅存在于一个分片上)。 编辑:我错了,这还没有实现。请参阅the related Jira ticket进行跟踪。目前,您可以使用tags来分发馆藏,但不能自动分发馆藏。
  • 无需在每个新集合上调用shardCollection

缺点是集合的所有流量都将转到其碎片,这对于您尝试的操作可能是不切实际的。

至于你的问题:

问题1:分片键不必是唯一的。你一般在询问什么?您可能更喜欢使用{category:1}{category:1,subcategory:1}

问题2:没有自动执行此操作的内置方法,获得该行为的最佳方式可能是设置cron作业。

问题3:否。可以将包含分片键的查询发送到特定分片和查询,而不必将分片键发送到所有分片,请参阅http://www.mongodb.org/display/DOCS/Sharding+Introduction#ShardingIntroduction-OperationTypes