精华内容
下载资源
问答
  • oplog

    千次阅读 2017-07-25 09:25:47
    MongoDB 的Replication是通过一个日志来存储写操作的,这个日志就叫做oplogoplog记录了主节点上的每一次写操作。oplog是主节点上local数据库中的一个固定集合,备份节点通过查询该集合 就可以知道需要进行复制的...

    MongoDB 的Replication是通过一个日志来存储写操作的,这个日志就叫做oplog。oplog记录了主节点上的每一次写操作。oplog是主节点上local数据库中的一个固定集合,备份节点通过查询该集合
    就可以知道需要进行复制的操作。每个备份节点都维护着自己的oplog,记录着每次从主节点复制数据的操作(每备份节点从同步源获取需要执行的操作并应用到自身,最后将这些操作记录到自己的oplog)。
    在默认情况下,oplog分配的是空闲磁盘空间的5%。通常而言,这是一种合理的设置。最大不超过50G空间。可以通过mongod –oplogSize来改变oplog的日志大小。
    oplog是capped collection,因为oplog的特点(不能太多把磁盘填满了,固定大小)需要,MongoDB才发明了capped collection(the oplog is actually the reason capped collections were invented).
    oplog的位置
    oplog在local库:
    master/slave 架构下
    local.oplog.$main;
    replica sets 架构下:
    local.oplog.rs
    sharding 架构下,mongos下不能查看oplog,可到每一片去看。

    Oplog和数据刷新到磁盘的时间是60s,对于复制来说,不用等到oplog刷新磁盘,在内存中就可以直接复制到Sencondary节点。

    oplog是 特殊的capped collection ,用来滚动保存mongodb中所有数据操作的日志。
    oplog 数据结构格式:
    {ts:...,op:...,ns:...,o:...,o2:...}

    ts: 8字节的时间戳,由4字节unix timestamp+4字节自增计数表示。在选举新primary时,会选择ts最大的那个secondary作为primary
    op:1字节的操作类型(i 代表insert,d代表 delete,u代表update,c代表db cmd,db代表声明当前数据库,n代表空操作)
    ns:操作所在的namespace。
    o:操作所对应的document,即当前操作的内容。
    o2:在执行更新时的where条件,仅限于update时才有该属性。

    查看oplog的内容
    local 库中的集合 oplog.rs 记录了oplog 操作日志内容。

    use local
    show collections;
    db.oplog.rs.find();

    oplog的大小是维护工作时间的重要窗口。即有多长时间可以用以修复各种错误,所以oplog能够保存几天几周的数据,以留够时间处理问题

    查看oplog大小
    通过 db.printReplicationInfo() 命令查看 oplog 状态
    db.printReplicationInfo()

    修改oplog大小
    启动mongod时指定 oplogsize 单位为MB

    占用大量oplog空间的操作
    1、在同一时刻更新多个文档
    2、在插入操作同时删除相同大小数据
    3、大量的in-place更新操作。

    运行中修改oplog大小

    1、如果当前服务器是主节点则,让它退位,接着关闭当前服务器,再以单机模式启动(用不同的端口)。
    2、临时将oplog中的最后一条insert操作保存到其他集合中:
    use local
    var cursor=db.oplog.rs.find({"op":"i"})
    var lastInsert=cursor.sort({"$natural":-1}).limit(1).next()
    db.tempcollectionLastOp.save(lastInsert)
    db.tempcollectionLastOp.findOne()#确认是否保存成功
    3、删除当前的oplog
    db.oplog.rs.drop()
    4、创建新的oplog
    db.createCollection("oplog.rs",{"capped":true,"size":1024})
    5、将最后一条insert操作写回oplog
    var tmp=db.tempcollectionLastOp.findOne()
    db.oplog.rs.insert(tmp)
    db.oplog.rs.findOne()#同样确认是否已成功写回
    6、重新将该服务器以源副本集的端口方式重新启动。
    展开全文
  • Oplog

    2016-12-28 14:00:59
    1.简介Oplog 是一个capped collection。Mongodb默认将其大小设置为可用disk空间的5%(默认最小为1G,最大为50G),或也可以在mongodb复制集实例初始化之前将mongo.conf中oplogSize设置为我们需要的值。当Primary进行...

    1.简介

    Oplog 是一个capped collection。Mongodb默认将其大小设置为可用disk空间的5%(默认最小为1G,最大为50G),或也可以在mongodb复制集实例初始化之前将mongo.conf中oplogSize设置为我们需要的值。当Primary进行写操作的时候,会将这些写操作记录写入Primary的Oplog 中,而后Secondary会将Oplog 复制到本机并应用这些操作,从而实现Replication的功能。同时由于其记录了Primary上的写操作,故还能将其用作数据恢复。

    2.查看Oplog信息

    db.getReplicatonInfo()

    如果在集群中部署了Ops Manager,也可通过Ops Manager查看。

    3.估计Oplog的大小

    (1)计算Oplog churn

    Oplog churn是单位时间内oplog的增长速度。如果是大部分写入新数据的场景是可以根据每小时写入率 x 平均文档大小计算出来的。对于更新为主的应用,则要通过测试并观察 db.printReplicationInfo() 输出的结果来得到。
    Example:

    主节点
    rs0:PRIMARY> rs.printReplicationInfo()
    configured oplog size:   990MB
    log length start to end: 63002secs (17.5hrs)
    oplog first event time:  Wed Dec 28 2016 16:31:09 GMT+0800 (CST)
    oplog last event time:   Thu Dec 29 2016 10:01:11 GMT+0800 (CST)
    now:                     Thu Dec 29 2016 10:01:16 GMT+0800 (CST)
    从节点
    rs0:SECONDARY> rs.printReplicationInfo()
    configured oplog size:   9900MB
    log length start to end: 63164secs (17.55hrs)
    oplog first event time:  Wed Dec 28 2016 16:33:07 GMT+0800 (CST)
    oplog last event time:   Thu Dec 29 2016 10:05:51 GMT+0800 (CST)
    now:                     Thu Dec 29 2016 10:05:56 GMT+0800 (CST)

    从得到了信息可以看到,目前oplog的大小是9900M,即9.66G,存储了17.55H的数据,可以估算出oplog churn的大小是0.966/17.55=0.55G,如果要10个小时的oplog,则oplg的大小应该是0.55*10=5.5。

    (2)确定oplog的窗口时间

    Oplog的有效窗口时间必须是下述任务所需时间的最大值:
    1) Initial Sync/Resync一个从机所需时间

    想象一下, 如果新加一台从机,它从2014年11月27日9点开始克隆数据库。复制完成后,再把9点以后复制过程中新进来的操作以oplog方式追加到从库上从而完成最终同步。如果克隆数据库需要12个小时,而oplog只能保存5个小时的记录,那么在晚上9点从机试图开始追加oplog的时候发现oplog只有下午4点以后的内容了! 上午9点到下午4点7个小时的操作已经不存在,无法被同步。所以说oplog的窗口时间必须大于initial sync或者resync中复制数据库的时间。

    克隆数据库所需时间比较难估计,可以使用一个样本数据库进行initial sync或者resync的测试并记录所需时间,并估算生产数据库的所需时间。
    2) 恢复一个备份的数据库到从机上所需时间

    另外一个类似的操作就是有时候你需要从备份恢复数据库。假设说你的备份策略是6小时一次,并且从备份恢复一个数据库的时间是2个小时,那么你的oplog的有效时间必须大于 8小时(6+2)。如果小于8小时的话,你恢复的数据库就没法追加所有在这期间在主节点上产生的oplog。 (当然,你的备份还是可以用来做一个整个复制集的恢复,如主节点)

    3) 对从库进行压缩或修复所需时间

    有些时候我们会把从库下线做一些维护操作,如compact或者repair。Oplog的窗口有效时间也必须大于这个compat或repair所需时间。道理类似于上面。

    (3)计算oplog的大小

    有了oplog churn和oplog所需窗口时间,乘一下就可以得到我们希望为oplog设置的大小。如果oplog churn是1G,上述最大值是8个小时,那我们可以选择10小时(有一点空间),oplog的大小就应该是1×10=10G。

    注意:修改oplog的时候一定要对所有的复制集成员做同样地修改。因为任意一个复制集成员有可能变成主节点 – 如果某个成员oplog较小,又变成了主节点,那其他的节点就有可能出现同步失败的情况。

    4.Oplog扩容

    1.背景:

    一个由3个节点组成的复制集。

    2.主节点:

    A 从节点:B,C

    3.需求:

    Oplog扩容,尽量少的影响业务。

    4.思路:

    先由从节点开始,一台一台的从复制集中剥离,修改,再回归复制集,最后操作主节点来减少业务影响时间。

    5.流程:

    1.先将B节点关闭,去掉–replSet启动参数,更换启动端口–port,将节点以单机模式启动。

    mongod --port 37017 --dbpath /home/mongo/rs/rs1/db/  --logpath /home/mongo/rs/rs1/mongo.log

    然后备份其现有的oplog:

    mongodump –db local –collection ‘oplog.rs’ –port 37017

    2.进入mongo,将现在的oplog中最新的位置复制到tmp表(local数据库)中:

    use local
    db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )

    3.确认tmp中的数据:

    db.temp.find()

    4.删除原有的oplog:

    db.oplog.rs.drop()

    5.建立新的oplog(capped),下例为2G大小,可根据需求修改:

    db.createCollection('oplog.rs',{capped:true,size:2*1024*1024*1024})

    6.将tmp中的数据存储到新的oplog中,并验证:

    db.oplog.rs.save(db.temp.find().next())
    db.oplog.rs.find()

    6.关闭B节点,并恢复原有config配置,并在config中设置oplogSize为你之前设置的大小,并启动。
    7.继续对C节点进行如上操作,C节点完成后最后对主节点A进行如上操,作即可完成。

    展开全文
  • Oplog issue

    2020-12-08 19:02:16
    <div><p>I just added the mongo oplog url and when I deploy everything is fine but my app is not loading any ideas <p>this is the url <p>"MONGO_OPLOG_URL": "mongodb://myusername:...
  • Oplog 概念

    2020-04-08 16:14:06
    Oplog 概念 Oplog 是用于存储 MongoDB 数据库所有数据的操作记录的(实际只记录增删改和一些系统命令操作,查是不会记录的),有点类似于 mysql 的 binlog 日志。 Oplog 的存在极大地方便了 MongoDB 副本集的各节点的...

    Oplog 概念
    Oplog 是用于存储 MongoDB 数据库所有数据的操作记录的(实际只记录增删改和一些系统命令操作,查是不会记录的),有点类似于 mysql 的 binlog 日志。

    Oplog 的存在极大地方便了 MongoDB 副本集的各节点的数据同步,MongoDB 的主节点接收请求操作,然后在 Oplog 中记录操作,次节点异步地复制并应用这些操作。

    Oplog 的默认储存大小

    对于 unix 系统和 windows 系统

    Storage Engine Default Oplog Size Lower Bound Upper Bound
    In-Memory Storage Engine 5% of physical memory 50 MB 50 GB
    WiredTiger Storage Engine 5% of free disk space 990 MB 50 GB
    MMAPv1 Storage Engine 5% of free disk space 990 MB 50 GB
    Oplog 存储在 local 库的 oplog.rs 集合里面。对于一般的线上环境来说,默认的 Oplog 值就已经足够了。当达到储存大小的日志时,新的记录会将老的记录覆盖。

    但是我们系统中如果存在以下操作的话,那么我们就可能需要设置更大的 Oplog 值来避免数据的丢失(在副本集中数据同步过程):

    一次更新多个文件
    删除与插入同样数量的数据
    大量地更新现有的数据
    从MongoDB 4.0开始, Oplog 可以超过其配置的大小限制,以避免删除

    一旦mongod第一次创建了 Oplog ,更改–oplogSize选项将不会影响 Oplog 的大小。replSetResizeOplog使您可以动态调整 Oplog 的大小,而无需重新启动该mongod过程。

    oplog 中每个操作都是 幂等性 的,也就是说,无论是对目标数据库应用一次还是多次,oplog操作都会产生相同的结果。这样就保证了数据的一致性。

    Oplog 常用命令
    查看 Oplog 的状态:rs.printReplicationInfo()

    fymongodb:PRIMARY> rs.printReplicationInfo()
    configured oplog size: 15000MB
    log length start to end: 7437secs (2.07hrs)
    oplog first event time: Thu Apr 11 2019 09:40:31 GMT+0800 (CST)
    oplog last event time: Thu Apr 11 2019 11:44:28 GMT+0800 (CST)
    now: Thu Apr 11 2019 11:44:35 GMT+0800 (CST)
    如何查看当前的 Oplog 存储设置的大小:db.oplog.rs.stats().maxSize

    fymongodb:PRIMARY> use local
    fymongodb:PRIMARY> db.oplog.rs.stats().maxSize
    NumberLong(“15728640000”)
    查看 Oplog 最大大小和现在占用的大小,以及记录时长和时间 :db.getReplicationInfo()

    fymongodb:PRIMARY> db.getReplicationInfo()
    {
    “logSizeMB” : 15000,
    “usedMB” : 0.09,
    “timeDiff” : 7797,
    “timeDiffHours” : 2.17,
    “tFirst” : “Thu Apr 11 2019 09:40:31 GMT+0800 (CST)”,
    “tLast” : “Thu Apr 11 2019 11:50:28 GMT+0800 (CST)”,
    “now” : “Thu Apr 11 2019 11:50:29 GMT+0800 (CST)”
    }
    更改副本集成员的 Oplog 大小,更改的值要大于等于990MB,这里设置为1500MB : db.adminCommand({replSetResizeOplog: 1, size: 15000})

    fymongodb:PRIMARY> db.adminCommand({replSetResizeOplog: 1, size: 15000})
    {
    “ok” : 1,
    “operationTime” : Timestamp(1554953918, 1),
    “$clusterTime” : {
    “clusterTime” : Timestamp(1554953918, 1),
    “signature” : {
    “hash” : BinData(0,“AAAAAAAAAAAAAAAAAAAAAAAAAAA=”),
    “keyId” : NumberLong(0)
    }
    }
    }

    如果我们通过上面命令更改了 Oplog 的大小,系统是不会自动回收原始分配给 Oplog 的磁盘空间,我们需要使用 compact 来回收,在操作 compact 命令时,副本集成员是无法进行同步数据的。建议在进行回收的时候,不要对数据库进行写入,我们可以通过 rs.stepDown() 来关闭所有打开的连接。

    use local
    db.runCommand({ “compact” : “oplog.rs” })

    执行报错的话 :“will not run compact on an active replica set primary as this is a slow blocking operation. use force:true to force”

    db.runCommand({ “compact” : “oplog.rs” ,“force”:true})
    Oplog 日志 解析
    Oplog 的值是储存在 local 库下的 集合 oplog.rs 里的。我们可以分析其中的一条日志,看到到底记录了写什么。

    获取日志

    use local
    db.polog.rs.find()

    日志内容

    { “ts” : Timestamp(1554948714, 1), “t” : NumberLong(7), “h” : NumberLong(“5670178969026212077”), “v” : 2, “op” : “i”, “ns” : “djx.a”, “ui” : UUID(“f0a8c38d-af6b-4fb1-a109-775455dd7f19”), “wall” : ISODate(“2019-04-11T02:11:54.602Z”), “o” : { “_id” : ObjectId(“5caea26adebe94533fdb42a9”), “name” : “youju” } }

    Oplog 的日志由 key value 组成。
    ts 的值: 表示该日志的时间戳
    op 的值: i 表示 insert ,u 表示 update, d 表示 delete, c 表示的是 db cmd, db 表示声明当前数据库 (其中ns 被设置成为=>数据库名称+ ‘.’), n 表示 noop,即空操作,其会定期执行以确保时效性
    ns 的值: 表示操作所在的数据库和集合。
    ui 的值: 表示当前登录用户的会话 id 值。
    wall 的值: 表示该操作的执行时间,utc时间。
    o 的值: 表示操作的内容,如果是插入,就会将插入的数据放到该位置。示例日志就是插入了一条数据{“name”:“youju”}

    展开全文
  • oplog分析仪 MongoDB oplog分析实用程序。 向上读取MongoDB操作日志,直到最后一次操作为止,并按名称空间和操作类型打印每个操作日志条目的计数,最小,最大,平均和总bson大小(以字节为单位)。 这有助于收集对...
  • oplog简介oplog是local库下的一个固定集合,Secondary就是通过查看Primary的oplog这个集合来进行复制的。每个节点都有oplog,记录从主节点复制过来的信息,这样每个成员都可以作为同步源给其它节点。oplog可以说是...

    oplog 简介

    oplog 是local库下的一个固定集合,Secondary就是通过查看Primary的oplog这个集合来进行复制的。每个节点都有oplog,记录从主节点复制过来的信息,这样每个成员都可以作为同步源给其它节点。

    oplog 可以说是MongoDB Replication的纽带。

    复本集数据同步的过程

    Primary节点写入数据,Secondary 通过读取primary的oplog得到复制信息,开始复制数据并且将复制的信息写入到自己的oplog。如果某个操作失败(只有当同步源损坏或者数据与主节点不一致才可能发生),则备份节点停止从当前数据源复制数据。如果某个备份节点由于某些原因挂掉了,当重新启动后,就会自动从oplog的最后一个操作开始同步,同步完成后,就信息写入自己的oplog,由于复制操作是先复制数据,复制完成后再写入oplog,有可能相同的操作会同步两份,不过MongoDB在设计之初就考虑了这个问题,将oplog的同一个操作执行多次,与执行一次的效果是一样的。

    作用: 当Primary进行写操作的时候,会将这些操作记录写入Primary的Oplog中,而后Secondary会将Oplog复制到本机并应用这些操作,从而实现Replication的功能。

    可以用作数据恢复,类似于MySQL的binlog

    特性: 封顶表 Capped collection ,滚动覆盖写入,固定大小,不能删除数据

    默认大小: 64 位 linux,windows操作系统下位当前分区可用空间5%,体积不会超过50G,通过--oplogSize=4096(mb),最小4k

    在第一个启动复制集中的节点是,MongoDB会建立Oplog,会有一个默认的大小,这个取决于机器的操作系统

    # 查看oplog的状态,输出的信息包括oplog日志大小,操作日志记录的起始时间

    rs.printReplicationInfo()

    # 查看oplog的状态、大小、存储的时间范围

    db.getReplicationInfo()

    # oplog数据结构

    # 获取一条oplog

    db.oplog.rs.find().skip(1).limit(1).toArray()

    ts: 8字节的时间戳,由4字节unix timestamp + 4字节自增计数表示。这个值很重要,

    在选举(如master宕机时)新primary时,会选择ts最大的那个secondary作为新primary

    h: 此操作的独一无二的ID

    op: 1字节的操作类型

    "i": insert

    "u": update

    "d": delete

    "c": db cmd

    "db": 声明当前数据库 (其中ns 被设置成为=>数据库名称+ '.')

    "n": no op,即空操作,其会定期执行以确保时效性

    ns: 操作所在的namespace

    o: 操作所对应的document,即当前操作的内容(比如更新操作时要更新的的字段和值)

    o2: 在执行更新操作时的where条件,仅限于update时才有该属性

    b: bool,删除时候出现

    v: oplog 的版本

    展开全文
  • Mongodb的oplog详解

    2021-01-21 14:56:00
    Oplog 是 MongoDB 实现复制集的关键数据结构,在复制集中 Primary 对数据库操作之后就会产生一个 Oplog 文档保存在 local.oplog.rs 集合中,Secondary 成员会拉取 Primary 的 Oplog 并重放相同的操作,从而达到 ...
  • 1:oplog简介oplog是local库下的一个固定集合,Secondary就是通过查看Primary 的oplog这个集合来进行复制的。每个节点都有oplog,记录这从主节点复制过来的信息,这样每个成员都可以作为同步源给其他节点。Oplog可以...
  • 1:oplog简介oplog是local库下的一个固定集合,Secondary就是通过查看Primary 的oplog这个集合来进行复制的。每个节点都有oplog,记录这从主节点复制过来的信息,这样每个成员都可以作为同步源给其他节点。Oplog可以...
  • MongoDB-Oplog详解发布时间:2019-04-11 12:06,浏览次数:654, 标签:MongoDBOplogMongoDB Oplog 详解Oplog 概念Oplog 是用于存储 MongoDB 数据库所有数据的操作记录的(实际只记录增删改和一些系统命令操作,查是...
  • MongoDB 的Replication是通过一个日志来存储写操作的,这个日志就叫做oplog。在默认情况下,oplog分配的是5%的空闲磁盘空间。通常而言,这是一种合理的设置。可以通过mongod --oplogSize来改变oplog的日志大小。oplog...
  • Oplog 概念Oplog 是用于存储 MongoDB 数据库所有数据的操作记录的(实际只记录增删改和一些系统命令操作,查是不会记录的),有点类似于 mysql 的 binlog 日志。Oplog 的存在极大地方便了 MongoDB 副本集的各节点的...
  • <div><p>MongoDb when set up as a replica set mantains a collection in the local database called <a href="https://docs.mongodb.com/manual/core/replica-set-oplog/">oplog.rs</a> where it records a log of...
  • mongodb的Replication是通过一个日志来存储写操作的,这个日志就叫做Oplog。在默认情况下,对于64位的mongodb,oplogs都相当大-可能是5%的磁盘空间。通常而言,这是一种合理的设置。可以通过mongod --oplogSize来改变...
  • Oplog 分析

    2018-11-30 10:48:22
    OpLog 实现了 CompactableOplog, Flushable 有三种类型的oplog文件, crf, drf,krf private final OplogFile crf = new OplogFile(); private final OplogFile drf = new OplogFile(); private final KRFile krf =...
  • <div><p>when use sharding sync, conf urls: mongo_urls =...Oplog Tailer initialize failed: no oplog ns in mongo <p>what is happen?</p><p>该提问来源于开源项目:alibaba/MongoShake</p></div>
  • Debugging oplog hints

    2020-12-02 08:45:35
    re experiencing in our app right not is that oplog is disabled, despite setting up a replica set as described <a href="http://www.manuel-schoebel.com/blog/meteorjs-and-mongodb-replica-set-for-oplog-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,466
精华内容 586
关键字:

oplog