在MongoDB中,当使用切片时,经常使用组块的概念。组块是指集合数据的子集,也可以简单地理解为数据块。每个块都基于切片键的范围,间隔是左闭右开的。比如我们的切片键就是名字的第二个字母,包含A-Z的26种可能,理想情况下分为26个组块,其中每个字母开头的名字记录就是一个组块。
当数据被写入时,mongos根据分片键的值将其写入相应的块。区块可以代表的最小范围是单个分片键的值。只包含特定单个shardkey文档的组块是不能分区的,这很容易理解。如果一个块只包含一个切片键值,如果它被分区,这意味着一个切片键值被映射到两个块。下一次你遇到一个有这个切片键的文档,Mon
如何确定组块的大小?
在MongoDB中,块的默认大小是64MB,可以增加或减少。
块的大小不能太小。如果组块太小,好处是数据可以分布的更均匀,但是会导致唐山网站制作中组块之间频繁迁移,有一定的性能开销;同样,块的大小也不能太大,太大的块会导致数据分布不均匀。
组块划分
当一个块的值达到一个块可以表示的最大值时,此时块不能无限增长,块的大小需要通过拆分来减小。例如,一个64MB的块被分成两个32MB的块,这增加了块的数量,但是好处是减少了单个块。
组块迁移
在分区复制集的体系结构中,当服务器上的数据记录数量不断增加时,会有更多的块被划分在其上。当集群中每台服务器上的区块数量严重失衡时,mongodb会自动迁移区块。这种自动迁移是通过平衡器执行的。如果平衡器发现碎片之间的块号差异超过预先指定的阈值,它将迁移块,如下所示:
也就是从上位状态到下位状态。每个小块代表一个块。
MongoDB自动触发迁移的阈值表如下:
区块数:20,迁移阈值:2
组块数:20~79,迁移阈值:4
区块数:80,迁移阈值:8
组块的迁移一般通过使用锁来实现。从MongoDB3.4开始,块的迁移分为七个步骤:
1.平衡器进程向源碎片发送moveChunk命令
2.源碎片使用内部movechunk命令开始移动。在迁移过程中,区块的操作仍在源碎片上执行,源碎片仍负责区块的写入操作
3.目标碎片开始创建所需的索引
4.目标分片开始分块请求文档,并开始复制接收到的数据
5.在接收到源分片的最后一个文档后,目标分片开始同步过程,该过程将在迁移期间拉日志,并在迁移到目标分片期间更新分片的操作。
6.完全同步后,源分片连接到配置数据库,并更新块的位置元数据。