在阅读10Gen手册后,我似乎可以理解在以下场景中分片的工作原理。我将使用带有userid,lastupdatetime,示例数据的文档:
Chunks包含Shard Ids的有序列表。因此,如果我的分片ID是userid,我希望chunk1包含一个id列表:user1 ... user999(最高64mb限制),chunk2将保存user1000 ... user1999。这是正确的吗?
在前一种情况下,假设chunk1在shard1上,chunk2在shard2上。如果user1(在shard1上)拥有大量文档而所有其他用户都有1-2个文档,那么它将使shard1磁盘使用量比碎片2磁盘使用量大很多。如果这是正确的,那么在这种情况下MongoDB的缓解是什么?
如何在块内部订购复合分片键?例如,如果复合分片键是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; ..
是正确的吗?
答案 0 :(得分:1)
{ MinValue }
到{ user1, 12:00:00 }
,在第二个块中{ user1, 12:00:01 }
到{ user2, 04:00:00 }
,在第三个块中{ user2, 04:00:01 }
到{ MaxValue }
。 MinValue
和MaxValue
是特殊值,要么小于其他所有值,要么更大。第一个块实际上并不是以第一个值开头(在您的示例{ user1, 10:00:00 }
中,而是使用MinValue
。