window mongodb复制集全量备份与增量备份
>全量备份、差异备份、增量备份资源占比还原复杂度备份数据缺失其他工具准备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备份的磁盘占用,备份时间(局域网)。其他
全量备份、差异备份、增量备份

看图写字:
资源占比
如周日做了一个备份共 10G ,往后每天产生 1G 数据。在大数据的角度来看的话增量备份优势还是很大的。而且从时间上来看备份 1G 数据明显要比备份十几G数据所花费的时间要少。
备份占用空间:全量备份 > 差异备份 > 增量备份
备份花费时间:全量备份 > 差异备份 > 增量备份
| 一 | 二 | 三 | 四 | 五 | 六 | 总 | |
|---|---|---|---|---|---|---|---|
| 全量备份 | 10+1 | 11+1 | 12+1 | 13+1 | 14+1 | 15+1 | 81 |
| 差异备份 | 1 | 1+1 | 2+1 | 3+1 | 4+1 | 5+1 | 21 |
| 增量备份 | 1 | 1 | 1 | 1 | 1 | 1 | 6 |
还原复杂度
为何要备份数据?备份就是为还原做准备的,那我们再看看这三种模式还原又有什么表现呢?
如周四数据出现问题,我们要将整个数据回退到周三前的数据。
备份还原复杂度:增量备份 > 差异备份 > 全量备份
| 备份还原操作 | |
|---|---|
| 全量备份 | 直接找到周三的(全量)备份,还原即可 |
| 差异备份 | 先找最近一次(周日)的全量备份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
备份所有库
mongodump -h 链接地址:端口 --oplog -o 输出文件夹路径--oplog 备份过程如果有插入数据,会将这些操作一起记到 oplog 文件,后续使用mongorestore 还原时指定 --oplogReplay 可以将全部数据还原,就不会出现漏数据的问题了。单机mongodb不能指定 --oplog 参数
-o 输出文件夹路径
基本语法
xxxxxxxxxxmongodump -h 链接地址:端口 -u 用户名 -p 密码 -d 数据库名称 -c 集合名称 -q 搜索条件 --oplog -o 备份输出文件夹路径-u 用户名 -p 密码 没有账号密码可不填
-d 数据库名称 -c 集合名称 可不填,不填时默认备份全库全表
-q 搜索条件 可不填,要填的话一定要指定-d -c 的参数,这个搜索条件就是 -c 指定表的搜索条件。这里要写成 json 字符串,一定要写双引号,双引号的内部双引号或特殊符号要记得转义,如:
xxxxxxxxxx-q "{\"name\":\"xiaoming\"}"-q 要符合 mongo 的 json ,specifications/extended-json.rst at master · mongodb/specifications (github.com) 如:
xxxxxxxxxxuse local//举例:搜索local库oplog.rs集合中 ts小于1635929573 且 ns以test开头的记录//mongodb 正常的搜索db.oplog.rs.find({ts:{$gt:Timestamp(1635929573,1)},ns:/^test/})
xxxxxxxxxx//mongodump 的查询要写成-q "{\"ts\":{\"$gt\":{\"$timestamp\":{\"t\":1635929573,\"i\":1}}},\"ns\":{\"$regex\":\"^test\"}}"// 非转义 {"ts":{"$gt":{"$timestamp":{"t":1635929573,"i":1}}},"ns":{"$regex":"^test"}}// ***特别注意的是:这个-q的查询,用mongodb正常查询是查不出来记录的 如下:// db.oplog.rs.find({"ts":{"$lt":{"$timestamp":{"t":1635929573,"i":1}}},"ns":{"$regex":"^test"}})// ***这样是查不出来记录的
mongorestore
基本语法
xxxxxxxxxxmongorestore -h 链接地址:端口 -u 用户名 -p 密码 -d 数据库名称 -c 集合名称 --drop --oplogReplay 指定还原的文件夹路径-u 用户名 -p 密码 没有账号密码可不填
-d 数据库名称 -c 集合名称 指定还原某个库、某个表,可不填,不填默认还原全库全表
--drop 还原过程中出现冲突时,先删除冲突数据,再进行还原。有时候还原过程中出现主键冲突时可以加上这个参数处理
--oplogReplay 配合 mongodump 的 --oplog 参数使用,如果你的备份没有使用 --oplog ,那么还原的时候就不要指定 --oplogReplay 参数
window 搭建mongodb 副本集
创建三个文件夹 rs1、rs2、rs3 ,分别代表三个 mongodb 服务
rs1 文件夹示例, rs2、rs3 基本都一样

