概述

早前,在Percona for MongoDB上手一文中提到Percona版本的MongoDB支持热备份,现在Percona已经将该功能独立出来,让你可以在社区版的MongoDB replset或集群上进行备份,支持MongoDB3.6或更高版本。

Architecture

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可以通过一系列子命令来管理备份

$ 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

安装介质

[root@t-luhx01-v-szzb ~]# rpm -ivh percona-backup-mongodb-1.3.4-1.el7.x86_64.rpm

创建登陆用户

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" }
]
});

编辑配置文件

[root@t-luhx01-v-szzb ~]# cat /etc/pbm-storage.conf 
storage:
type: filesystem
filesystem:
path: /service/backup

初始化配置(分片选择Config节点执行)

[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一一对应。

[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不参与备份。

[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

pbm-backup-shard

Tips:备份进度可以在pbm-agent日志中查看

备份完成后,可以查看备份集

[root@t-luhx01-v-szzb ~]# pbm list --mongodb-uri "mongodb://pbmuser:secretpwd@localhost:20000"
Backup history:
2020-11-25T14:44:33Z

如果备份过程中想要取消任务,可以执行pbm cancel-backup取消当前正在运行的任务

[root@t-luhx01-v-szzb ~]# pbm cancel-backup
Backup cancellation has started

鉴于备份存储资源有限,需要清理历史备份文件,可以删除指定备份集或超过指定时间的备份集

[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和还原是不兼容的操作
    $ pbm restore 2019-06-09T07:03:50Z
    为避免恢复期间pbm-agent内存消耗,V1.3.2可以针对恢复在配置文件设置下列参数。
    restore:
    batchSize: 500
    numInsertionWorkers: 10

在恢复分片集群前,需要进行下列配置:

  1. 停止分片balance
  2. 关闭所有mongos节点来阻止客户端连接
  3. 禁用Point-in-Time Recovery

需要注意的是,分片备份只能还原到分片集群中,在恢复期间,pbm-agent将数据写入集群primary节点,下列是分片集群恢复流程
pbm-restore-shard

有时我们希望异机恢复,将备份还原到一个新的环境中,目标环境要注意以下要点:

  • 目标集群中的副本集名称和备份的副本集名称必须相同
  • 新环境中的PBM配置必须指定为原始环境定义的同一远程存储,一旦通过pbm list查看到了原始环境中的备份,就可以运行pbm restore命令恢复

Point-in-Time Recovery

Point-in-Time Recovery可以将数据库还原到指定时间点,期间会从备份快照中恢复数据库,并重放oplog到指定时间点。Point-in-Time Recovery是v1.3.0加入的,需要启用pitr.enabled参数

[root@t-luhx01-v-szzb ~]# pbm config --set pitr.enabled=true

在启用Point-in-Time Recovery之后,pbm-agent会定期保存oplog片,一个片包含10分钟跨度的oplog事件,如果禁用时间点恢复或因备份快照操作的开始而中断,则时间可能会更短。oplog保存在远程存储的pbmPitr子目录中,片的名称反映开始时间和结束时间。

pbm list包括备份快照和恢复的有效时间范围。它还显示时间点恢复状态。

[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并指定有效时间范围内的时间戳

$ pbm config --set pitr.enabled=false
$ pbm restore --time="2020-07-14T14:27:04"

在我们执行完恢复后,会修改oplog的时间线。因此,在还原指定时间戳之后和上一次备份前的所有日志都无效,应该手动发起一次新的备份

$ pbm backup
$ pbm config --set pitr.enabled=true

当我们手动删除备份时,基于此备份对应的oplog片也会一起删除。当启用时间点恢复时,与之相关的最新备份快照和oplog片将不会被删除。

备份性能

Percona针对MongoDB备份程序提供了一个pbm-speed-test工具,可以测试压缩和备份上传速度,用于分析备份性能

$ /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

压缩测试

$ 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.

备份速度测试

$ 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