mongodb分片 - 块大小不一样

时间:2016-12-01 10:38:19

标签: mongodb sharding

我是mongodb的新手。 由于我必须存储+ -50万个文档,我必须设置一个包含两个副本集的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。

1 个答案:

答案 0 :(得分:3)

MongoDB使用与集合关联的分片键将数据分区为块。块由一组分片数据组成。每个块都具有基于分片键的包含较低且独占的较高范围。

分片为较小范围或块的分片键值空间图。 mongos路由根据分片键值写入适当的块。当MongoDB超出配置的块大小时,它会拆分块。插入和更新都可以触发块拆分。

  

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

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

MongoDB中的默认块大小为64 MB。我们可以增加或减少块大小。但是在考虑以下项目之后应该修改块大小

  1. 小块以更频繁的迁移为代价,导致数据分布更均匀。这会在查询路由(mongos)层创建费用。
  2. 大块导致迁移次数减少。从网络角度和查询路由层的内部开销来看,这都更有效。但是,这些效率是以可能不均衡的数据分布为代价的。
  3. 块大小会影响每个要迁移的块的最大文档数。
  4. 在分割现有集合时,块大小会影响最大集合大小。分片后,块大小不会限制集合大小。
  5. 通过引用这些信息和您的分片键" appNr",这可能是因为块大小而发生的。

    尝试将块大小而不是264MB(您当前拥有的)调整为较小的大小,并查看文档分发是否有变化。但这将是一种反复试验的方法,需要花费大量的时间和迭代次数。

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

    希望它有帮助!