window mongodb复制集全量备份与增量备份

2021-11-08

>全量备份、差异备份、增量备份资源占比还原复杂度备份数据缺失其他工具准备mongodumpmongorestorewindow 搭建mongodb 副本集rs1rs2rs3启动rs1、rs2、rs3配置添加节点(题外)将mongodb加入window服务,开机自启动window mongodb 测试全量备份、增量备份与还原数据准备1全量备份数据准备2增量备份删除测试记录,不要在生产环境测试!!!还原全量备份还原增量备份参考资料window mongodb自动备份全量备份 backupAll.bat增量备份 backupOplog.batwindow任务计划定时执行全量备份window任务计划定时执行增量备份mongodb副本集如何添加、删除新节点呢?rs4添加新节点验证添加新节点是否成功删除副本节点删除副本节点 注意事项删除节点错误示范***单机 mongodb 如何变成副本集呢?mongodb如何做差异备份呢?其他问题This node was not started with the replSet optionFailed: bad option: --oplog mode only supported on full dumpsFailed: no oplog file to replay; make sure you run mongodump with --oplogmongorestore 恢复失败。插入主键冲突not master and slaveOk=falsenot master NotWritablePrimaryNew config is rejected :: caused by :: replSetReconfig should only be run on a writable PRIMARY. Current state SECONDARY;Reconfig attempted to install a config that would change the implicit default write concern. Use the setDefaultRWConcern command to set a cluster-wide write concern and try the reconfig again 删除仲裁(副)节点报错如何将副节点转成仲裁节点,仲裁节点转成副节点,Quorum check failed because not enough voting nodes responded; required 2 but only the following 1 voting nodes responded: localhost:27007; the following nodes did not respond affirmatively: localhost:27009 failed with Error connecting to localhost:27009 (127.0.0.1:27009)修改配置文件(投票数)报错:caused by :: BSON field 'votes' value must be <= 1, actual value '2'修改配置文件(投票数)报错:caused by :: priority must be 0 when non-voting (votes:0)删除仲裁节点报错:Rejecting reconfig where the new config has a PSA topology and the secondary is electable, but the old config contains only one writable nodemongodb备份的磁盘占用,备份时间(局域网)。其他

全量备份、差异备份、增量备份

u=3157406177,12331095&fm=253&app=138&f=JPEG

看图写字:

资源占比

如周日做了一个备份共 10G ,往后每天产生 1G 数据。在大数据的角度来看的话增量备份优势还是很大的。而且从时间上来看备份 1G 数据明显要比备份十几G数据所花费的时间要少。

备份占用空间:全量备份 > 差异备份 > 增量备份

备份花费时间:全量备份 > 差异备份 > 增量备份

 
全量备份10+111+112+113+114+115+181
差异备份11+12+13+14+15+121
增量备份1111116
还原复杂度

为何要备份数据?备份就是为还原做准备的,那我们再看看这三种模式还原又有什么表现呢?

如周四数据出现问题,我们要将整个数据回退到周三前的数据。

备份还原复杂度:增量备份 > 差异备份 > 全量备份

 备份还原操作
全量备份直接找到周三的(全量)备份,还原即可
差异备份先找最近一次(周日)的全量备份A,再找周三的(差异)备份B。
先还原全量备份A,再还原差异备份B
增量备份先找最近一次(周日)的全量备份A,再找周一到周三的增量备份(B、C、D)
先还原全量备份A,再还原差异备份B、C、D。顺序不能乱,也不要缺失任何一份增量备份数据
备份数据缺失

如周四数据出现问题,我们要将整个数据回退到周三前的数据,可周二的备份数据被删除了,或者周二备份失败了。这时候又会发生什么呢?

对于全量、差异备份,缺少周二的数据并没有太大影响,整体数据基本不会缺失;而对于增量备份,周二的数据无法恢复,整体数据会缺失周二的数据。

备份还原安全性:全量备份 > 差异备份 > 增量备份

掐头去尾取中间,大家都推荐用差异备份,如sql server默认的方式就是差异备份。而 mongodb 副本集有 oplog 的加持,做备份的时候大多都是增量备份,这也是我们今天要讲的内容。

其他

mongodb 单机无法做增量备份,只能做全量备份

关于这三者的区别与介绍可参考:全量备份/增量备份/差异备份说明 - 散尽浮华 - 博客园 (cnblogs.com)

工具准备

OS:window

mongodb v5.0.3 下载地址:MongoDB Community Download | MongoDB

mongodump、mongorestore 下载地址:Download MongoDB Command Line Database Tools | MongoDB

mongodump

备份所有库

--oplog 备份过程如果有插入数据,会将这些操作一起记到 oplog 文件,后续使用mongorestore 还原时指定 --oplogReplay 可以将全部数据还原,就不会出现漏数据的问题了。单机mongodb不能指定 --oplog 参数

