1

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

  1. 块包含分片 ID 的有序列表。因此,如果我的分片 id 是 userid,我希望 chunk1 包含一个 id 列表:user1...user999(最多 64mb 限制),而 chunk2 将保存 user1000...user1999。那是对的吗?

  2. 在前面的例子中,假设 chunk1 在 shard1 上,而 chunk2 在 shard2 上。如果 user1(在 shard1 上)有很多文档,而所有其他用户都有 1-2 个文档,那么 shard1 的磁盘使用量会比 shard 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;..

    那是对的吗?

4

1 回答 1

1
  1. 是的,你是对的。
  2. 您的分片键决定了可以在哪里拆分块。如果您的分片键是“userid”,那么它可以拆分的最小的是用户ID。MongoDB 根据文档大小自动调整块大小。所以很有可能chunk1(在shard1上)只有fe文档的用户ID在1..10范围内,而chunk2(在shard2上)用户ID是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
于 2013-07-24T12:26:20.283 回答