面试题答案
一键面试工作原理
- 主节点写入:在副本集中,主节点(Primary)负责处理客户端的写操作。当客户端发起写请求时,主节点首先将写操作记录到自己的 oplog(操作日志)中。oplog 是一个特殊的固定集合(capped collection),它按照时间顺序记录了所有的写操作。
- 从节点复制:从节点(Secondary)定期轮询主节点的 oplog,获取自上次同步以来的新写操作记录。从节点将这些记录应用到自己的数据副本上,从而保持与主节点数据的一致性。这种复制是异步的,从节点会尽力跟上主节点的变化,但可能会存在一定的延迟。
关键机制
- 多数派确认(Majority Write Concern):为了保证数据的持久性,MongoDB 支持多数派写关注(write concern)。当使用多数派写关注时,主节点在将写操作记录到 oplog 后,会等待集群中大多数节点(超过一半的节点)确认已复制该操作日志,才会向客户端返回写操作成功的响应。这确保了即使主节点发生故障,数据也不会丢失,因为多数节点上都保存了该写操作的记录。例如,在一个包含 5 个节点的副本集中,至少需要 3 个节点确认写操作,主节点才会认为写操作成功。
- 选举机制:如果主节点发生故障,副本集需要选举出一个新的主节点来继续处理客户端的请求。选举过程基于心跳机制,节点之间通过定期发送心跳消息来检测彼此的状态。当一个节点检测到主节点不可用时,它会发起选举。在选举过程中,符合条件的从节点(如数据最新、优先级最高等)有机会成为新的主节点。新主节点选举出来后,集群继续正常工作,并且会确保之前未完成复制的操作日志最终被所有节点应用,从而保证数据的一致性和持久性。
- oplog 持久性:oplog 本身具有持久性保障。由于它是固定集合,MongoDB 会按照固定的大小或时间间隔对 oplog 进行滚动记录,老的记录会被覆盖,但在覆盖之前,写操作已经有足够的时间被从节点复制。此外,MongoDB 还支持将 oplog 持久化到磁盘,进一步确保即使节点重启,也能从 oplog 中恢复未完成的复制操作。