-o 输出文件夹路径

基本语法

-u 用户名 -p 密码 没有账号密码可不填

-d 数据库名称 -c 集合名称 可不填,不填时默认备份全库全表

-q 搜索条件 可不填,要填的话一定要指定-d -c 的参数,这个搜索条件就是 -c 指定表的搜索条件。这里要写成 json 字符串,一定要写双引号,双引号的内部双引号或特殊符号要记得转义,如:

-q 要符合 mongo 的 json ,specifications/extended-json.rst at master · mongodb/specifications (github.com) 如:

image-20211106151311918

image-20211106151523389

mongorestore

基本语法

-u 用户名 -p 密码 没有账号密码可不填

-d 数据库名称 -c 集合名称 指定还原某个库、某个表,可不填,不填默认还原全库全表

--drop 还原过程中出现冲突时,先删除冲突数据,再进行还原。有时候还原过程中出现主键冲突时可以加上这个参数处理

--oplogReplay 配合 mongodump 的 --oplog 参数使用,如果你的备份没有使用 --oplog ,那么还原的时候就不要指定 --oplogReplay 参数

window 搭建mongodb 副本集

创建三个文件夹 rs1、rs2、rs3 ,分别代表三个 mongodb 服务

rs1 文件夹示例, rs2、rs3 基本都一样

image-20211105144526790

rs1
  1. 创建 db 文件夹,一定要创建
  2. 创建 mongodb.conf 文件,内容为
  1. 创建 mongodb.log 文件,内容留空,一定要创建
  2. 创建 start.bat 文件,启动程序,双击即可开启 mongodb 服务,内容为
rs2
  1. 创建 db 文件夹,一定要创建
  2. 创建 mongodb.conf 文件,内容为
  1. 创建 mongodb.log 文件,内容留空,一定要创建
  2. 创建 start.bat 文件,启动程序,双击即可开启 mongodb 服务,内容为
rs3
  1. 创建 db 文件夹,一定要创建
  2. 创建 mongodb.conf 文件,内容为
  1. 创建 mongodb.log 文件,内容留空,一定要创建
  2. 创建 start.bat 文件,启动程序,双击即可开启 mongodb 服务,内容为
启动rs1、rs2、rs3

分别双击 rs1、rs2、rs3 文件夹下的 start.bat 即可启动

配置添加节点

打开 cmd 窗口,按顺序执行以下命令

image-20211105144922792

(题外)将mongodb加入window服务,开机自启动

上面的 start.bat 启动的时候会留一个 cmd 窗口,一旦关闭这个窗口 mongodb 服务就无法访问了,对此我们可以将 mongodb 加到 window 服务,这样就比较方便了,以 rs1 为例,右键以管理员身份运行 startService.bat 即可。

image-20211108175325749

--config 指定配置文件

--install 安装为 window 服务

--serviceName 指定服务名 net start mongoDBr1 就是这个服务名

--serviceDisplayName 指定服务显示名 在服务列表显示的名称

--serviceDescription 指定服务描述 在服务列表显示的服务描述

image-20211108180531686

window mongodb 测试全量备份、增量备份与还原

再开一个 cmd 窗口,执行备份与还原操作(一定要开 cmd 窗口,不要开 powershell ,powerShell 执行 mongodump 和 mongorestore 命令会出现错误)。这个窗口不需要进入到 mongodb 环境

数据准备1

image-20211105145331314

全量备份

先执行一次全量备份

image-20211105145948133

数据准备2

image-20211105150221714

增量备份

首先增量备份有两个很重要的时间点:上次备份时间,当前时间。

如定时每天零点执行增量备份,我们上一次备份时间为:2021-08-08 00:00:00 ,那么我们

这次备份的时间段应该是 2021-08-08 00:00:00 至 2021-08-09 00:00:00,

下一次备份时间点是 2021-08-09 00:00:00 至 2021-08-10 00:00:00。

如果我们不记得上一次备份时间,我们可以通过bsondump来解析oplog.bson文件,取得上次备份(全量备份)的时间戳为:1636095484,当前时间戳为:1636099300

image-20211105175737841

执行增量备份,不要用 powerShell 执行,用 cmd、用 cmd、用 cmd

-d local -c oplog.rs 备份 local 库 oplog.rs 表下的记录

ts 仅备份 ts 大于等于 1636095484 小于 1636099300

ns 仅备份 test 开头

image-20211105181541888

删除测试记录,不要在生产环境测试!!!

image-20211105182144279

还原全量备份

image-20211105182726727

上图已还原 1001 条文档,我们来验证一下,还原成功

image-20211105182925847

还原增量备份

image-20211105183148875

上图已回放 1001 条 oplog 记录,我们再来验证一下,还原成功

