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

MongoDB复合密钥分片和块与磁盘大小,mongodb,sharding,Mongodb,Sharding,在阅读了10Gen手册之后,我似乎理解了切分在以下场景中的工作原理。我将使用具有userid、lastupdatetime和数据的文档作为示例: 块包含一个有序的碎片ID列表。因此,如果我的shard id是userid,我希望chunk1包含一个id列表:user1…user999(最大64mb限制),chunk2将包含user1000…user1999。对吗 在前面的例子中,假设chunk1在shard1上,chunk2在shard2上。如果user1(在shard1上)有很多文档,而所有其

在阅读了10Gen手册之后,我似乎理解了切分在以下场景中的工作原理。我将使用具有userid、lastupdatetime和数据的文档作为示例:

  • 块包含一个有序的碎片ID列表。因此,如果我的shard id是userid,我希望chunk1包含一个id列表:user1…user999(最大64mb限制),chunk2将包含user1000…user1999。对吗

  • 在前面的例子中,假设chunk1在shard1上,chunk2在shard2上。如果user1(在shard1上)有很多文档,而所有其他用户都有1-2个文档,那么shard1的磁盘使用量将比shard2的磁盘使用量大得多。如果这是正确的,那么MongoDB在这种情况下的缓解措施是什么

  • 复合碎片键在块中的顺序如何?例如,如果复合shard键是userid+lastupdatetime,那么可以安全地假设以下内容(假设user1有很多文档): chunk1包含一个值列表:user1,10:00:00;用户1,10:01:00。。。;user1,14:04:11..(最大64mb限制)和chunk2将保存user1,14:05:33;用户2,9:00:00…用户34,19:00:00

    对吗

  • 是的,你说得对
  • 切分键决定了块可以被分割到哪里。如果您的切分键是“userid”,那么它可以拆分的最小值就是userid。MongoDB根据文档大小自动调整区块大小。所以很可能chunk1(在shard1上)只有用户ID在1..10范围内的f.e.文档,chunk2(在shard2上)只有用户ID在11..1000范围内的文档。MongoDB将自动选择映射到每个区块的最佳拟合范围
  • 这也是正确的。使用复合分片键时,可以分割文档的“单元”是这两个字段的组合。所以你可以在第一组中使用
    {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
    开始的
  • 是的,你说得对
  • 您的分片键决定了分片的位置。如果您的分片键是“userid”,那么可以分片的最小值在userid上。MongoDB会根据文档大小自动调整分片大小。因此,分片1(在分片1上)很可能只有userid在1到10之间的f.e.文档,分片2(在分片2上)很可能只有userid在1到10之间的f.e.文档用户ID为11..1000的文档。MongoDB将自动选择映射到每个区块的最佳拟合范围
  • 这也是正确的。使用复合切分键,可以分割文档的“单位”是两个字段的组合。因此,您可以在块1中使用
    {MinValue}
    {user1,12:00:00}
    {user1,12:00:01}
    {user2,04:00}
    到块2和
    {user2,04:00:01}
    {MaxValue}
    在区块三上。
    MinValue
    MaxValue
    是比其他值小或大的特殊值。第一个区块实际上不是以第一个值开始的(在您的示例中,
    {user1,10:00:00}
    而是以
    MinValue
    开始的

  • 关于2-它不能完全回答问题-因此在理论上,如果用户1将有大量文档mongo不会将其放在多个碎片上?关于2-它不能完全回答问题-因此在理论上,如果用户1将有大量文档mongo不会将其放在多个碎片上?