面试题答案
一键面试数据基于片键在分片间的分布原理
在单机集群上实施MongoDB分片时,MongoDB会根据片键对数据进行拆分,再将拆分后的数据分布到不同的分片上。其核心机制是通过一个范围映射表,这个表将片键值的范围与具体的分片关联起来。当插入新数据时,MongoDB根据数据的片键值,查询范围映射表,确定该数据应被存储到哪个分片。
不同片键类型对数据分布的影响
- 哈希片键:
- 影响:哈希片键通过对片键值计算哈希值,然后根据哈希值将数据均匀分布到各个分片上。这种方式不考虑片键值的自然顺序,能避免数据倾斜,即使数据的片键值有明显的聚集趋势,也能相对均匀地分布在各个分片。例如,若片键是用户ID,即使某些用户ID段使用频率高,哈希片键也能使这些数据分散在不同分片。
- 适用场景:适用于写操作频繁且希望数据均匀分布的场景,如物联网设备数据收集系统,设备ID作为片键,通过哈希片键可使大量设备并发写入的数据均匀分布在各分片,提升写入性能。
- 范围片键:
- 影响:范围片键按片键值的自然顺序划分范围,数据按片键值范围存储在不同分片。如果片键值分布不均匀,会导致数据倾斜,如按时间戳作为片键,新数据集中在最近时间范围,可能使存储最近时间范围数据的分片负载过重。
- 适用场景:适用于读操作频繁且查询条件常基于片键范围的场景,如日志系统,按时间范围查询日志很常见,使用时间戳作为范围片键,可快速定位到存储特定时间范围日志数据的分片,提升查询性能。