image-20211105183410972

还原增量备份的时候要注意,一定要按照时间先后顺序还原,而且增量备份不可缺失,否则会造成数据缺失或者还原失败。

参考资料

mongodb的备份与还原,以及下面的这两个 bat 执行文件都是参考这个博客: windows下mongodb增量备份方案_芊芊寻的博客-CSDN博客

可能是我 mongodb 版本(v5.0.3)太高的原因,我按照这些博客进行测试时,不是很顺利,所以重新梳理了一番。

更多 mongodump 和 mongorestore 命令可参考:

mongodump/mongorestore命令详解 - 柴米油盐酱醋 - 博客园 (cnblogs.com)

MongoDB 逻辑备份工具mongodump--转发 - 北方客888 - 博客园 (cnblogs.com)

也可以查阅官方文档:

mongodump — MongoDB Database Tools

mongorestore — MongoDB Database Tools

bsondump — MongoDB Database Tools

window mongodb自动备份

全量备份:一月一次,每月一号凌晨两点

增量备份:一天一次,每天零点

全量备份 backupAll.bat

替换里面的相关路径和端口即可,执行一次会将本次执行的时间戳记录到 timestamp.txt ,供全量备份后的第一次增量备份使用。(可能有 bug ,如果 mongodump 执行很久,这个时间戳会提前,不知道 oplog 回放会不会受影响,上次测试单机 mongodb 备份 1T 的数据需要36个小时左右...)

增量备份 backupOplog.bat

如果存在 D:\Install\mongos\timestamp.txt 则 "上一次时间A" 取 timestamp.txt 内记录的时间戳,若不存在则 将当前时间减去 24 小时,得到"上一次时间A"(1天一次增量备份)

打开任务计划程序,建立任务让 window 自动执行这两个 bat 执行文件就好了。

window任务计划定时执行全量备份

image-20211106100940794

image-20211106101050576

这里开始时间选择凌晨2点,月份选择全部月份,天选择1,即每月一号凌晨两点执行一次全量备份

image-20211106140053797

选择 bat 执行文件

image-20211106115205247

image-20211106115114059

image-20211106120235571

这个列表需要关注两列,一列是下次运行时间栏,还有就是状态栏。为了测试我们可以直接选中任务,右键执行一次看看是否成功。

image-20211106120712830

window任务计划定时执行增量备份

和上面的步骤没多大区别,主要是时间选择那里调整一下就可以了。

如下图参数,每天零点执行一次增量备份

image-20211106135940906

mongodb副本集如何添加、删除新节点呢?

如增加 rs4 ,测试后再将其删除。默认只有主节点可以添加、删除新节点

rs4
  1. 创建 db 文件夹,一定要创建
  2. 创建 mongodb.conf 文件,内容为
  1. 创建 mongodb.log 文件,内容留空,一定要创建
  2. 创建 start.bat 文件,启动程序,双击即可开启 mongodb 服务,内容为

双击 start.bat 启动 s4 mongodb 服务

添加新节点

打开 cmd 依次执行以下命令

image-20211106142855866

验证添加新节点是否成功

依次执行以下命令

image-20211106143330468

删除副本节点

依次执行以下命令

image-20211106143546575

删除副本节点 注意事项

如果我们的副本节点一共只有三个节点(一主一副一仲裁),那么我们删除节点时不能直接删除

如当我们副本集只有三个节点,我们要删除 27008 副本节点,如何实现?

image-20211108121439321

删除节点错误示范***

那如果直接删除27008节点会怎么样呢?

image-20211108122007657

上述代码执行成功后确实已经将 27008 节点成功删除,但是我们再去添加新节点或者删除 27009 节点时都是失败的。但是仍然可以操作数据库,这种可以修改当前的写关注。下面有

rs.add("") 添加节点无反应是直接删除 27008 节点造成的。

image-20211108122822166

单机 mongodb 如何变成副本集呢?

如 rs1 原本为单机 mongodb ,我们要怎样在 rs1 的数据基础上搭建集群呢?

其实很简单的,我们只需要在 rs1 的 mongodb.conf 文件加一项配置:replSet = testrs,然后再将 rs2、rs3 一起加进来即可

mongodb如何做差异备份呢?

虽然没有人这样做,但是如果非要这样做的话,我想应该也是很简单的。

我们只需要记住全量备份的时间戳A,后续的备份都用这个时间戳A来判断,一直到下一次全量备份如下:

第一次差异备份的时间段:时间戳A 至 第一次备份的当前时间

第二次差异备份的时间段:时间戳A 至 第二次备份的当前时间

第三次差异备份的时间段:时间戳A 至 第三次备份的当前时间

...

 

其他问题

This node was not started with the replSet option

