佛山高防服务器-MongoDB的chunk详解

MongoDB中,在运用到分片的时分,常常会用到chunk的概念,chunk是指一个集合数据中的子集,也能够简略了解成一个数据块,每个chunk都是基于片键的规模取值,区间是左闭右开。例如,咱们的片键是姓名的第二个字母,包含了A-Z这26中可能,抱负情况下,划分为26个chunk,其中每个字母最初的姓名记载即为一个chunk。

在数据写入的时分,mongos依据片键shard key的值来写入对应的chunk中,chunk能够表明的最小规模是单个仅有的shard key的值,只包含具体的单个片键值文档的chunk不能被切割,这个也比较简单了解,假如某个chunk只包含一个片键的值,假如对它进行切割,则代表一个片键值映射了2个chunk,下次遇到这个片键的文档时,mongos就不知道应该存放在哪个chunk当中了。

chunk的巨细如何确认???

在MongoDB中,chunk的默许巨细是64MB,能够增加或者减少chunk的巨细。

chunk的巨细不宜过小,假如chunk过小,好处是能够让数据更加均匀的散布,但是会导致chunk之间频繁的搬迁,有一定的性能开支;相同的,chunk的巨细不宜过大,过大的chunk size会导致数据散布不均匀,

chunk的割裂

当某个chunk的值达到了chunk所能表明的最大值的时分,这个时分chunk不能无限增长,需求经过切割的方法来减少chunk的巨细,例如一个64MB的chunk切割成2个32MB的chunk,这样虽然增加了chunk的数量,但是带来的收益是单个chunk的缩小。

chunk的搬迁

在分片+仿制集的架构中,当佛山高防服务上的数据记载不停的增多,它上面切割的chunk就会变多,当集群中每个服务器上的chunk数量严重失衡的时分,mongodb会主动进行chunk的搬迁作业,这个主动搬迁的作业,是经过balancer来进行的。假如balancer发现各个shard之间的chunk数差异超过了提早规定的阈值,则会进行chunk的搬迁作业,如下:

也就是从上面的状况变成下面的状况。每个小块代表一个chunk。

MongoDB主动触发搬迁的阈值表如下:

chunk数量: <20,搬迁阈值:2

chunk数量:20~79,搬迁阈值:4

chunk数量: >80,搬迁阈值:8

chunk的搬迁一般运用锁来实现,从MongoDB3.4版别起,chunk的搬迁分为7个步骤:

1、balancer进程将moveChunk的命令发送到源shard中

2、源shard运用内部moveChunk命令开端移动,搬迁过程中,该chunk的操作仍旧在源shard上进行,源shard仍旧负责该chunk的写入操作

3、方针shard开端创建所需索引

4、方针shard开端恳求chunk中的文档并开端接纳数据的仿制

5、接纳完源shard的最终一个文档之后,方针shard发动一个同步进程,这个进程会拉取搬迁期间的日志,将搬迁期间对该chunk的操作更新到方针chunk中。

6、当完全同步时,源shard连接到config数据库并更新chunk的方位元数据。

7、完结数据更新后,一旦在源shard上没有对该chunk的操作,源shard会异步删去chunk。当然,用户能够设置_waitforDelete参数为true,让源shard在chunk搬迁完结后同步删去chunk数据

通常情况下,chunk搬迁由下面三种场景触发:

1、多个shard上散布不均匀

2、用户调用removeShard之后,被移除的shard上的chunk就要被搬迁到其他的shard上

3、MongoDB的shard tag功能,能够对shard或者shard key range打标签,系统会主动将对应的range的数据搬迁到拥有相同tag的shard上。