当未启用平衡器时,在mongo中的空Sharded数据库中插入数据会导致一个分片中的所有数据

时间:2018-05-01 19:14:53

标签: mongodb sharding

我们需要2个mongo db shard服务器(每个3个副本集)。

我们创建了Sharded集合并插入了200k文档。平衡器在该窗口中被禁用,我们在第一次测试后启用它并再次开始插入。

在第一次测试中,所有数据都插入到一个碎片中,我们在mongolog中收到了很多警告: -

splitChunk找不到块[{条款ArticleID:MinKey,的sessionId:MinKey},{条款ArticleID: “59830791”,的sessionId “fb0ccc50-3d6a-4fc9-aa66-e0ccf87306ea”})来分割,块边界可以陈旧

日志中提到的原因可能是低基数分片键

在平衡器开启后的第二次和第三次测试之后,两个分片上的数据均衡。

我们又进行了一次测试,并在此测试中再次停止了平衡器,数据进入两个分片,甚至平衡器关闭(pageIds是读取器ID,从旧测试重复,以及两个新的ID)

请问这个机制是如何工作的,因为当密钥的基数良好时,无论平衡器是ON还是OFF,数据都应该进入两个分片。

Shard Key是: - (pageid)和(unique readerid)

以下是插入统计信息: -

  1. 页面阅读时长200k

  2. 唯一网页ID 2000

  3. Unqiue会话阅读页面持续时间: - 70000

    提前致谢!

1 个答案:

答案 0 :(得分:0)

为数据库启用分片时,将为每个数据库分配主分片。 如果将平衡器的数据插入为禁用,则所有数据都将进入主分片。当您的数据增长并且将创建块时,Mongo Split将计算分割点。

  • 由于您的平衡器已停用,因此所有块都将保留在同一个分片上。
  • 如果您的平衡器处于启用状态,那么它将平衡分片之间的那些块,这将导致更好的数据分布。
  

我们又进行了一次测试并在此测试中再次停止了平衡器,数据正在进行中   在两个分片中甚至平衡器都关闭了(pageIds是读者ID)   从旧测试中重复以及两个新的ID)

数据已经以块的形式分发,这些块在两个分片之间分布很好。如果您的分片键的范围也在各个块之间均匀分布,那么任何新文档都将进入相应的块,这将导致均匀的数据分发。