rs1
- 创建 db 文件夹,一定要创建
- 创建 mongodb.conf 文件,内容为
xxxxxxxxxxdbpath=D:\Install\mongos\rs1\dblogpath=D:\Install\mongos\rs1\mongodb.loglogappend=truejournal=truequiet=trueport=27007replSet = testrs- 创建 mongodb.log 文件,内容留空,一定要创建
- 创建 start.bat 文件,启动程序,双击即可开启 mongodb 服务,内容为
xxxxxxxxxxcd D:\Install\mongodb5\binmongod --config D:\Install\mongos\rs1\mongodb.confrs2
- 创建 db 文件夹,一定要创建
- 创建 mongodb.conf 文件,内容为
xxxxxxxxxxdbpath=D:\Install\mongos\rs2\dblogpath=D:\Install\mongos\rs2\mongodb.loglogappend=truejournal=truequiet=trueport=27008replSet = testrs- 创建 mongodb.log 文件,内容留空,一定要创建
- 创建 start.bat 文件,启动程序,双击即可开启 mongodb 服务,内容为
xxxxxxxxxxcd D:\Install\mongodb5\binmongod --config D:\Install\mongos\rs2\mongodb.confrs3
- 创建 db 文件夹,一定要创建
- 创建 mongodb.conf 文件,内容为
xxxxxxxxxxdbpath=D:\Install\mongos\rs3\dblogpath=D:\Install\mongos\rs3\mongodb.loglogappend=truejournal=truequiet=trueport=27009replSet = testrs- 创建 mongodb.log 文件,内容留空,一定要创建
- 创建 start.bat 文件,启动程序,双击即可开启 mongodb 服务,内容为
xxxxxxxxxxcd D:\Install\mongodb5\binmongod --config D:\Install\mongos\rs3\mongodb.conf启动rs1、rs2、rs3
分别双击 rs1、rs2、rs3 文件夹下的 start.bat 即可启动
配置添加节点
打开 cmd 窗口,按顺序执行以下命令
xxxxxxxxxx#进入到 mongodb环境mongo localhost:27007# 切到admin库use admin# 定义变量# priority 优先级 同等条件下优先级越高 越容易被选举为主节点# arbiterOnly 该节点为仲裁节点,仅用于内部选举,无法读写数据cfg={ _id:"testrs", members:[ {_id:0,host:'localhost:27007',priority:2}, {_id:1,host:'localhost:27008',priority:1}, {_id:2,host:'localhost:27009',arbiterOnly:true}] };# 初始化节点配置rs.initiate(cfg)# 查看节点配置rs.status()
(题外)将mongodb加入window服务,开机自启动
上面的 start.bat 启动的时候会留一个 cmd 窗口,一旦关闭这个窗口 mongodb 服务就无法访问了,对此我们可以将 mongodb 加到 window 服务,这样就比较方便了,以 rs1 为例,右键以管理员身份运行 startService.bat 即可。

xxxxxxxxxxD:\Install\mongodb5\bin\mongod.exe --config "D:\Install\mongos\rs1\mongodb.conf" --install --serviceName "mongoDBr1" --serviceDisplayName "mongoDBr1" --serviceDescription "mongoDBr1"net start mongoDBr1--config 指定配置文件
--install 安装为 window 服务
--serviceName 指定服务名 net start mongoDBr1 就是这个服务名
--serviceDisplayName 指定服务显示名 在服务列表显示的名称
--serviceDescription 指定服务描述 在服务列表显示的服务描述

