分享MongoDB修改oplog大小的4种方法

目录
  • 方法一
  • 方法二
  • 方法三
    • 1.关闭mongod
    • 2.修改配置文件
    • 3.启动mongod实例,并备份oplog
    • 4.重建oplog
    • 5.插入前面保存的oplog时间点记录
    • 6.关闭mongod实例
  • 方法四
    • 1.查看oplog大小
    • 2.修改oplog大小
    • 3.验证oplog大小
    • 4.整理碎片,回收空间(可选)

修改oplog有四种方法:

方法一

步骤如下:

  • 停掉所有secondary节点
  • 主节点删除local目录下文件,副本节点删除数据目录下所有文件
  • 修改所有节点的配置文件,如:oplogSize=1000
  • 重启所有节点,包括主节点和副本节点
  • 重新配置replca set,副本节点会重新同步数据(initial sync)

优点:操作简单。
缺点:需要停服务,若数据量大,数据同步代价高。

方法二

步骤如下:

  • remove其中一个secondary节点,并关闭mongod服务,删除数据目录下所有文件
  • 修改此节点的参数文件,如:oplogSize=1000,并启动mongod服务
  • 在primary节点执行rs.add()将此节点加入到replica set
  • 循环1-3步骤,将所有副本节点全部改完
  • primary节点执行rs.stepDown()将主节点降级为副本节点
  • 从新的主节点remove掉此节点,并进行步骤1-3
    这样逐个修改每个节点,完成oplog修改。

优点:解决了方法一中的停机问题。
缺点:每个节点都要逐个重新同步,时间代价更高。

方法三

The oplog exists internally as a capped collection, so you cannot modify its size in the course of normal operations.另:改变oplog大小,需要在每个节点上执行维护模式。(官方推荐)

1.关闭mongod

关闭mongod实例,如果是primary节点,执行rs.stepDown() 降级

handong1:PRIMARY> rs.stepDown()
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1619693040, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1619693040, 1)
}
handong1:SECONDARY>
handong1:SECONDARY>
handong1:SECONDARY>
handong1:SECONDARY> use admin
switched to db admin
handong1:SECONDARY> db.shutdownServer()
2021-04-29T18:44:33.947+0800 I  NETWORK  [js] DBClientConnection failed to receive message from 127.0.0.1:27017 - HostUnreachable: Connection closed by peer
server should be down...
2021-04-29T18:44:33.950+0800 I  NETWORK  [js] trying reconnect to 127.0.0.1:27017 failed
2021-04-29T18:44:33.967+0800 I  NETWORK  [js] reconnect 127.0.0.1:27017 failed failed

2.修改配置文件

修改配置文件,修改端口,注释掉replSet和认证相关的设置

port=27018
fork=true
journal = true
maxConns=500
logappend=true
directoryperdb=true
dbpath=/mongodb/data
logpath=/mongodb/logs/mongodb.log

3.启动mongod实例,并备份oplog

mongod -f /mongodb/conf/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 31553
child process started successfully, parent exiting
mongodump -d local -c oplog.rs --port 27018 -h 172.16.254.134 -o /mongodb/backup
2021-04-29T18:55:18.167+0800	writing local.oplog.rs to /mongodb/backup/local/oplog.rs.bson
2021-04-29T18:55:18.170+0800	done dumping local.oplog.rs (798 documents)

4.重建oplog

保存oplog最新时间点

> use local
switched to db local
> db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )
WriteResult({ "nInserted" : 1 })
> db.temp.find()
{ "_id" : ObjectId("608a914089abaa981f14e888"), "ts" : Timestamp(1619693066, 1), "h" : NumberLong(0) }

删除旧的oplog

db.oplog.rs.drop()

重建新的oplog,大小为2GB

> db.runCommand( { create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) } )

5.插入前面保存的oplog时间点记录

> db.oplog.rs.save( db.temp.findOne() )
> db.oplog.rs.find()

6.关闭mongod实例

> use admin
switched to db admin
> db.shutdownServer()
2021-04-29T19:06:53.745+0800 I  NETWORK  [js] DBClientConnection failed to receive message from 127.0.0.1:27018 - HostUnreachable: Connection closed by peer
server should be down...
2021-04-29T19:06:53.749+0800 I  NETWORK  [js] trying reconnect to 127.0.0.1:27018 failed
2021-04-29T19:06:53.749+0800 I  NETWORK  [js] reconnect 127.0.0.1:27018 failed failed

最后恢复mongodb.conf到初始状态,启动

方法四

如果你的MongoDB版本为4.0以后的版本,可以直接使用replSetResizeOplog修改。

1.查看oplog大小

