为什么单调递增的分片键会导致插入内容以maxkey为上限被路由到块?

时间:2018-08-06 21:42:46

标签: mongodb sharding chunks

我在MongoDB文档中阅读了有关分片键的信息,以下为“

  
    

如果分片键值始终在增加,则所有新插入都将路由到以maxKey为上限的块。如果分片键值始终在减小,则所有新插入都将路由到以minKey为下限的块。

         

[https://docs.mongodb.com/manual/core/sharding-shard-key/#sharding-shard-key-creation][1]

  

我不明白为什么。假设分片键的范围是0到75,并且被分为3个块。第一个块从0到24,第二个从25到50,第三个从51到75。这里的minKey为0,maxKey为75。 如果连续的插入操作以单调递增的方式发生,例如1,2,3,4,5,那么为什么这些寻址共享键值1,2,3,4,5(单调递增)的插入会为何?路由到从51到75的最后一个分片,最后一个分片? (这是包含以maxKey为上限的块的分片)?

谢谢

1 个答案:

答案 0 :(得分:1)

让我们说,分片键范围从0到75,如您所说的3个块。第一块从0到24,第二块从25到50,第三块从51到75。

如果您插入1、2、3、4、5,它们将全都放在第一个块上。不止一个。因为它们的范围是0到24。

文档讨论的是当您拥有不断增加的键(例如,从0到无穷大。

在这种情况下,从0到无穷大可能有3个块。从0到24的第一块,从25到50的第二块,从51到75的第三块。但是,由于密钥的值始终增加到Infinity,因此所有值log_quotient()将进入第三块,{{1 }}的值将保留为前2个块。

在分片群集中,有一个Balancer,它将尝试平衡您的数据块,使它们具有相同的数据量。由于密钥总是在增加,平衡器可能很难决定如何拆分块。因此,第一次将所有具有值#include <float.h> #include <math.h> /* Compute log (a/b) for a, b ∈ (0, ∞) accurately and robustly, i.e. avoiding underflow and overflow in intermediate computations. Using a math library that provides log1pf() and logf() with a maximum error close to 0.5 ulps, the maximum observed error was 1.49351 ulp. */ float log_quotient (float a, float b) { float ratio = fmaxf (a, b) / fminf (a, b); if (ratio > FLT_MAX) { return logf (a) - logf (b); } else if (ratio > 2.0f) { return logf (a / b); } else { return log1pf ((a - b) / b); } } 的插入都路由到以maxKey为上限的块,即第三个块。

相关问题