我是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。
答案 0 :(得分:3)
MongoDB使用与集合关联的分片键将数据分区为块。块由一组分片数据组成。每个块都具有基于分片键的包含较低且独占的较高范围。
分片为较小范围或块的分片键值空间图。 mongos路由根据分片键值写入适当的块。当MongoDB超出配置的块大小时,它会拆分块。插入和更新都可以触发块拆分。
块可以表示的最小范围是单个唯一的分片键 值。仅包含具有单个分片键的文档的块 价值不能拆分。
块大小将对碎片产生重大影响。
MongoDB中的默认块大小为64 MB。我们可以增加或减少块大小。但是在考虑以下项目之后应该修改块大小
通过引用这些信息和您的分片键" appNr",这可能是因为块大小而发生的。
尝试将块大小而不是264MB(您当前拥有的)调整为较小的大小,并查看文档分发是否有变化。但这将是一种反复试验的方法,需要花费大量的时间和迭代次数。
参考:https://docs.mongodb.com/v3.2/core/sharding-data-partitioning/
希望它有帮助!