handong1:SECONDARY> db.getReplicationInfo()
{
	"logSizeMB" : 1000,
	"usedMB" : 0.17,
	"timeDiff" : 6736,
	"timeDiffHours" : 1.87,
	"tFirst" : "Thu Apr 29 2021 17:19:14 GMT+0800 (CST)",
	"tLast" : "Thu Apr 29 2021 19:11:30 GMT+0800 (CST)",
	"now" : "Thu Apr 29 2021 19:11:42 GMT+0800 (CST)"
}

2.修改oplog大小

handong1:SECONDARY> db.adminCommand({replSetResizeOplog:1,size:2000})
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1619694744, 14),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1619694744, 14)
}

3.验证oplog大小

handong1:SECONDARY> db.getReplicationInfo()
{
	"logSizeMB" : 2000,
	"usedMB" : 0.18,
	"timeDiff" : 6852,
	"timeDiffHours" : 1.9,
	"tFirst" : "Thu Apr 29 2021 17:19:14 GMT+0800 (CST)",
	"tLast" : "Thu Apr 29 2021 19:13:26 GMT+0800 (CST)",
	"now" : "Thu Apr 29 2021 19:13:28 GMT+0800 (CST)"
}

4.整理碎片,回收空间(可选)

handong1:SECONDARY> use local
switched to db local
handong1:SECONDARY> db.runCommand({"compact" : "oplog.rs"})
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1619694840, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1619694840, 1)
}

