面试题答案
一键面试1. 检测数据分布不均衡
- 基于chunk的统计:MongoDB将数据划分为多个chunk,每个chunk包含一定范围的数据。均衡器会定期检查每个chunk的大小以及chunk在各个分片上的分布情况。例如,通过统计每个分片上chunk的数量和数据量,来判断是否存在某一分片上chunk数量过多或数据量过大的情况。
- 阈值设定:MongoDB设置了一些默认的阈值。如果某一分片上的chunk数量或数据量超过这些阈值,就认为数据分布不均衡。比如,当一个分片上的chunk数量比其他分片平均chunk数量多出一定比例(如50% ),或者数据量超过其他分片平均数据量的一定比例时,就触发数据迁移。
2. 数据迁移基本流程
- 均衡器启动:当检测到数据分布不均衡达到触发条件时,均衡器开始工作。它是一个后台进程,在集群的config server上运行。
- 选择迁移chunk:均衡器根据预先设定的规则,从数据量较大或chunk数量较多的分片(源分片)中选择一个或多个chunk作为迁移对象。选择chunk时会考虑多种因素,如chunk的数据量、迁移成本等。
- 确定目标分片:根据当前各个分片的负载情况,选择一个负载相对较低的分片作为目标分片。目标分片要能够容纳即将迁移过来的chunk数据。
- 迁移执行:
- 锁定chunk:在源分片上,首先锁定要迁移的chunk,防止在迁移过程中有其他读写操作干扰。
- 复制数据:源分片将chunk的数据复制到目标分片。这个过程中,源分片继续处理读请求,而写请求会被记录在oplog(操作日志)中。
- 应用oplog:目标分片接收到数据后,开始应用源分片oplog中记录的写操作,以保证数据的一致性。
- 完成迁移:当目标分片成功应用完所有写操作,且确认数据与源分片一致后,在config server中更新chunk的元数据,将其标记为属于目标分片,然后在源分片上删除该chunk,完成整个迁移流程。