这个节点没有设置 replSet ,通常是你本地运行了一个端口为 27017 的单机 mongodb 程序,然后你的集群里面又有 27017 节点,所以要么改 27017 节点的端口,要么杀死 27017 的程序

Failed: bad option: --oplog mode only supported on full dumps

--oplog 仅支持全库备份

mongodb - mongodump with replica set with oplog throws error: "oplog mode is only supported on full dumps" - Stack Overflow

image-20211030171446560

Failed: no oplog file to replay; make sure you run mongodump with --oplog

没有 oplog 可以回放,所以这个 mongorestore 命令不要指定 --oplogReplay 参数。

--oplog 和 --oplogReplay 是一起出现的,当然了,增量备份不允许指定 --oplog 参数,但在全量备份指定 --oplog 参数情况下,还原增量备份却可以指定 --oplogReplay 参数

image-20211030171429805

mongorestore 恢复失败。插入主键冲突

mongorestore 指定 --drop 参数。当还原发生冲突,先删除冲突项再进行还原

image-20211030172336449

not master and slaveOk=false

刚搭建好的副本集,副本节点要先执行 rs.secondaryOk() 命令才可以读取数据。

image-20211030173858416

not master NotWritablePrimary

副本节点无法写入

New config is rejected :: caused by :: replSetReconfig should only be run on a writable PRIMARY. Current state SECONDARY;

副本节点无法添加、删除节点

image-20211106142807403

Reconfig attempted to install a config that would change the implicit default write concern. Use the setDefaultRWConcern command to set a cluster-wide write concern and try the reconfig again 删除仲裁(副)节点报错

删除仲裁(副)节点报错,默认情况一主一副一仲裁下无法直接删除仲裁(副)节点

image-20211108144519663

如何将副节点转成仲裁节点,仲裁节点转成副节点,

不能直接改配置文件,要先将该副节点移除,然后再以仲裁节点的身份加回来,这里仅演示 副节点转成仲裁节点 这两个都是一样的逻辑

New and old configurations differ in the setting of the arbiterOnly field for member localhost:27008; to make this change, remove then re-add the member

image-20211108145212638

如三个节点(一主两副)将一个副节点 27008 转成仲裁节点。

  1. 先加一个副本节点 27010
  2. 再移除副节点 27008(为什么不直接移除请看下面一个问题)
  3. 再将27008添加为仲裁节点(添加前应先把db文件夹删除了,可以减少磁盘空间)
  4. 最后删除新增的副本节点27010。

image-20211108155148239

Quorum check failed because not enough voting nodes responded; required 2 but only the following 1 voting nodes responded: localhost:27007; the following nodes did not respond affirmatively: localhost:27009 failed with Error connecting to localhost:27009 (127.0.0.1:27009)

三个节点(一主两副)移除副节点失败。移除了一个那么剩下两个节点,会出现平票的现象(1:1)。这时我们不要去改配置文件里面的投票数,应该再加一个节点(最好是添加副节点,其实大家都不建议用仲裁节点的),然后再将目标节点移除

image-20211108151143087

修改配置文件(投票数)报错:caused by :: BSON field 'votes' value must be <= 1, actual value '2'

节点的投票数不能大于1

修改配置文件(投票数)报错:caused by :: priority must be 0 when non-voting (votes:0)

节点的投票数如果为0,那么他的优先级也要设为0

删除仲裁节点报错:Rejecting reconfig where the new config has a PSA topology and the secondary is electable, but the old config contains only one writable node

如在四个节点(一主一副两仲裁)副本集中删除 27008 仲裁节点(变成一主一副一仲裁) 。

image-20211108152856863

只要加一个新的副本节点就可以解决了。

  1. 先加一个副本节点27011
  2. 再删目标仲裁节点27008
  3. 再删除新加的副本节点27011。

其实好多问题都是出现在偶数节点的情况,这也是大家不建议用偶数节点的原因。

image-20211108153217007

mongodb备份的磁盘占用,备份时间(局域网)。

image-20211108160706321

总文件大小:750G时间备份文件大小
单机 mongodump36小时800G
副本集 mongodump --oplog xxx45个小时1.2T

image-20211108161433801

 

 

 

总数据大小:750G,在这个数据的基础上搭建副本集,一主一副一仲裁。

总文件大小:750G主节点服务器副节点服务器仲裁节点服务器
全量备份前750G300M300M
全量备份后750G400G310M

不知道后面主节点和副节点服务器占用磁盘看见会不会基本持平,仲裁节点不需要耗费太大资源,所以预算少的话,一主一副一仲裁还是挺不错的方案。

其他

文件夹结构与相关命令 logerlink/mongoRepDemo (github.com)

mongorestore 没测,本来只想整理备份与还原的内容,谁知越操作问题越多,最后都整的一锅粥了。

edg冠军了。