window mongodb 测试全量备份、增量备份与还原
再开一个 cmd 窗口,执行备份与还原操作(一定要开 cmd 窗口,不要开 powershell ,powerShell 执行 mongodump 和 mongorestore 命令会出现错误)。这个窗口不需要进入到 mongodb 环境
数据准备1
xxxxxxxxxx# 切换到test 库use test# for循环 写入1001条数据for(var i=0;i<=1000;i++){db.user.insert({name:'num'+i})}
全量备份
先执行一次全量备份
xxxxxxxxxxmongodump -h localhost:27007 --oplog -o D:\Install\mongos\backup\backup_20211105\full
数据准备2
xxxxxxxxxx# for循环 再写入1001条数据for(var i=0;i<=1000;i++){db.user.insert({name:'number'+i})}
增量备份
首先增量备份有两个很重要的时间点:上次备份时间,当前时间。
如定时每天零点执行增量备份,我们上一次备份时间为: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
xxxxxxxxxx# 在执行mongodump 时指定 --oplog才会生成 oplog.bson 文件bsondump D:\Install\mongos\backup\backup_20211105\full\oplog.bson
执行增量备份,不要用 powerShell 执行,用 cmd、用 cmd、用 cmd
xxxxxxxxxxmongodump -h localhost:27007 -d local -c oplog.rs --query "{\"ts\":{\"$lt\":{\"$timestamp\":{\"t\":1636099300,\"i\":1}},\"$gte\":{\"$timestamp\":{\"t\":1636095484,\"i\":1}}},\"ns\":{\"$regex\":\"^test\"}}" -o D:\Install\mongos\backup\backup_oplog_202111051601-d local -c oplog.rs 备份 local 库 oplog.rs 表下的记录
ts 仅备份 ts 大于等于 1636095484 小于 1636099300
ns 仅备份 test 开头

删除测试记录,不要在生产环境测试!!!
xxxxxxxxxx# 删除user 表db.user.drop()
还原全量备份
xxxxxxxxxx# 还原路径 全量备份指定的是什么路径 这里就填什么路径mongorestore -h localhost:27007 --drop --oplogReplay D:\Install\mongos\backup\backup_20211105\full
上图已还原 1001 条文档,我们来验证一下,还原成功

还原增量备份
xxxxxxxxxx# 还原路径 增量备份指定的是什么路径 这里就填什么路径mongorestore -h localhost:27007 --oplogReplay D:\Install\mongos\backup\backup_oplog_202111051601
上图已回放 1001 条 oplog 记录,我们再来验证一下,还原成功

还原增量备份的时候要注意,一定要按照时间先后顺序还原,而且增量备份不可缺失,否则会造成数据缺失或者还原失败。
参考资料
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个小时左右...)
xrem ******Mongodb full backup start******@echo off
set "Ymd=%date:~0,4%%date:~5,2%%date:~8,2%0%time:~0,2%%time:~3,2%%time:~6,2%"
set backupFile=D:\Install\mongos\backup\backup_%Ymd%\full\
md %backupFile%
echo 【全量备份】备份文件夹:%backupFile% >>D:\Install\mongos\log.txtecho 【全量备份】命令: "D:\Install\mongodb5\bin\mongodump.exe" --host=localhost --port=27007 --oplog -o D:\Install\mongos\backup\backup_%Ymd%\full\ >>D:\Install\mongos\log.txt
"D:\Install\mongodb5\bin\mongodump.exe" --host=localhost --port=27007 --oplog -o D:\Install\mongos\backup\backup_%Ymd%\full\
set "TimeNow=%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2%"echo 【全量备份】成功。时间为:%TimeNow% >>D:\Install\mongos\log.txt
:: 记录当前全备份的时间戳echo wscript.echo DateDiff("s", "01/01/1970 00:00:00", Now())>D:\Install\mongos\sjc.vbsfor /f %%i in ('cscript sjc.vbs /nologo') do set endDate=%%irem 减掉8小时时差set /a "endDate=%endDate%-28800"
echo %endDate% >D:\Install\mongos\timestamp.txt
@echo onrem ******Mongodb full backup end******增量备份 backupOplog.bat
如果存在 D:\Install\mongos\timestamp.txt 则 "上一次时间A" 取 timestamp.txt 内记录的时间戳,若不存在则 将当前时间减去 24 小时,得到"上一次时间A"(1天一次增量备份)
xxxxxxxxxxrem ******MongoDB backup start********@echo off&setlocal enabledelayedexpansion
echo wscript.echo DateDiff("s", "01/01/1970 00:00:00", Date())>D:\Install\mongos\sjc.vbsfor /f %%i in ('cscript sjc.vbs /nologo') do set endDate=%%i:: 减8小时 set /a "endDate=%endDate%-28800":: 86400 减一天 3600 减一个小时 300 减5分钟set /a "startDate=%endDate%-86400"
set timeFile=D:\Install\mongos\timestamp.txtif exist %timeFile% (
rem 读取文件第一列 for /f %%a in (%timeFile%) do set startDate=%%a :: 删除txt del %timeFile%)
set "Ymd=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%"
set backupFile=D:\Install\mongos\backup\backup_oplog_%Ymd%\md %backupFile%
echo %startDate%
echo 【增量备份】时间为:%startDate% 至 %endDate%,备份文件夹:%backupFile% >>D:\Install\mongos\log.txtecho 【增量备份】命令:"D:\Install\mongodb5\bin\mongodump.exe" --host=localhost --port=27007 -d local -c oplog.rs --query "{\"ts\":{\"$lt\":{\"$timestamp\":{\"t\":%endDate%,\"i\":1}},\"$gt\":{\"$timestamp\":{\"t\":%startDate%,\"i\":1}}},\"ns\":{\"$regex\":\"^test\"}}" -o %backupFile% >>D:\Install\mongos\log.txt
"D:\Install\mongodb5\bin\mongodump.exe" --host=localhost --port=27007 -d local -c oplog.rs --query "{\"ts\":{\"$lt\":{\"$timestamp\":{\"t\":%endDate%,\"i\":1}},\"$gte\":{\"$timestamp\":{\"t\":%startDate%,\"i\":1}}},\"ns\":{\"$regex\":\"^test\"}}" -o %backupFile%
set "TimeNow=%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2%"echo 【增量备份】成功。时间为:%TimeNow% >>D:\Install\mongos\log.txt@echo onrem ******MongoDB backup end********打开任务计划程序,建立任务让 window 自动执行这两个 bat 执行文件就好了。
window任务计划定时执行全量备份


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

