面试题答案
一键面试选择片键时需考虑的因素
- 数据分布均匀性:片键应能使数据在各个分片上均匀分布,避免某些分片负载过重,而其他分片负载较轻。例如,若数据是按时间顺序产生,使用时间戳作为片键可能导致新数据集中在某一个或少数几个分片上,不利于均衡,可考虑结合其他字段打散数据。
- 查询模式:根据常见查询条件选择片键。若经常按某个字段进行范围查询,如按用户ID查询用户相关数据,可将该字段作为片键,这样能让查询定位到特定分片,减少跨分片查询,提高查询性能。
- 字段基数:片键字段的基数(不同值的数量)要足够大。基数过小,如只有几个固定值,数据无法均匀分布到各个分片,会导致数据倾斜。
- 索引维护:片键字段会自动创建索引,选择片键时要考虑索引的维护成本。若片键频繁更新,会导致索引频繁调整,增加系统开销。
解决数据倾斜问题的方法
- 调整片键:分析数据分布,找出导致倾斜的原因,更换更合适的片键。例如,原片键为性别字段(只有男、女两个值)导致数据倾斜,可改为用户ID等基数大的字段作为片键。
- 数据迁移:手动将数据从负载重的分片迁移到负载轻的分片。可使用MongoDB自带的平衡器相关命令,先停止平衡器,手动迁移数据后再启动平衡器。例如,通过
moveChunk
命令迁移特定范围的数据块。 - 预拆分:根据数据特征和分布预估,在数据导入前对数据进行预拆分,按合理的规则将数据预先分配到各个分片,避免数据导入后因分布不均导致倾斜。
- 二级索引:创建二级索引来辅助查询,减少对片键的依赖,使查询能更有效地路由到不同分片,缓解因片键选择不当造成的数据倾斜对查询性能的影响。