mongodb分片 - 块没有相同的大小

问题描述:

我是新玩MongoDB。 由于这样的事实,我必须存储+文件-50万,我必须建立一个碎片的MongoDB集群的两个副本集mongodb分片 - 块没有相同的大小

文件看起来是这样的:

{ 
    "_id" : "predefined_unique_id", 
    "appNr" : "abcde", 
    "modifiedDate" : ISODate("2016-09-16T13:00:57.000Z"), 
    "size" : NumberLong(803), 
    "crc32" : NumberLong(538462645) 
} 

的碎片关键是appNr(之所以选中是因为查询性能原因,所有具有相同appNr的文档必须保持在一个块内)。 通常多个文件具有相同的appNr

加载像两百万条记录后,我看到了块也同样均衡然而,当running db.my_collection.getShardDistribution(),我得到:

Shard rs0 at rs0/... 
data : 733.97MiB docs : 5618348 chunks : 22 
estimated data per chunk : 33.36MiB 
estimated docs per chunk : 255379 

Shard rs1 at rs1/... 

data : 210.09MiB docs : 1734181 chunks : 19 
estimated data per chunk : 11.05MiB 
estimated docs per chunk : 91272 

Totals 
data : 944.07MiB docs : 7352529 chunks : 41 
Shard rs0 contains 77.74% data, 76.41% docs in cluster, avg obj size on shard : 136B 
Shard rs1 contains 22.25% data, 23.58% docs in cluster, avg obj size on shard : 127B 

我的问题是,我应该为了得到碎片之间均匀分布的数据做什么设置?我想了解数据如何分块。我已经定义了一个远程片键和块大小264

MongoDB使用相关的收集到的数据分割成块的碎片关键。块由分片数据的子集组成。基于分片键,每个块具有包含的较低和独占的较高范围。

图的片键值空间的分段成更小的范围或组块。 mongos路由根据分片键值写入相应的块。当MongoDB增长超过配置的块大小时,会将块分割。插入和更新都可以触发块拆分。

块可以表示的最小范围是单个唯一分片键 的值。仅包含具有单个分片键 值的文档的块不能拆分。

块大小会对碎片产生重大影响。

MongoDB中的默认块大小为64兆字节。我们可以增加或减少块大小。但是,块大小的修改应考虑以下项目

  1. 小块导致更均匀更频繁迁移的费用分配数据之后进行。这会在查询路由(mongos)层创建开销。
  2. 大块导致更少的迁移。从网络角度和查询路由层的内部开销两方面来看,这都更有效率。但是,这些效率是以牺牲数据分布可能不均匀为代价的。
  3. 块大小影响每个块迁移的最大文档数。
  4. 块大小影响分片现有集合时的最大集合大小。分块后,块大小不会限制集合大小。

通过参照这些信息,你的片键“appNr”,这一切都不会发生,因为块大小。

尝试将块大小而不是264MB(您目前使用的大小)调整为较小的大小,并查看文档分布中是否有更改。但这将是一个试验和错误的方法,这将需要大量的时间和迭代。

参考:https://docs.mongodb.com/v3.2/core/sharding-data-partitioning/

希望它能帮助!

+0

谢谢您的答复。我已经将大小减小到了64,但这并没有帮助。我通过使用哈希分片键来解决这个问题,并且像这样,mongo负责让更均衡的块以更均衡的分片结束。 – DariusNica

+0

@DariusNica - 伟大的,它解决了你的问题,我们说接受答案或upvoting答案在*感谢你:-) –

我会在这里发布我的发现 - 也许他们会有一些进一步使用。

MongoDB的文档中说,“当一个块增长超过指定块大小”它就会分裂。 我认为文档不完全准确或不完整。

当蒙戈不会自动分裂,splitVector命令会要求分割点主碎片,然后将分裂accordingly.This将首先发生在达到像从指定的块大小20% - 如果没有发现分裂点 - 会重试40%,60%等等...所以分裂不应该等待最大尺寸。 在我的情况下,碎片上半年发生这种情况不错,但随后的下半场 - 分裂发生的最大块大小超出之后。仍然必须调查为什么分裂没有发生,因为我没有看到这种行为的原因。

在块分开后,平衡器开始。这将在不考虑块大小的情况下将块分割成不同块大小(具有0个文档的块等于具有来自这方面的100个文档的块)。块将按照它们的创建顺序被移动。

我的问题是,该块下半年几乎大小比上半年的两倍。因此,当平衡器将所有组块集合的前半部分移动到另一个碎片时,集群变得不平衡。

一个更好的解释,我发现here

为了解决这个问题,我已经改变了分片键“哈希”。