面试题答案
一键面试复杂性体现
- 节点故障
- 日志连续性中断:故障节点可能正在写入事务日志时发生故障,导致日志记录不完整,后续节点恢复时难以确定故障前确切的事务状态。
- 数据同步问题:其他节点可能依赖故障节点的数据,故障发生后,如何确保从故障节点恢复的数据与其他节点保持一致,避免数据不一致情况。
- 网络分区
- 脑裂风险:网络分区可能导致集群被分割成多个子集群,每个子集群可能独立进行事务操作,若处理不当,可能产生数据冲突,破坏数据一致性。
- 日志同步延迟:分区内节点与外部节点无法及时同步事务日志,当分区恢复后,需要处理大量积压的日志同步工作,增加恢复复杂性。
解决技术手段和策略
- 节点故障处理
- 日志预写式(WAL):MongoDB在执行写操作前先将日志记录写入磁盘,确保即使节点故障,也能根据已写入的日志恢复部分数据。
- 副本集机制:通过副本集,每个节点都有数据副本。故障发生时,其他副本节点可继续提供服务,并利用自身日志协助故障节点恢复。
- 检查点:定期创建检查点,标记哪些数据已持久化到磁盘。故障恢复时,只需从最近的检查点开始重放日志,减少恢复时间。
- 网络分区处理
- 仲裁节点:副本集中引入仲裁节点,在网络分区时,仲裁节点可协助确定哪个子集群为主集群,避免脑裂情况。
- 心跳检测:节点间通过心跳机制检测网络连接状态,及时发现网络分区,并暂停跨分区的事务操作。
- 日志合并策略:分区恢复后,MongoDB采用特定的日志合并策略,按照时间顺序和事务逻辑合并不同分区的日志,确保数据一致性。