MongoDB的oplog(操作日志)是用于实现副本集(Replica Set)数据同步的核心组件,其核心特性如下:
1. 定义与作用
- 功能:
oplog记录所有对数据库的修改操作(如插入、更新、删除及系统命令),类似MySQL的binlog。- 仅记录实际修改数据的操作,若操作未修改数据(如查询或失败的写操作),则不会生成oplog条目。
- 用途:
副本集的备节点(Secondary)通过读取主节点(Primary)的oplog并重放操作,实现数据同步。
2. 存储位置与结构
- 存储位置:
oplog是local
数据库中的一个固定大小集合(capped collection),默认名称为oplog.rs
。 - 特性:
- 固定大小:达到配置上限后,旧日志会被新日志覆盖(MongoDB 4.0前严格限制,之后允许动态扩展)。
- 每个副本集节点(包括隐藏节点)均维护自己的oplog。
3. 同步机制
- 主节点写入:
客户端写操作成功修改数据后,主节点将操作记录到本地oplog。 - 备节点拉取:
备节点持续从主节点或其他备节点的oplog中拉取新操作,并按顺序重放以保持数据一致。 - 幂等性保障:
oplog设计为幂等操作,多次重放同一操作不会导致数据不一致。
4. 关键特性
- 异步复制:
备节点同步存在延迟,主节点写入与备节点重放之间存在时间差。 - 滚动覆盖:
oplog按插入顺序存储,旧日志被覆盖后可能导致备节点无法追上主节点(需合理配置oplog大小)。
参考文献
- 副本集Oplog - MongoDB手册v8.0
- MongoDB Oplog深入理解-腾讯云开发者社区
- MongoDB journal 与oplog,究竟谁先写入?
- MongoDB oplog详解- Joans - 博客园
- 副本集日志 - MongoDB中文手册