oplog必知必会,实现MongoDB数据库主从同步和数据容灾“都挺好”
什么是oplog
oplog是local库下的一个固定集合。
mongodb数据库副本集模式下每个mongod进程会默认创建local数据库,该db会存储每个mongod节点的元数据,oplog就是local数据库中的一个固定⼤小、循环使用的集合。
在数据库启动时可以设置参数⼤小占用磁盘空间,例如—oplogSize 10000(10GB)。
oplog的作⽤
oplog是mongodb主从同步的关键,能够实现数据的容灾。
mongodb主库执行的写⼊操作会记录在oplog当中,从库复制主库oplog内容将其写⼊到⾃己的 oplog记录中并执行,从⽽实现主从同步。
在网络异常或者数据库节点异常宕机的场景下,数据库再次启动能够继续读取主库oplog的内容,异步同步。假设主节点写⼊据数据为1MB/s,oplog为10G,那么在主从节点连接异常⼤约2.8小时以内再次启动宕机数据库,主从数据都能够同步上,⽆需进行数据库数据修复。
为什么要修改oplog⼤小
在线上运维的过程中,业务量量可能逐步增加或者存在突增的情况(用户大批量写入或修改数据), 此时过小的oplog设置不利于数据库数据的安全。
一些公司或者执行数据库的冷备操作,用户业务量量突增的情况下,备份数据库再次启动也无法再追上主库的数据了,重新修复数据也是件苦逼的事情。
如何修改oplog⼤小
闲谈那么多进⼊入实操环节:
查看数据库当前oplog⼤小
SECONDARY> db.printReplicationInfo()
指定临时端⼝口,去掉—replset 重新启动数据库
> use local switched to db local
删除临时集合确保内容为空
>db.temp.drop()
使⽤用该db.collection.save()⽅和反向自然顺序排序查找最后⼀一个条⽬目并将其保存到临时集合: >db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )
删除现有oplog
>db.oplog.rs.drop()
创建新的oplog(此处调整到60GB)
>db.runCommand( { create: "oplog.rs", capped: true, size: (60 * 1024 * 1024 * 1024) } )
将原有oplog的最后一条记录插入到新oplog并确认
>db.oplog.rs.save( db.temp.findOne() ) >db.oplog.rs.find()
重新修改回原有端口和—replset参数启动数据库,查看数据库状态、配置是否⽣生效
SECONDARY> db.printSlaveReplicationInfo() SECONDARY> db.printReplicationInfo()