我正在尝试使用大约6M文档对一个集合进行分片。以下是有关分片群集的一些详细信息
Mongod版本2.6.7,两个分片,40%写入,60%读取。
我的数据库有一个包含大约6M文档的集合事件。正常文档如下所示:
{
_id : ObjectId,
sector_id : ObjectId,
subsector_id: ObjectId,
.
.
.
Many event specific fields go here
.
.
created_at: Date,
updated_at: Date,
uid : 16DigitRandomKey
}
每个部门都有多个(1,2,.100)子部门,每个子部门都有多个事件。有10000个这样的部门,30000个分部门和6M事件。数字不断增长。
正常读取查询包括sector_id,subsector_id。每个写操作都包括sector_id,subsector_id,uid(随机生成的唯一键)和其余数据。
我尝试/考虑了以下分片键,结果如下所述:
一个。 _id:hashed - >不会提供查询隔离,原因:_id不会传递给读取查询。
湾sector_id:1,subsector_id:1,uid:1 - >奇怪的分布:具有旧ObjectId的少数扇区进入分片1,具有中年的扇区ID(ObjectId)的扇区很少平衡并且在两个分片中均匀分布。最近ObjectId的几个扇区停留在shard 0上。
℃。 subsector_id:hashed - >结果与分片键b相同。
d。 subsector_id:1,uid:1 - >与b相同。
即subsector_id:hashed,uid:1 - >无法创建这样的索引
F。 uid:1 - >写入是分布式的,但没有查询隔离
这种分布不均的原因是什么?什么是基于给定数据的正确的分片键。
答案 0 :(得分:0)
我认为它是一个预期的行为Astro,sectorIds和subsectorIds是ObjectId类型,它包含时间戳作为前4个字节,它本质上是单调的,并且总是会转到相同的块(因此同样的碎片),因为它失败了提供你在(b)点指出的随机性。
选择分片键的最佳方法是具有商业含义的键(与某些ObjectId字段不同),并且应该与一些哈希混合作为后缀,以确保在该分配上具有良好的随机混合。如果你有一个sectorName和subsectorName,那么请尝试一下,让我们知道它是否正在使用它。
您可以考虑使用此链接选择正确的分片键。
MongoDB shard by date on a single machine
- $