选择 bat 执行文件



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

window任务计划定时执行增量备份
和上面的步骤没多大区别,主要是时间选择那里调整一下就可以了。
如下图参数,每天零点执行一次增量备份

mongodb副本集如何添加、删除新节点呢?
如增加 rs4 ,测试后再将其删除。默认只有主节点可以添加、删除新节点
rs4
- 创建 db 文件夹,一定要创建
- 创建 mongodb.conf 文件,内容为
xxxxxxxxxxdbpath=D:\Install\mongos\rs4\dblogpath=D:\Install\mongos\rs4\mongodb.loglogappend=truejournal=truequiet=trueport=27010replSet = testrs- 创建 mongodb.log 文件,内容留空,一定要创建
- 创建 start.bat 文件,启动程序,双击即可开启 mongodb 服务,内容为
xxxxxxxxxxcd D:\Install\mongodb5\binmongod --config D:\Install\mongos\rs4\mongodb.conf双击 start.bat 启动 s4 mongodb 服务
添加新节点
打开 cmd 依次执行以下命令
xxxxxxxxxx# 连接到主节点mongo localhost:27007
use admin
# 27010为rs4的端口rs.add("localhost:27010")
# 查看副本集状态和成员信息rs.status()
验证添加新节点是否成功
依次执行以下命令
xxxxxxxxxxmongo localhost:27010
# 接受成为副本节点rs.secondaryOk()
# 切换到test 库use test
# 查询 有数据则成功db.user.find().count()
删除副本节点
依次执行以下命令
xxxxxxxxxx# 连接到主节点mongo localhost:27007
use admin
# 27010为rs4的端口rs.remove("localhost:27010")
# 查看副本集状态和成员信息rs.status()
删除副本节点 注意事项
如果我们的副本节点一共只有三个节点(一主一副一仲裁),那么我们删除节点时不能直接删除
如当我们副本集只有三个节点,我们要删除 27008 副本节点,如何实现?
xxxxxxxxxx# 添加 27010 节点rs.add("localhost: 27010")# 查看当前副本集节点个数 4rs.conf().members.length# 删除 27008 节点rs.remove("localhost:27008")# 查看副本集状态rs.status()
删除节点错误示范***
那如果直接删除27008节点会怎么样呢?
xxxxxxxxxx# 查看当前副本集节点个数 rs.conf().members.length# 删除 27008 节点rs.remove("localhost:27008")# 查看副本集状态rs.status()
上述代码执行成功后确实已经将 27008 节点成功删除,但是我们再去添加新节点或者删除 27009 节点时都是失败的。但是仍然可以操作数据库,这种可以修改当前的写关注。下面有
rs.add("") 添加节点无反应是直接删除 27008 节点造成的。

