MST

星途 面试题库

面试题:从底层存储和复制逻辑剖析MongoDB副本集数据一致性保障

深入到MongoDB的底层存储结构(如WiredTiger引擎相关存储机制)以及复制逻辑,分析MongoDB副本集如何确保从主节点到副本节点的数据一致性,在数据写入、复制和持久化过程中,采取了哪些关键技术和策略来防止数据不一致情况的发生?
36.4万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

1. MongoDB底层存储结构(以WiredTiger引擎为例)

  • 数据存储结构
    • 文档存储:MongoDB以BSON(Binary JSON)格式存储文档。每个文档包含字段和值,这种格式紧凑且易于遍历。在WiredTiger引擎中,文档被存储在页面(page)中,页面是存储和I/O操作的基本单位,典型大小为4KB、8KB或16KB。
    • B - 树索引:WiredTiger使用B - 树来存储索引。索引将文档中的特定字段映射到文档的位置,加快查询速度。例如,若对user集合的email字段建立索引,B - 树会根据email值快速定位到包含该email的文档。
    • Checkpoint:WiredTiger定期创建checkpoint,它将内存中的修改数据刷新到磁盘,确保在系统崩溃后能恢复到一致状态。checkpoint期间,会记录日志文件的位置,用于崩溃恢复。
  • 日志机制
    • 预写式日志(WAL):WiredTiger使用预写式日志,所有数据修改操作在写入数据文件之前,先写入WAL日志。日志以追加方式写入,确保即使系统崩溃,已记录的操作也不会丢失。例如,当插入一个新文档时,先将插入操作记录到WAL,再更新数据文件。

2. 副本集复制逻辑

  • 主节点写入
    • 当客户端向主节点写入数据时,主节点将写操作记录到自己的oplog(操作日志)中。oplog是一个特殊的固定集合,按时间顺序记录所有影响数据集的写操作。例如,插入、更新、删除操作都会记录在oplog中。
  • 副本节点同步
    • 初始同步:新加入的副本节点或长时间断开连接的副本节点需要进行初始同步。它会从主节点获取完整的数据快照,并将主节点oplog中的操作应用到本地数据副本上,从而达到与主节点数据一致。
    • 持续同步:正常运行时,副本节点定期从主节点拉取oplog的增量部分,并在本地应用这些操作。副本节点通过oplog的时间戳或操作编号来确定从主节点拉取哪些新操作。
  • 心跳机制
    • 副本集成员之间通过心跳机制保持通信。主节点定期向副本节点发送心跳消息,副本节点回复确认。如果主节点在一定时间内未收到某个副本节点的心跳响应,会标记该副本节点为不可用,并在必要时将其从副本集中移除。

3. 防止数据不一致的关键技术和策略

  • 多数写确认(Majority Write Concern)
    • 主节点在确认写操作成功之前,等待多数副本节点(超过一半的副本集成员)将写操作记录到自己的oplog中。例如,在一个包含5个成员的副本集中,主节点需要等待至少3个副本节点确认接收到写操作,才向客户端返回写成功的响应。这确保了即使主节点故障,新选举的主节点也能拥有最新的数据。
  • 选举机制
    • 选举算法:副本集使用Raft算法进行主节点选举。只有拥有最新oplog的节点才有资格成为主节点。在选举过程中,副本节点会比较彼此的oplog,确保选举出的主节点拥有最新的数据。例如,当主节点故障时,具有最新oplog的副本节点更有可能赢得选举,成为新的主节点。
    • 优先级设置:可以为副本集成员设置优先级,优先级高的节点在选举中更有优势。但即使优先级高,如果oplog不是最新的,也可能无法成为主节点。
  • 操作应用顺序
    • 副本节点严格按照oplog中的顺序应用操作。这保证了所有副本节点以相同顺序修改数据,避免因操作顺序不同导致的数据不一致。例如,先插入文档A,再更新文档A,所有副本节点都会按此顺序应用操作。
  • 复制验证
    • 副本节点在应用oplog操作时,会验证操作的有效性。例如,验证更新操作的条件是否匹配,插入操作的文档结构是否正确等。如果验证失败,副本节点会停止应用操作并记录错误,防止错误数据导致不一致。