到此这篇关于分享MongoDB修改oplog大小的4种方法的文章就介绍到这了,更多相关MongoDB修改oplog大小内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mongodb中oplog介绍和格式详析

    目录 1. 基本概念 2. Oplog 的默认储存大小 3. 可能需要更大oplog的工作负载 4. Oplog状态 5. Oplog格式 6. CUD操作和Oplog的对应关系 delete操作 update操作 小结 总结 1. 基本概念 oplog使用固定大小集合记录了数据库中所有修改操作的操作日志(新增.修改和删除,无查询),mongodb收到修改请求后,先在主节点(Primary)执行请求,再把操作日志保存到oplog表中,其他从节点(Secondary)到主节点拉取oplog并在异步

  • MongoDB利用oplog恢复数据的方法

    目录 数据全备 模拟故障 写入数据 模拟误操作 恢复步骤 备份oplog 解析oplog 将oplog备份和全备复制到standalone机 查找误操作时间点 进行数据恢复 检查恢复结果 当我们对数据出现误操作的时候,可以利用oplog恢复数据. 使用前提: 1.环境是副本集 2.必须有全备 2.全备后oplog没有被覆盖 数据全备 mongodump -h 172.16.254.133 --port 27017 -o /mongodb/backup/backup 模拟故障 写入数据 hando

  • 剖析后OpLog订阅MongoDB的数据变更就没那么难了

    目录 前言 oplog简介 解析oplog 代码 结语 前言 我们开源了一个订阅分发mysql的binlog的项目,一直用的非常好,忽然有天开发说能不能支持MongoDB的数据订阅呢,MongoDB的使用度也挺广泛的.安排.经过简单的了解后发现MongoDB也有类似binlog的机制,最终花了两天时间把功能完成,并统一抽象集成到binlog开源项目中,使用和binlog同一套订阅分发模型管理MongoDB数据源.整个过程非常顺利,比整mysql的binlog要简单的多了. oplog简介 先来聊

  • 利用MongoDB中oplog机制实现准实时数据的操作监控

    前言 最近有一个需求是要实时获取到新插入到MongoDB的数据,而插入程序本身已经有一套处理逻辑,所以不方便直接在插入程序里写相关程序,传统的数据库大多自带这种触发器机制,但是Mongo没有相关的函数可以用(也可能我了解的太少了,求纠正),当然还有一点是需要python实现,于是收集整理了一个相应的实现方法. 一.引子 首先可以想到,这种需求其实很像数据库的主从备份机制,从数据库之所以能够同步主库是因为存在某些指标来做控制,我们知道MongoDB虽然没有现成触发器,但是它能够实现主从备份,所以我

  • Mongodb的oplog详解

    Oplog 是 MongoDB 实现复制集的关键数据结构,在复制集中 Primary 对数据库操作之后就会产生一个 Oplog 文档保存在 local.oplog.rs 集合中,Secondary 成员会拉取 Primary 的 Oplog 并重放相同的操作,从而达到 Secondary 成员与 Primary 有一致的数据.实际上复制集中每一个成员都会保存 Oplog,其他成员会根据连接延迟等因数选择最近的成员拉取 Oplog 数据. Oplog 存在集合 local.oplog.rs,这是系

  • 关于单台MongoDB实例开启Oplog的过程详解

    背景 随着数据的积累,MongoDB中的数据量越来越大,数据分析团队从数据库中抽取变化数据(假如依据栏位createdatetime,transdatetime),越来越困难.我们知道MongoDB的副本集有一个数据结构Oplog,里面存储了Primary节点的所有写操作(此处的写操作是指查询以外的操作,包含 更新.异常等).其实,数据的抽取完全可以从Oplog中抓取这些操作,然后去重放. oplog是local库下的一个固定集合,Secondary就是通过查看Primary 的oplog这个集

  • 分享MongoDB修改oplog大小的4种方法

    目录 方法一 方法二 方法三 1.关闭mongod 2.修改配置文件 3.启动mongod实例,并备份oplog 4.重建oplog 5.插入前面保存的oplog时间点记录 6.关闭mongod实例 方法四 1.查看oplog大小 2.修改oplog大小 3.验证oplog大小 4.整理碎片,回收空间(可选) 修改oplog有四种方法: 方法一 步骤如下: 停掉所有secondary节点 主节点删除local目录下文件,副本节点删除数据目录下所有文件 修改所有节点的配置文件,如:oplogSiz

  • js修改onclick动作的四种方法(推荐)

    第一种:button.onclick = Function("alert('hello');"); 第二种:button.onclick = function(){alert("hello"); }; 第三种:button.onclick = myAlert; function myAlert(){                      alert("hello");               } 第四种: 这种情况更加动态,更为实用,而且

  • iOS开发之image图片压缩及压缩成指定大小的两种方法

    ///压缩图片 + (NSData *)imageCompressToData:(UIImage *)image{ NSData *data=UIImageJPEGRepresentation(image, 1.0); if (data.length>300*1024) { if (data.length>1024*1024) {//1M以及以上 data=UIImageJPEGRepresentation(image, 0.1); }else if (data.length>512*1

  • python修改文件内容的3种方法详解

    这篇文章主要介绍了python修改文件内容的3种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.修改原文件方式 def alter(file,old_str,new_str): """ 替换文件中的字符串 :param file:文件名 :param old_str:就字符串 :param new_str:新字符串 :return: """ file_data = "&qu

  • asp.net core 修改默认端口的几种方法

    一般情况下,aspnetcore发布后的默认端口是5000,这个大家都知道,而且默认骨架代码中没有看到任何让你输入的ip地址和端口号,但作为程序员的我们,不希望 被框架所管制,那如何实现默认端口的修改呢? 骨架代码: public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder Cre

  • Pandas修改DataFrame列名的两种方法实例

    目录 解决方法1:通过DataFrame.columns类的自身属性修改 1.暴力修改 2.stirp方法 3.lambda表达式 解决方法2:通过DataFrame.rename()函数修改 1.暴力修改(可以只修改部分列名) 2.lambda表达式 pandas更改DataFrame的行名或列名实例 更改列名 更改行名 总结 输入: $a $b $c $d $e 0 1 2 3 4 5 期望的输出: a  b  c  d  e0  1  2  3  4  5 原数据DataFrame: im

  • 分享Pytorch获取中间层输出的3种方法

    目录 [1]方法一:获取nn.Sequential的中间层输出 [2]方法二:IntermediateLayerGetter [3]方法三:钩子 [1]方法一:获取nn.Sequential的中间层输出 import torch import torch.nn as nn model = nn.Sequential(             nn.Conv2d(3, 9, 1, 1, 0, bias=False),             nn.BatchNorm2d(9),          

  • 分享python 写 csv 文件的两种方法

    目录 问题描述 方法一: csv 方法二: pandas 问题描述 在深度学习相关任务的训练时,需要在训练的每个 epoch 记录当前 epoch 的准确率(如下图所示),那么在 python 中要怎么将内容写入 csv 文件呢,学习发现可以使用 csv 或者 pandas 实现,在这里做个简单记录. 这里示例的代码为以追加模式写,每次写入一行 方法一: csv import csv log_path = 'log/temp.csv' file = open(log_path, 'a+', en

  • Java比较两个对象大小的三种方法详解

    目录 一. 为什么需要比较对象 二. 元素的比较 1. 基本类型的比较 2. 引用类型的比较 三. 对象比较的方法 1. equals方法比较 2. 基于Comparable接口的比较 3. 基于Comparator接口的比较 4. 三种比较方式对比 一. 为什么需要比较对象 上一节介绍了优先级队列,在优先级队列中插入的元素必须能比较大小,如果不能比较大小,如插入两个学生类型的元素,会报ClassCastException异常 示例: class Student{ String name; in

  • Linux添加Python path方法及修改环境变量的三种方法

    目录 一:用于当前终端: 二:用于当前用户: 三:用于所有用户: 在用Linux(OS:Centos 7.2)时看到有一行代码是: export PYTHONPATH=$PYTHONPATH:/home/usrname/models:/home/usrname/models/one 意思是将models以及其目录下的one文件夹加入系统环境中. 百度了发现环境变量有三种修改方式. 以上属于下述中的第一种. Linux 下设置环境变量有三种方法,一种用于当前终端,一种用于当前用户,一种用于所有用户

随机推荐