单机 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 仅支持全库备份

Failed: no oplog file to replay; make sure you run mongodump with --oplog
没有 oplog 可以回放,所以这个 mongorestore 命令不要指定 --oplogReplay 参数。
--oplog 和 --oplogReplay 是一起出现的,当然了,增量备份不允许指定 --oplog 参数,但在全量备份指定 --oplog 参数情况下,还原增量备份却可以指定 --oplogReplay 参数
xxxxxxxxxxmongodump --oplog ..... #生成 oplog 文件
mongorestore --oplogReplay .... #回放 oplog
mongorestore 恢复失败。插入主键冲突
mongorestore 指定 --drop 参数。当还原发生冲突,先删除冲突项再进行还原

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

not master NotWritablePrimary
副本节点无法写入
New 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 删除仲裁(副)节点报错
删除仲裁(副)节点报错,默认情况一主一副一仲裁下无法直接删除仲裁(副)节点
xxxxxxxxxx# 先修改写关注db.adminCommand({ "setDefaultRWConcern" : 1, "defaultWriteConcern" : { "w" : 2 }})# 移除仲裁节点 27009rs.remove("localhost:27009")
如何将副节点转成仲裁节点,仲裁节点转成副节点,
不能直接改配置文件,要先将该副节点移除,然后再以仲裁节点的身份加回来,这里仅演示 副节点转成仲裁节点 这两个都是一样的逻辑
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

如三个节点(一主两副)将一个副节点 27008 转成仲裁节点。
- 先加一个副本节点 27010
- 再移除副节点 27008(为什么不直接移除请看下面一个问题)
- 再将27008添加为仲裁节点(添加前应先把db文件夹删除了,可以减少磁盘空间)
- 最后删除新增的副本节点27010。
xxxxxxxxxx# 查看当前节点数 3rs.conf().members.length# 添加一个新副本节点 27010 一定要是副本节点rs.add("localhost:27010")# 查看当前节点数 4rs.conf().members.length# 移除副本节点 27008rs.remove("localhost:27008")# 添加仲裁节点 27008rs.addArb("localhost:27008")# 移除新增的副本节点 27010rs.remove("localhost:27010")
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)。这时我们不要去改配置文件里面的投票数,应该再加一个节点(最好是添加副节点,其实大家都不建议用仲裁节点的),然后再将目标节点移除
xxxxxxxxxx# 查看当前节点数 3rs.conf().members.length# 添加一个新节点 27010rs.addArb("localhost:27010")# 查看当前节点数 4rs.conf().members.length# 移除仲裁节点 27008rs.remove("localhost:27008")
修改配置文件(投票数)报错: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 仲裁节点(变成一主一副一仲裁) 。

只要加一个新的副本节点就可以解决了。
- 先加一个副本节点27011
- 再删目标仲裁节点27008
- 再删除新加的副本节点27011。
其实好多问题都是出现在偶数节点的情况,这也是大家不建议用偶数节点的原因。
xxxxxxxxxx# 原节点数 4rs.conf().members.length# 添加副本节点 rs.add("localhost:27011")# 删除目标仲裁节点 27008rs.remove("localhost:27008")# 删除新加的副本节点rs.remove("localhost:27011")# 当前节点数 3 一主一副一仲裁rs.conf().members.length
mongodb备份的磁盘占用,备份时间(局域网)。

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

总数据大小:750G,在这个数据的基础上搭建副本集,一主一副一仲裁。
| 总文件大小:750G | 主节点服务器 | 副节点服务器 | 仲裁节点服务器 |
|---|---|---|---|
| 全量备份前 | 750G | 300M | 300M |
| 全量备份后 | 750G | 400G | 310M |
不知道后面主节点和副节点服务器占用磁盘看见会不会基本持平,仲裁节点不需要耗费太大资源,所以预算少的话,一主一副一仲裁还是挺不错的方案。
其他
文件夹结构与相关命令 logerlink/mongoRepDemo (github.com)
mongorestore 没测,本来只想整理备份与还原的内容,谁知越操作问题越多,最后都整的一锅粥了。
edg冠军了。