MongoDB备份恢复工具pbm介绍

pbm全称percona backup mongodb,是percona公司提供的mongodb的备份恢复工具,支持percona mongodb,community mongodb,支持版本>v3.6,pbm底层是调用mongodump/mongorestore进行转储的逻辑备份,目前对分片集群的支持力度较弱,且不支持增量备份。

pbm部署

本次pbm部署基于v4.2 MongoDB副本集:

192.168.56.108 primary
192.168.56.109 secondary
192.168.56.110 arbiter
选择pbm版本:1.2.0(当前最新)
采用安装方式:rpm
  1. 安装pbm:(除arbiter外所有节点执行)
rpm -ivh percona-backup-mongodb-1.2.0-1.el7.x86_64.rpm

安装成功后/usr/bin下会多出三个可执行文件:


p1
  1. 创建pbm用户:(在主节点执行)
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. 创建yaml配置文件(在集群其中一台节点配置即可)
    pbm备份支持s3存储,远程文件系统服务器,仅单实例支持本地存储
    这里搭建了nfs服务器并挂载了远程目录/var/lib/mongobak
pbm_config.yaml
storage:
  type: filesystem
  filesystem:
    path: /var/lib/mongobak
  1. 进行初始化配置,指定存储类型(在创建yaml配置文件的那个节点执行)
pbm config --file /opt/pbm_config.yaml --mongodb-uri="mongodb://pbmuser:secretpwd@192.168.56.108:27017,192.168.56.109:27017,192.168.56.110:27017/?replicaSet=rs"
  1. 在每个实例启动pbm-agent代理进程
pbm-agent --mongodb-uri "mongodb://pbmuser:secretpwd@192.168.56.108:27017/" > /opt/pbm_agent.log 2>&1 &

到此pbm部署结束

pbm备份恢复

通过pbm list拉取备份列表

pbm list --mongodb-uri "mongodb://pbmuser:secretpwd@192.168.56.108:27017,192.168.56.109:27017/?replicaSet=rs"
Backup history:
  2020-06-23T09:03:40Z
  2020-06-23T09:24:53Z

PS:首次执行没有备份信息

pbm backup备份

单实例的备份不做介绍
副本集的备份指定集群连接串,可以在从节点进行备份(备份任务会根据集群内的节点繁忙程度选择最适合转储的节点)
pbm目前只支持全量备份恢复,在备份过程中会记录备份时段内的oplog

pbm backup --mongodb-uri "mongodb://pbmuser:secretpwd@192.168.56.108:27017,192.168.56.109:27017/?replicaSet=rs"

可以通过--compression=指定压缩类型(默认为s2,支持gzip, snappy, lz4, pgzip):

pbm backup --compression=gzip --mongodb-uri  "mongodb://pbmuser:secretpwd@192.168.56.108:27017,192.168.56.109:27017/?replicaSet=rs"

pbm备份底层调用mongodump

pbm agent is listening for the commands
2020/06/23 10:45:32 Got command backup [{backup {2020-06-23T02:45:31Z s2} { } 1592880331}]
2020/06/23 10:45:32 Backup 2020-06-23T02:45:31Z started on node rs/192.168.56.109:27017
2020-06-23T10:45:35.187+0800  writing admin.system.users to archive on stdout
2020-06-23T10:45:35.189+0800  done dumping admin.system.users (1 document)
2020-06-23T10:45:35.189+0800  writing admin.system.version to archive on stdout
2020-06-23T10:45:35.190+0800  done dumping admin.system.version (2 documents)
2020-06-23T10:45:35.191+0800  writing admin.pbmBackups to archive on stdout
2020-06-23T10:45:35.194+0800  done dumping admin.pbmBackups (1 document)
2020-06-23T10:45:35.194+0800  writing admin.pbmConfig to archive on stdout
2020-06-23T10:45:35.204+0800  done dumping admin.pbmConfig (1 document)
2020-06-23T10:45:35.204+0800  writing admin.pbmCmd to archive on stdout
2020-06-23T10:45:35.208+0800  done dumping admin.pbmCmd (2 documents)
2020-06-23T10:45:35.208+0800  writing admin.pbmLock to archive on stdout
2020-06-23T10:45:35.211+0800  done dumping admin.pbmLock (1 document)
2020-06-23T10:45:35.212+0800  writing test.test to archive on stdout
2020-06-23T10:45:35.215+0800  done dumping test.test (4 documents)
2020-06-23T10:45:35.215+0800  writing test.mj to archive on stdout
2020-06-23T10:45:35.218+0800  done dumping test.mj (3 documents)
2020/06/23 10:45:35 mongodump finished, waiting for the oplog
2020/06/23 10:45:39 Backup 2020-06-23T02:45:31Z finished

pbm restore恢复

restore:集群restore只能在主库恢复,且要保持服务启动
在恢复时,需要禁止业务写入


p2
pbm restore 2020-06-23T09:03:40Z --mongodb-uri "mongodb://pbmuser:secretpwd@192.168.56.108:27017,192.168.56.109:27017/?replicaSet=rs"

pbm恢复底层调用mongorestore

