概述
早前,在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