Mongo oplog理解

转载请注明出处:

oplog(操作日志)是MongoDB中用于记录所有写操作的日志。它是一个特殊的集合,存储在副本集的主节点中。oplog用于确保副本集中的副节点与主节点的数据保持一致。当主节点执行写操作时,相应的操作将被记录到oplog中,副节点则通过读取oplog来获取最新的数据变化。

数据结构

oplog在mongo数据库主节点的local数据下,进入local数据库可以查看这个集合中存储数据的结构:

进入oplog数据库:

复制代码
use local

查看数据结构:

复制代码
rs0:PRIMARY> db.oplog.rs.findOne()
{
        "ts" : Timestamp(1729001735, 165),
        "t" : NumberLong(187),
        "h" : NumberLong(0),
        "v" : 2,
        "op" : "i",
        "ns" : "topology.filteredReason",
        "ui" : UUID("94a529f7-dbf1-4be0-b296-361094515e13"),
        "wall" : ISODate("2024-10-15T14:15:35.636Z"),
        "lsid" : {
                "id" : UUID("bbf4c6e6-e139-48e2-82df-a0b15bd0a89f"),
                "uid" : BinData(0,"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=")
        },
        "txnNumber" : NumberLong(29170),
        "stmtId" : 0,
        "prevOpTime" : {
                "ts" : Timestamp(0, 0),
                "t" : NumberLong(-1)
        },
        "o" : {
                "_id" : "75a4d50f-8f37-4d06-8abe-d1c2b0de97a0",
                "reason" : "link[maipu_3:gigabitethernet3>maipu_2:gigabitethernet3] has no label",
                "type" : "LINK",
                "key" : "maipu_3:gigabitethernet3>maipu_2:gigabitethernet3",
                "tePolicyColorTupleId" : "maipu_3_maipu_1_MaiPu31_3628",
                "_class" : "com.tethrnet.terra.service.sr.topology.lib.model.terra.te.svc.filteredreasontop.FilteredReason"
        }
}
rs0:PRIMARY>

oplog是一个无限增长的集合,包含以下主要字段:

  • ts:时间戳,表示操作的时间。
  • h:哈希值,用于唯一标识该操作。
  • op:操作类型,可能的值包括"i"(插入)、"u"(更新)、"d"(删除)。
  • ns:命名空间,表示操作所属的数据库和集合。
  • o:操作的详细内容,具体取决于操作类型。

特性

  1. oplog(操作日志)是一个特殊的固定大小集合,记录所有修改数据库数据的操作。
  2. 它可以超越其配置大小限制,以避免删除大多数提交点。
  3. 每个副本集成员都包含oplog的副本,位于local.oplog.rs集合中。
  4. 操作日志中的每个操作都是幂等的,即应用一次或多次都会产生相同的结果。
  5. oplog用于复制和恢复节点,如果节点下线,需要oplog来恢复状态。

配置

  1. 默认情况下,MongoDB会自动创建oplog,但可以自定义其大小。
  2. 可以通过oplogSizeMB选项指定初始oplog大小。
  3. 使用replSetResizeOplog命令动态更改oplog大小,无需重启mongod。
  4. 可以设置最小保留时间,防止删除最近的操作日志条目。

oplog的作用

  • 数据同步:副节点通过读取oplog来同步主节点的写入操作,确保数据一致性。
  • 故障恢复:在主节点发生故障时,可以根据oplog中的信息快速恢复数据。
  • 查询历史:oplog提供了一个操作历史的记录,有助于审计和问题排查。

命令

oplog存储在local数据库中。进入MongoDB shell后,您需要切换到local数据库:

  1. 查看当前最大oplog大小:

    复制代码
    db.getSiblingDB("local").oplog.rs.stats(1024*1024).maxSize
  2. 更改最大oplog大小:

    复制代码
    db.adminCommand({
      replSetResizeOplog: 1,
      size: Double(16384) // megabytes
    })

过滤oplog日志

只对特定操作或特定时间范围内的日志,可以使用查询条件过滤结果。例如,查看类型为"插入"的操作:

复制代码
db.oplog.rs.find({ op: "i" }).pretty()
  1. 设置最小保留时间:

    复制代码
    db.adminCommand({
      replSetResizeOplog: 1,
      minRetentionHours: 24 // 保留至少24小时的日志条目
    })

其他重要信息

  1. oplog大小取决于存储引擎和可用空间。内存存储引擎使用5%物理内存,WiredTiger使用5%可用空间。
  2. 默认情况下,不设置最小保留时间,系统会自动截断以维持配置的最大oplog大小。
  3. 在副本集中运行时,不能手动对oplog执行写操作。
  4. oplog对于复制和恢复节点至关重要,不能删除local.oplog.rs集合。
  5. 在sharded集群中,每个副本组都有自己的oplog。
      通过理解和正确配置oplog,您可以优化MongoDB的复制性能,并确保数据的一致性和可用性。适当的oplog大小对于高效的复制和恢复至关重要。
相关推荐
刘晨鑫19 小时前
MongoDB数据库应用
数据库·mongodb
爬山算法15 小时前
MongoDB(92)什么是变更流(Change Streams)?
数据库·mongodb
小冯不疯18 小时前
旺店通与金蝶云星空入库单管理对接方案
mongodb
MongoDB 数据平台1 天前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
忍冬行者1 天前
MongoDB 三节点副本集离线部署运维手册
运维·数据库·mongodb
卢傢蕊2 天前
MongoDB
数据库·mongodb
翻斗包菜3 天前
【MongoDB 从入门到实战:安装、配置、CRUD、权限、备份恢复全教程】
数据库·mongodb
leo__5203 天前
51单片机实现读写U盘
嵌入式硬件·mongodb·51单片机
为什么要做囚徒3 天前
MongoDB 设置开机自启
数据库·mongodb
炸炸鱼.3 天前
MongoDB 数据库应用完整手册
数据库·mongodb