Ruby&Mongo实战-分片集中数据块拆分规则

来源:互联网 发布:json date 格式化注解 编辑:程序博客网 时间:2024/06/06 00:21

  分片集群中,早期会进行块拆分,以便加快数据在分片中的迁移。具体来说,当块的数量小于10时,会按最大块的尺寸(16MB)的四分之一进行拆分;当块的数量在10到20之间时,会按最大块尺寸的一半(32MB)进行拆分。这种做法会有两个好处,这会预先创建很多块,触发一次迁移。其次,这次迁移机会是无痛的,因为块的尺寸越小,其迁移的数据量就越少。

   现在,拆分的阈值会增大。通过大量插入数据,你会看到拆分时怎么缓缓减慢的,以及块是怎么增长到最大尺寸的。试着向集群里插入800MB数据,执行

ruby insert.rb 800
   这条命令会执行很长时间,执行完毕之后,总数据量比以前增加了8倍,但是看数据的分块状态,你会发现数据块的数量差不多是原来的两倍。由于块的数量变多了,块的平均范围就变小了,但是每个块都会包含更多数据。尽管刚才在插入800MB数据块的数量增加了,但是可以猜到没有发生迁移,一个可能的情况就是每个原始快被一拆为2,期间还有一次额外的拆分,可以通过查询config数据库的changelog集合加以验证。

db.changelog.count({what:"muti-split"})db.changelog.find({what:"moveChunk"}).count()
执行结果如下:

这符合我们的猜测,一共发生了27次拆分,但是只发生了6次迁移。如果想要更细一步了解原因,可以查看变更记录的具体条目,举例来说,以下条目记录了一次块移动:

从这里看出数据从shard-a移动到了shard-b。