2

我想为我的 MongoDb 实现分片,需要你的一些建议。

洞察力

  1. 我们有很多 cron-job 收集关于机器的各种信息并将它们写入它自己的集合。
  2. 集合是动态创建的。
  3. 每个集合都有数百万个数据。
  4. 每个集合的 Structure1 是 Name、Category、Subcategory、NodeId、Process-Start-Time、Process-End-Time、Value。
  5. 每个集合的结构 2 是名称、类别、子类别、子类型、日期、值。
  6. 每个集合的 Structure3 是 Name、Category、Subcategory、NodeId、Process-Start-Time、Process-End-Time、Value、Flag1、Flag2、Flag3。

经过研究,我们发现我们将使用分片并使其对多个服务器有用,这保证了两件事:

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

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

问题2: 由于我们的集合很大,动态创建集合时,每次在Mongo控制台设置分片会变得很困难。有没有办法让它在 mongo 中自动运行,以便每当为分片数据库创建集合时,它都会为该集合定义分片键?

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

例子:

{类别:“能源”,子类别:“瓦特”,过程开始时间:{$gte:132234234}}

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

4

1 回答 1

3

最简单的方法可能是对数据库进行分片,但不要对集合进行分片。好处:

  • 集合将分布在分片上(但每个集合只存在于一个分片上)。编辑:我错了,这还没有实现。请参阅相关的 Jira 票证以进行跟踪。目前,您可以使用标签来分发集合,但不是自动的。
  • 无需在每个新集合上调用 shardCollection

缺点是集合的所有流量都将流向其分片,这对于您尝试做的事情可能不切实际。

至于你的问题:

问题 1:分片键不必是唯一的。您一般查询什么?您可能会更好地使用类似{category:1}or的东西{category:1,subcategory:1}

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

问题3:不可以。包含shard key的查询可以发送到特定的shard,没有shard key的查询必须发送到所有shard,见http://www.mongodb.org/display/DOCS/Sharding+Introduction#ShardingIntroduction-操作类型

于 2012-04-26T14:31:30.007 回答