概述
早前,在Percona for MongoDB上手一文中提到Percona版本的MongoDB支持热备份,现在Percona已经将该功能独立出来,让你可以在社区版的MongoDB replset或集群上进行备份,支持MongoDB3.6或更高版本。
Percona Backup For MongoDB的组件如下:
- pbm-agent:运行在集群或副本集每个节点上的进程,用于执行备份或恢复操作
- pbm:pbm是向pbm-agent下达操作指令的程序
- pbm control collections:控制集合用于存储配置数据和备份状态,pbm和pbm-agent都通过控制集合来检查备份状态并相互通信
- remote backup storage:远程备份存储是保存备份文件的位置,可以是S3存储,也可以是Filesystem
pbm-agent
备份需要本地连接一个pbm-agent实例到每个Mongod实例,这包括副本集的secondary节点和分片群集中的配置服务器副本节点。
当pbm-agent观察到pbm对控制集合的更新后,将触发备份和恢复操作,类似副本集选择primary节点的方法,pbm-agent在副本集选择一个节点执行备份或恢复的操作。
pbm
pbm可以通过一系列子命令来管理备份
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
$ pbm help
usage: pbm [<flags>] <command> [<args> ...]
Percona Backup for MongoDB
Flags:
--help Show context-sensitive help (also try --help-long
and --help-man).
--mongodb-uri=MONGODB-URI MongoDB connection string. Default value read from
environment variable PBM_MONGODB_URI.
Commands:
help [<command>...]
Show help.
config [<flags>]
Set, change or list the config
backup
Make backup
restore <backup_name>
Restore backup
delete-backup <backup_name> [<flags>]
Delete backup(s)
cancel-backup
Cancel backup
list [<flags>]
Backup list
version [<flags>]
PBM version info
|
pbm将配置值保存在控制集合中,通过更新和读取操作、日志等控制集合来启动和监视备份或恢复操作
pbm control collections
备份和配置的状态保存在MongoDB集群的集合或复制集中,他们主要保存在副本集或分片配置服务的admin数据库中
- admin.pbmConfig
- admin.pbmCmd(Used to define and trigger operations)
- admin.pbmLock(pbm-agent synchronization-lock structure)
- admin.pbmBackup (Log / status of each backup)
remote backup storage
如果远程备份存储设置为filesystem类型,可以通过pbm list命令查看备份集。其中的备份文件名称都是以UTC备份开始时间作为前缀,每个备份都有一个元数据文件。对于备份中的每个副本集:
- 有一个mongodump格式的压缩归档文件,它是集合的转储
- 覆盖备份时间的oplog的BSON文件转储
oplog备份的结束时间是备份快照的数据一致时间点
安装配置
下载介质
DownLoad Percona Backup For MongoDB
安装介质
1
|
[root@t-luhx01-v-szzb ~]# rpm -ivh percona-backup-mongodb-1.3.4-1.el7.x86_64.rpm
|
创建登陆用户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
db.getSiblingDB("admin").createRole({ "role": "pbmAnyAction",
"privileges": [
{ "resource": { "anyResource": true },
"actions": [ "anyAction" ]
}
],
"roles": []
});
db.getSiblingDB("admin").createUser({user: "pbmuser",
"pwd": "secretpwd",
"roles" : [
{ "db" : "admin", "role" : "readWrite", "collection": "" },
{ "db" : "admin", "role" : "backup" },
{ "db" : "admin", "role" : "clusterMonitor" },
{ "db" : "admin", "role" : "restore" },
{ "db" : "admin", "role" : "pbmAnyAction" }
]
});
|
编辑配置文件
1
2
3
4
5
|
[root@t-luhx01-v-szzb ~]# cat /etc/pbm-storage.conf
storage:
type: filesystem
filesystem:
path: /service/backup
|
初始化配置(分片选择Config节点执行)
1
|
[root@t-luhx01-v-szzb ~]# pbm config --file /etc/pbm-storage.conf --mongodb-uri "mongodb://pbmuser:secretpwd@10.0.139.161:20000,10.0.139.162:20000/?replicaSet=shard1"
|
Tips:如果想要修改配置可以执行pbm config –set修改单个配置值
备份恢复
创建备份
在完成前期配置后,就可以进行数据备份了,在执行备份之前需要先启动pbm-agent。分片集群中shard节点和config节点都需要启动,如果一台服务器有多个节点,应该启动多个pbm-agent一一对应。
1
|
[root@t-luhx01-v-szzb ~]# nohup pbm-agent --mongodb-uri "mongodb://pbmuser:secretpwd@10.0.139.161:20000,10.0.139.162:20000/?replicaSet=shard1" > /service/backup/logs/pbm-agent.$(hostname -s).20000.log 2>&1 &
|
启动pbm-agent之后就可以执行pbm backup启动备份了,在分片集群中,每个分片节点和Config节点都有pbm-agent进程直接将备份快照和oplog写到远程存储中,Mongos不参与备份。
1
|
[root@t-luhx01-v-szzb ~]# pbm backup --mongodb-uri "mongodb://pbmuser:secretpwd@10.0.139.161:20000,10.0.139.162:20000/?replicaSet=shard1" --compression=gzip
|
Tips:备份进度可以在pbm-agent日志中查看
备份完成后,可以查看备份集
1
2
3
|
[root@t-luhx01-v-szzb ~]# pbm list --mongodb-uri "mongodb://pbmuser:secretpwd@localhost:20000"
Backup history:
2020-11-25T14:44:33Z
|
如果备份过程中想要取消任务,可以执行pbm cancel-backup
取消当前正在运行的任务
1
2
|
[root@t-luhx01-v-szzb ~]# pbm cancel-backup
Backup cancellation has started
|
鉴于备份存储资源有限,需要清理历史备份文件,可以删除指定备份集或超过指定时间的备份集
1
|
[root@t-luhx01-v-szzb ~]# pbm delete-backup 2020-04-20T13:45:59Z
|
要删除指定时间前的备份,可以指定–older-than参数,并传递以下格式的时间戳
- %Y-%M-%DT%H:%M:%S (e.g. 2020-04-20T13:13:20)
- %Y-%M-%D (e.g. 2020-04-20)
恢复备份
要还原pbm backup的备份集,可以通过pbm store命令并提供需要还原的备份时间戳。在还原之前还需要注意以下几点:
- 从1.x版本开始,Percona Backup For MongoDB复制了Mongodump的行为,还原时只清理备份中包含的集合,对于备份之后,还原之前创建的集合不进行清理,需要在还原前手动执行db.dropDatabase()清理
- 在恢复运行过程中,阻止客户端访问数据库
- 如果启用了Point-in-Time Recovery,需要提前禁用,因为Point-in-Time Recovery和还原是不兼容的操作
1
|
$ pbm restore 2019-06-09T07:03:50Z
|
为避免恢复期间pbm-agent内存消耗,V1.3.2可以针对恢复在配置文件设置下列参数。
1
2
3
|
restore:
batchSize: 500
numInsertionWorkers: 10
|
在恢复分片集群前,需要进行下列配置:
- 停止分片balance
- 关闭所有mongos节点来阻止客户端连接
- 禁用Point-in-Time Recovery
需要注意的是,分片备份只能还原到分片集群中,在恢复期间,pbm-agent将数据写入集群primary节点,下列是分片集群恢复流程
有时我们希望异机恢复,将备份还原到一个新的环境中,目标环境要注意以下要点:
- 目标集群中的副本集名称和备份的副本集名称必须相同
- 新环境中的PBM配置必须指定为原始环境定义的同一远程存储,一旦通过pbm list查看到了原始环境中的备份,就可以运行pbm restore命令恢复
Point-in-Time Recovery
Point-in-Time Recovery可以将数据库还原到指定时间点,期间会从备份快照中恢复数据库,并重放oplog到指定时间点。Point-in-Time Recovery是v1.3.0加入的,需要启用pitr.enabled参数
1
|
[root@t-luhx01-v-szzb ~]# pbm config --set pitr.enabled=true
|
在启用Point-in-Time Recovery之后,pbm-agent会定期保存oplog片,一个片包含10分钟跨度的oplog事件,如果禁用时间点恢复或因备份快照操作的开始而中断,则时间可能会更短。oplog保存在远程存储的pbmPitr子目录中,片的名称反映开始时间和结束时间。
pbm list包括备份快照和恢复的有效时间范围。它还显示时间点恢复状态。
1
2
3
4
5
6
7
8
9
10
|
[root@t-luhx01-v-szzb ~]# pbm list
Backup snapshots:
2020-07-10T12:19:10Z
2020-07-14T10:44:44Z
2020-07-14T14:26:20Z
2020-07-17T16:46:59Z
PITR <on>:
2020-07-14T14:26:40 - 2020-07-16T17:27:26
2020-07-17T16:47:20 - 2020-07-17T16:57:55
|
还原和时间点恢复增量备份是不能同时运行,在还原数据库前需要先禁用Point-in-Time Recovery,再运行pbm restore并指定有效时间范围内的时间戳
1
2
|
$ pbm config --set pitr.enabled=false
$ pbm restore --time="2020-07-14T14:27:04"
|
在我们执行完恢复后,会修改oplog的时间线。因此,在还原指定时间戳之后和上一次备份前的所有日志都无效,应该手动发起一次新的备份
1
2
|
$ pbm backup
$ pbm config --set pitr.enabled=true
|
当我们手动删除备份时,基于此备份对应的oplog片也会一起删除。当启用时间点恢复时,与之相关的最新备份快照和oplog片将不会被删除。
备份性能
Percona针对MongoDB备份程序提供了一个pbm-speed-test工具,可以测试压缩和备份上传速度,用于分析备份性能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
$ /usr/bin/pbm-speed-test --help
usage: pbm-speed-test --mongodb-uri=MONGODB-URI [<flags>] <command> [<args> ...]
Percona Backup for MongoDB compression and upload speed test
Flags:
--help Show context-sensitive help (also try
--help-long and --help-man).
--mongodb-uri=MONGODB-URI MongoDB connection string
-c, --sample-collection=SAMPLE-COLLECTION
Set collection as the data source
-s, --size-gb=SIZE-GB Set data size in GB. Default 1
--compression=s2 Compression type
<none>/<gzip>/<snappy>/<lz4>/<s2>/<pgzip>
Commands:
help [<command>...]
Show help.
compression
Run compression test
storage
Run storage test
version [<flags>]
PBM version info
|
压缩测试
1
2
3
4
|
$ pbm-speed-test compression --compression=s2 --size-gb 10 --mongodb-uri "mongodb://root:Abcd123#@localhost:20000"
Test started ....
10.00GB sent in 8s.
Avg upload rate = 1217.13MB/s.
|
备份速度测试
1
2
3
4
|
$ pbm-speed-test storage --compression=s2 --mongodb-uri "mongodb://root:Abcd123#@localhost:20000"
Test started
1.00GB sent in 1s.
Avg upload rate = 1744.43MB/s.
|
pbm-speed-test默认采用半随机数据进行测试,如果要基于现有集合进行测试,请设置–sample-collection选项
更多内容请参考Percona Backup for MongoDB Documentation