面试题答案
一键面试分片节点故障对索引的影响
- 部分数据不可索引:如果故障分片节点包含特定数据子集,该部分数据的索引在节点故障期间无法使用,查询涉及这部分数据时,性能会严重下降,甚至查询失败。
- 元数据不一致:MongoDB 的元数据(如片键范围、chunk 分布等)可能因分片节点故障而暂时不一致,导致路由错误,进而影响索引的正确使用。
故障检测策略
- 心跳机制:MongoDB 的副本集成员和 mongos 之间通过心跳机制保持联系。mongos 定期向每个分片副本集的主节点发送心跳包,若在一定时间内未收到响应,判定该分片节点可能故障。
- 副本集内部检测:每个副本集内部成员之间也有心跳检测,若副本集主节点故障,副本集内的其他成员通过选举产生新主节点,并向 mongos 通报新的主节点信息。
故障处理策略
- 自动故障转移(副本集机制):对于分片节点是副本集的情况,当主节点故障,副本集内的其他成员会发起选举,选出新的主节点。选举过程中,副本集会暂时不可用,选举完成后,新主节点恢复服务,mongos 会更新路由表指向新主节点。
- 手动干预:若自动故障转移未成功,管理员需介入。可以使用
rs.status()
命令查看副本集状态,若发现问题,手动执行rs.stepDown()
等命令来强制某个节点退位,触发新的选举,或者检查网络、磁盘等硬件问题,修复后重新启动故障节点并加入副本集。
索引维护策略
- 故障期间:
- 只读操作:在故障恢复期间,为确保索引一致性,对故障分片节点的数据执行只读操作,防止新数据写入导致索引不一致。
- 缓存查询结果:mongos 可以缓存涉及故障分片数据的查询结果,减少对故障分片恢复后重新查询的压力,保证整体系统性能。
- 故障恢复后:
- 数据同步:新主节点选举完成后,会与其他副本集成员进行数据同步,确保数据的一致性。这也间接保证了索引的一致性,因为索引是基于数据构建的。
- 索引重建(可选):若怀疑索引在故障期间受损,可以使用
db.collection.reIndex()
命令重建索引。但该操作可能对性能影响较大,建议在系统低峰期进行。同时,可以通过db.collection.validate()
命令验证索引的一致性,若发现不一致,再进行重建。 - 负载均衡:故障恢复后,使用
sh.status()
等命令检查集群状态,若发现数据分布不均衡,可通过sh.moveChunk()
等命令手动调整数据分布,避免因数据倾斜导致的性能问题,同时保证索引在整个集群中的可用性和性能均衡。