面试题答案
一键面试日志记录
- 操作日志(oplog):MongoDB使用操作日志(oplog)记录所有影响数据库状态的写操作。在更新操作事务执行过程中,相关的更新操作会按顺序记录到oplog中。oplog采用的是预写式日志(Write - Ahead Logging, WAL)策略,即先将操作记录到日志中,再实际应用到数据文件。
- 日志格式:oplog中的每一条记录都包含了操作类型(如插入、更新、删除)、操作的数据库和集合信息、操作的文档内容(对于更新操作,可能包含更新的字段和值)等详细信息。
回滚机制
- 事务回滚触发:当故障发生时,MongoDB会检测到事务未正常完成(例如事务没有提交成功的标记)。此时,会根据oplog中记录的操作来进行回滚。
- 回滚操作:从oplog中逆向读取未完成事务的操作记录,根据操作类型进行反向操作。例如,如果是更新操作,会将更新前的文档状态恢复,通过oplog中记录的更新前文档版本或相关的差异信息来实现。对于插入操作,会执行删除操作;对于删除操作,则会重新插入被删除的文档。
与副本集成员协调确保集群数据一致性
- 选举机制:如果主节点(primary)在事务执行故障时崩溃,副本集需要重新选举新的主节点。成员之间通过心跳机制(通常每2秒一次)来检测节点的健康状态。符合选举条件的节点(如数据最新、优先级合适等)会发起选举,其他节点投票决定新的主节点。
- 同步机制:新的主节点选举出来后,它会与其他副本集成员(secondary)进行数据同步。副本集成员通过oplog来保持数据的一致性,secondary节点会从主节点拉取oplog,并应用其中记录的操作,以达到与主节点数据一致的状态。在故障恢复过程中,对于未完成事务的回滚操作也会同步到其他副本集成员,确保整个集群数据一致性。
- 多数确认机制:MongoDB副本集默认使用多数确认(majority write concern)机制,即写操作需要得到大多数副本集成员(超过一半的节点)的确认后才被认为成功。在故障恢复和数据同步过程中,这种机制确保了新主节点上的数据更改能在多数节点上同步,进一步保证整个集群的数据一致性。