MongoDB分片键为(ObjectId,ObjectId,RandomKey)。不平衡的收藏品

时间:2015-07-02 06:01:38

标签: mongodb sharding

我正在尝试使用大约6M文档对一个集合进行分片。以下是有关分片群集的一些详细信息

  1. Mongod版本2.6.7,两个分片,40%写入,60%读取。

  2. 我的数据库有一个包含大约6M文档的集合事件。正常文档如下所示:

    {

          _id         : ObjectId,
          sector_id   : ObjectId,
          subsector_id: ObjectId,
          .
          .
          .
    
          Many event specific fields go here
          .
          . 
          created_at: Date,
          updated_at: Date,
          uid       : 16DigitRandomKey
    

    }

  3. 每个部门都有多个(1,2,.100)子部门,每个子部门都有多个事件。有10000个这样的部门,30000个分部门和6M事件。数字不断增长。

  4. 正常读取查询包括sector_id,subsector_id。每个写操作都包括sector_id,subsector_id,uid(随机生成的唯一键)和其余数据。

  5. 我尝试/考虑了以下分片键,结果如下所述:

    一个。 _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 - >写入是分布式的,但没有查询隔离

    这种分布不均的原因是什么?什么是基于给定数据的正确的分片键。

1 个答案:

答案 0 :(得分:0)

我认为它是一个预期的行为Astro,sectorIds和subsectorIds是ObjectId类型,它包含时间戳作为前4个字节,它本质上是单调的,并且总是会转到相同的块(因此同样的碎片),因为它失败了提供你在(b)点指出的随机性。

选择分片键的最佳方法是具有商业含义的键(与某些ObjectId字段不同),并且应该与一些哈希混合作为后缀,以确保在该分配上具有良好的随机混合。如果你有一个sectorName和subsectorName,那么请尝试一下,让我们知道它是否正在使用它。

您可以考虑使用此链接选择正确的分片键。

MongoDB shard by date on a single machine

- $