面试题答案
一键面试1. 基本机制
- 主从复制:MongoDB副本集采用主从复制机制。主节点(Primary)负责处理所有写操作,当写操作发生时,主节点会将写操作记录在其oplog(操作日志)中。从节点(Secondary)会定期从主节点拉取oplog,并在本地重放这些操作,从而保持与主节点的数据同步。
2. 数据同步流程
- 主节点写操作:客户端向主节点发起写请求,主节点在本地执行写操作,并将该操作记录到oplog中。oplog是一个特殊的固定集合,以时间顺序记录所有写操作。
- 从节点拉取oplog:从节点通过心跳机制定期与主节点进行通信,以确认主节点的状态并获取oplog的最新位置。从节点会从主节点的oplog中拉取新的操作记录。
- 从节点重放oplog:从节点获取到oplog后,会按照记录的顺序在本地重放这些写操作,从而使从节点的数据状态与主节点保持一致。
3. 确保数据一致性的关键步骤和策略
- 多数节点确认:MongoDB支持使用写关注(write concern)机制,默认情况下,写操作需要主节点确认写入成功。但可以通过设置写关注级别,要求写操作在多数节点(超过副本集节点数一半)确认写入成功后,才向客户端返回成功响应。这样可以确保即使主节点故障,数据也不会丢失,因为多数节点已经拥有了该数据。
- oplog持久化:主节点的oplog是持久化存储的,即使主节点发生故障重启,oplog中的记录依然存在。从节点拉取oplog时,会记录已同步的位置,在发生网络中断等情况恢复后,能从上次同步的位置继续拉取。
- 心跳检测:副本集成员之间通过心跳机制保持定期通信。心跳不仅用于检测成员的存活状态,还用于传递主节点的oplog位置信息等。如果从节点长时间未收到主节点的心跳,会触发选举机制,重新选出新的主节点。
- 复制延迟监控:可以监控从节点与主节点之间的复制延迟,通过查看从节点的同步状态信息,如
rs.printSlaveReplicationInfo()
命令获取的信息,及时发现并处理可能导致数据不一致的延迟问题。