2020/06/23 17:04:28 Got command restore [{restore { } {2020-06-23T09:04:27.816797402Z 2020-06-23T09:03:40Z} 1592903067}]
2020/06/23 17:04:28 [INFO] Restore of '2020-06-23T09:03:40Z' started
2020-06-23T17:04:31.733+0800  preparing collections to restore from
2020-06-23T17:04:31.766+0800  reading metadata for admin.pbmRUsers from archive on stdin
2020-06-23T17:04:31.770+0800  restoring admin.pbmRUsers from archive on stdin
2020-06-23T17:04:33.737+0800  restoring indexes for collection admin.pbmRUsers from metadata
2020-06-23T17:04:33.746+0800  finished restoring admin.pbmRUsers (2 documents, 0 failures)
2020-06-23T17:04:33.746+0800  reading metadata for admin.pbmRRoles from archive on stdin
2020-06-23T17:04:33.750+0800  restoring admin.pbmRRoles from archive on stdin
2020-06-23T17:04:35.732+0800  restoring indexes for collection admin.pbmRRoles from metadata
2020-06-23T17:04:35.748+0800  finished restoring admin.pbmRRoles (1 document, 0 failures)
2020-06-23T17:04:35.759+0800  reading metadata for test.test from archive on stdin
2020-06-23T17:04:35.763+0800  restoring test.test from archive on stdin
2020-06-23T17:04:37.848+0800  no indexes to restore
2020-06-23T17:04:37.848+0800  finished restoring test.test (4 documents, 0 failures)
2020-06-23T17:04:37.851+0800  reading metadata for test.mj from archive on stdin
2020-06-23T17:04:37.855+0800  restoring test.mj from archive on stdin
2020-06-23T17:04:39.890+0800  no indexes to restore
2020-06-23T17:04:39.890+0800  finished restoring test.mj (3 documents, 0 failures)
2020/06/23 17:04:39 mongorestore finished
2020/06/23 17:04:41 starting the oplog replay
2020/06/23 17:04:41 oplog replay finished
2020/06/23 17:04:41 restoring users and roles
2020/06/23 17:04:41 deleting users
2020/06/23 17:04:41 inserting users
2020/06/23 17:04:41 inserted user

在从库执行恢复命令会提示Node in not suitable for restore,并自动将恢复任务切至主库:

2020/06/23 17:04:28 Got command restore [{restore { } {2020-06-23T09:04:27.816797402Z 2020-06-23T09:03:40Z} 1592903067}]
2020/06/23 17:04:28 Node in not suitable for restore

源码中体现为当前节点非主节点,直接return


p3

备份分片集群:

目前来看,备份分片集群的方式,也是针对每一个shard节点或者shard副本集进行备份,但是官方手册没有说明需要停止业务写入或者关闭balancer。
针对分片集群的恢复,需要提前关闭balancer,最直接的方式是关闭所有mongos节点。

关于增量备份:

pbm在进行全量备份是会记录一个详细的json:


{
  "name": "2020-06-23T09:24:53Z",
  "replsets": [
    {
      "name": "rs",
      "backup_name": "2020-06-23T09:24:53Z_rs.dump.s2",
      "oplog_name": "2020-06-23T09:24:53Z_rs.oplog.s2",
      "start_ts": 1592904293,
      "status": "done",
      "last_transition_ts": 1592904299,
      "last_write_ts": {
        "T": 1592904295,
        "I": 1
      },
      "conditions": [
        {
          "timestamp": 1592904293,
          "status": "running"
        },
        {
          "timestamp": 1592904296,
          "status": "dumpDone"
        },
        {
          "timestamp": 1592904299,
          "status": "done"
        }
      ]
    }
  ],
  "compression": "s2",
  "store": {
    "type": "filesystem",
    "s3": {
      "region": "",
      "endpointUrl": "",
      "bucket": "",
      "credentials": {
        "vault": {}
      }
    },
    "filesystem": {
      "path": "/var/lib/mongobak"
    }
  },
  "mongodb_version": "4.2.7",
  "start_ts": 1592904293,
  "last_transition_ts": 1592904300,
  "last_write_ts": {
    "T": 1592904295,
    "I": 1
  },
  "hb": {
    "T": 1592904298,
    "I": 1
  },
  "status": "done",
  "conditions": [
    {
      "timestamp": 1592904293,
      "status": "starting"
    },
    {
      "timestamp": 1592904295,
      "status": "running"
    },
    {
      "timestamp": 1592904297,
      "status": "dumpDone"
    },
    {
      "timestamp": 1592904300,
      "status": "done"
    }
  ]
}

从上json记录中可以获取最终的时间戳:1592904300,作为增量备份的开始时间戳
增量备份可以通过该命令实现基于oplog的增量备份

/mongodb/bin/mongodump -h 192.168.xxx.xxx --port $port  -d local -c oplog.rs  --query '{ts:{$gte:Timestamp('$paramBakStartDate',1),$lte:Timestamp('$paramBakEndDate',9999)}}' -o $bkdatapath/mongodboplog$bkfilename

END
————————————————————
更多技术文章欢迎关注微信公众号:数据库笔记

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,861评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,263评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,033评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,999评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,000评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,483评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,850评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,827评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,366评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,404评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,525评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,130评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,853评论 3 338
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,293评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,426评论 1 276
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,082评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,590评论 2 366