Percona Backup For MongoDB

概述

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

 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

pbm-backup-shard

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

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

  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参数

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

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus