MongoDB复合键分片和块与磁盘大小

时间:2013-05-27 14:56:59

标签: mongodb sharding

在阅读10Gen手册后,我似乎可以理解在以下场景中分片的工作原理。我将使用带有userid,lastupdatetime,示例数据的文档:

  1. Chunks包含Shard Ids的有序列表。因此,如果我的分片ID是userid,我希望chunk1包含一个id列表:user1 ... user999(最高64mb限制),chunk2将保存user1000 ... user1999。这是正确的吗?

  2. 在前一种情况下,假设chunk1在shard1上,chunk2在shard2上。如果user1(在shard1上)拥有大量文档而所有其他用户都有1-2个文档,那么它将使shard1磁盘使用量比碎片2磁盘使用量大很多。如果这是正确的,那么在这种情况下MongoDB的缓解是什么?

  3. 如何在块内部订购复合分片键?例如,如果复合分片键是userid + lastupdatetime,可以安全地假设以下(假设user1有很多文档): chunk1包含值列表:user1,10:00:00; user1,10:01:00 ...; user1,14:04:11 ..(最高64mb的限制)和chunk2将持有user1,14:05:33; user2,9:00:00 ... user34,19:00:00; ..

    是正确的吗?

1 个答案:

答案 0 :(得分:1)

  1. 是的,你是对的。
  2. 您的分片键确定可以分割块的位置。如果您的分片键是“userid”,那么它可以拆分的最小值是在userID上。 MongoDB根据文档大小自动调整块大小。所以chunk1(在shard1上)很可能只有f.e. UserID在1..10范围内的文档,以及chunk2(在shard2上)userID为11..1000的文档。 MongoDB会自动选择映射到每个块的最佳拟合范围。
  3. 这也是正确的。使用复合分片键,可以分割文档的“单元”是两个字段的组合。因此,您可以在第一个块中{ MinValue }{ user1, 12:00:00 },在第二个块中{ user1, 12:00:01 }{ user2, 04:00:00 },在第三个块中{ user2, 04:00:01 }{ MaxValue }MinValueMaxValue是特殊值,要么小于其他所有值,要么更大。第一个块实际上并不是以第一个值开头(在您的示例{ user1, 10:00:00 }中,而是使用MinValue