技术分享 | PBM备份恢复

news/2024/7/24 14:06:24/

作者:张洪

爱可生南区 DBA 团队成员,主要负责mysql故障处理及相关技术支持。爱好旅游,摄影。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


概述

Percona Backup for MongoDB(PBM)是一个针对MongoDB副本集和分片的一致性备份开源工具,它支持逻辑备份、物理备份、增量备份以及选择性备份和恢复等特性,并且支持Point-in-Time恢复到指定时间点。

但非常可惜的是物理备份相关功能目前仅适用于Percona Server for MongoDB的分支,因此下面主要围绕逻辑备份与Point-in-Time来展开,MongoDB Community版本要求4.0及以上。

架构

pbm-agent

pbm-agent用于执行备份、恢复,删除和其它操作的进程,它必须运行在集群的每个mongod实例上。包括副本集中的secondary节点以及分片集群中的config副本集。

所有pbm-agent都会监视PBM Control集合的更新,当PBM CLI对PBM Control集合产生更新时,将会在每个副本集上选择一个secondary上的pbm-agent执行操作,如果没有响应则会选择Primary上的pbm-agent执行操作。

被选中的pbm-agent将会加锁,避免同时触发备份和恢复等互斥操作。操作完成后将会释放锁,并更新PBM Control集合

PBM CLI

PBM CLI是一个操作PBM的命令行工具,它使用PBM Control集合与pbm-agent进程通信。通过更新和读取操作、日志等相应的PBM Control集合来启动和监视备份和恢复操作。同时,它也将PBM配置信息保存在PBM Control集合中。

PBM Control collections

PBM Control collections是存储配置数据和备份状态的特殊集合,分片环境存放在config副本集的admin数据库中,副本集则保存在自身的admin数据库中。

主要包含以下集合:

  • admin.pbmBackups:备份的日志和状态
  • admin.pbmAgents:pbm-agent的运行状态
  • admin.pbmConfig:PBM的配置信息
  • admin.pbmCmd:用于定义和触发操作
  • admin.pbmLock:pbm-agent同步锁
  • admin.pbmLockOp:用于协调不互斥的操作,如执行备份、删除备份等
  • admin.pbmLog:存储pbm-agent的日志信息
  • admin.pbmOpLog:存储操作ID
  • admin.pbmPITRChunks:存储point-in-time恢复的oplog块
  • admin.pbmPITRState:存储point-in-time恢复增量备份的状态
  • admin.pbmRestores:存储还原历史记录和状态
  • admin.pbmStatus:记录PBM备份状态

remote backup storge
远程备份存储是保存备份文件的位置,可以是S3存储,也可以是Filesystem。通过pbm list命令可以查看备份集。备份文件名称都是以UTC备份开始时间作为前缀,每个备份都有一个元数据文件。对于备份中的每个副本集:

  • 有一个mongodump格式的压缩归档文件,它是集合的转储
  • 覆盖备份时间的oplog的BSON文件转储

安装配置

下载PBM

# wget https://downloads.percona.com/downloads/percona-backup-mongodb/percona-backup-mongodb-2.0.3/binary/tarball/percona-backup-mongodb-2.0.3-x86_64.tar.gz

解压PBM

# tar -xvf percona-backup-mongodb-2.0.3-x86_64.tar.gz

配置环境变量

# echo "export PATH=$PATH:/usr/local/percona-backup-mongodb-2.0.3-x86_64" >> /etc/profile
# source /etc/profile

在副本集上创建PBM用户,如果是分片环境,则每个shard以及config都需要创建

# create pbm role
shard1:PRIMARY> db.getSiblingDB("admin").createRole({ "role": "pbmAnyAction","privileges": [{ "resource": { "anyResource": true },"actions": [ "anyAction" ]}],"roles": []});# create pbm user
shard1:PRIMARY> 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" }]});

配置remote backup storge,除mongos外,每个节点都需要存在对应的备份目录

cat > /etc/pbm_config.yaml <<EOF
storage:type: filesystemfilesystem:path: /data/backup
EOF

将配置写入到数据库中,分片集群需要填写config的地址

pbm config --file /etc/pbm_config.yaml --mongodb-uri "mongodb://pbmuser:secretpwd@10.186.65.37:27018,10.186.65.66:27018,10.186.65.68:27018/?replicaSet=config"

启动每个节点对应的pbm-agent

nohup pbm-agent --mongodb-uri "mongodb://pbmuser:secretpwd@10.186.65.37:27017" > /var/log/pbm-agent-27017.log 2>&1 &

为了后续方便,不用每次输入--mongodb-uri,可以把PBM_MONGODB_URI设置到环境变量中

# echo 'export PBM_MONGODB_URI="mongodb://pbmuser:secretpwd@10.186.65.37:27018,10.186.65.66:27018,10.186.65.68:27018/?replicaSet=config"' >> /etc/profile
# source /etc/profile

全量备份

全备支持物理备份和逻辑备份,通过–type指定,可选项有physical和logical两种。因MongoDB社区版不支持物理备份,就只围绕逻辑备份来展开。

全量备份即对整个集群除mongos以外进行完整的备份,只需要执行一次,就能完成整个集群的备份。备份命令如下:

pbm backup --type=logical --mongodb-uri "mongodb://pbmuser:secretpwd@10.186.65.37:27018,10.186.65.66:27018,10.186.65.68:27018/?replicaSet=config"

备份压缩

pbm支持备份压缩,目前的算法有gzip、zstd、snappy、lz4,通过--compression选项指定。同时能指定对应的压缩级别,通过–compression-level选项指定。不同算法的压缩级别如下所示:

压缩算法压缩级别默认
ztsd1-42
snappyNULLNULL
lz41-161
gzip or pgzip-1,0,1,9-1

优先级

负责备份的pbm-agent默认会在从节点中随机选出,规定时间内从节点没有响应,则在主节点进行备份。现在可以通过指定每个节点的备份优先级来控制备份节点选择,避免在一个机器承载多个实例的情况下备份集中在同一台服务器导致IO性能不足。在配置文件中加入下列配置

backup:priority:"10.186.65.37:27017": 2"10.186.65.37:27018": 1"10.186.65.68:27017": 2

不在配置文件中的节点优先级默认为1,如果没有设置任何优先级,下列类型的节点则优先被选中

  • 隐藏节点:优先级为2
  • secondary节点:优先级为1
  • Primary节点:优先级为0.5

备份管理

查看pbm状态

pbm status --mongodb-uri
Cluster:
========
shard3:- shard3/10.186.65.68:27017 [P]: pbm-agent v2.0.3 OK
shard1:- shard1/10.186.65.37:27017 [P]: pbm-agent v2.0.3 OK
shard2:- shard2/10.186.65.66:27017 [P]: pbm-agent v2.0.3 OK
config:- config/10.186.65.37:27018 [P]: pbm-agent v2.0.3 OK- config/10.186.65.66:27018 [S]: pbm-agent v2.0.3 OK- config/10.186.65.68:27018 [S]: pbm-agent v2.0.3 OKPITR incremental backup:
========================
Status [OFF]Currently running:
==================
(none)Backups:
========
FS  /data/backupSnapshots:2023-02-22T07:18:40Z 4.66MB <logical> [restore_to_time: 2023-02-22T07:18:45Z]

备份完成后,可以通过pbm list查看所有备份集,也可以通过pbm describe-backup查看备份的具体信息

# pbm list
Backup snapshots:2023-02-22T07:18:40Z <logical> [restore_to_time: 2023-02-22T07:18:45Z]# pbm describe-backup 2023-02-22T07:18:40Z
name: "2023-02-22T07:18:40Z"
opid: 63f5c1d0a6375c868415cac4
type: logical
last_write_time: "2023-02-22T07:18:45Z"
last_transition_time: "2023-02-22T07:18:59Z"
mongodb_version: 4.0.28
pbm_version: 2.0.3
status: done
size_h: 4.7 MiB
replsets:
- name: shard2status: donelast_write_time: "2023-02-22T07:18:44Z"last_transition_time: "2023-02-22T07:18:55Z"
- name: shard3status: donelast_write_time: "2023-02-22T07:18:44Z"last_transition_time: "2023-02-22T07:18:59Z"
- name: shard1status: donelast_write_time: "2023-02-22T07:18:44Z"last_transition_time: "2023-02-22T07:18:57Z"
- name: configstatus: donelast_write_time: "2023-02-22T07:18:45Z"last_transition_time: "2023-02-22T07:18:48Z"configsvr: true

查看备份日志可以使用pbm logs进行查看,有下列选项可选:

  • -t:查看最后N行记录
  • -e:查看所有备份或指定备份
  • -n:指定节点或副本集
  • -s:按日志级别进行过滤,从低到高依次是D(debug)、I(Info)、W(Warning)、E(Error)、F(Fatal)
  • -o:以文本或JSON格式显示日志信息
  • -i:指定操作ID
# 查看特定备份的日志
pbm logs --tail=200 --event=backup/2023-02-22T07:18:40Z# 查看副本集shard1的日志
pbm logs -n shard1 -s E

如果正在运行任务想要终止,可以使用pbm canal-backup取消

pbm cancel-backup

删除快照备份可以使用pbm delete-backup,默认删除前会进行二次确认,指定--force选项可以直接删除。删除oplog chunk可以执行pbm delete-pitr

pbm delete-backup --force 2023-02-22T07:18:40Z 

如果想要删除指定时间之前的备份,可以设置--older-than参数,传递下列格式的时间戳

  • %Y-%M-%DT%H:%M:%S (e.g. 2020-04-20T13:13:20)
  • %Y-%M-%D (e.g. 2020-04-20)

增量备份

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

pbm config --set pitr.enabled=true 

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

如果想要调整时间跨度,可以配置pitr.oplogSpanMin

pbm config --set pitr.oplogSpanMin=5

oplog备份也支持压缩,可以配置pitr.compression

pbm config --set pitr.compression=gzip

数据恢复

恢复注意事项
通过pbm store命令并指定还原时间戳,在还原之前还需要注意以下几点:

  • 从1.x版本开始,Percona Backup For MongoDB复制了Mongodump的行为,还原时只清理备份中包含的集合,对于备份之后,还原之前创建的集合不进行清理,需要在还原前手动执行db.dropDatabase()清理
  • 在恢复运行过程中,阻止客户端访问数据库
  • 分片备份只能还原到分片集群中,还原期间将写入分片primary节点
  • 为避免恢复期间pbm-agent内存消耗,V1.3.2可以针对恢复在配置文件设置下列参数
restore:batchSize: 500numInsertionWorkers: 10

分片集群恢复

分片集群在做恢复前,需要先完成以下步骤

  1. 停止balancer
mongos> sh.stopBalancer()
  1. 关闭所有mongos,阻止客户端访问
  2. 如果启用了PITR,则禁用该功能
pbm config --set pitr.enabled=false

查看备份快照和PITR有效时间点

pbm list
Backup snapshots:2023-02-22T07:18:40Z <logical> [restore_to_time: 2023-02-22T07:18:45Z]PITR <on>:2023-02-22T07:18:46Z - 2023-02-22T08:36:45Z

执行PITR恢复

pbm restore --time="2023-02-22T08:30:00"

恢复完成后重新启用PITR和balance进程,并开启mongos对外提供服务

mongos> sh.startBalancer()
pbm config --set pitr.enabled=true

异机恢复

从v1.8版本开始,可以将逻辑备份恢复到具有相同或更多shard的新环境中,并且这些shard的副本集名称可以与原环境不同。但我们需要配置以下映射关系

pbm restore --time="2023-02-22T08:30:00" --replset-remapping="shard1=shard4,shard2=shard5"

性能

pbm提供了性能测试工具pbm-speed-test,默认采用半随机数据进行测试,如果要基于现有集合进行测试,请设置–sample-collection选项

pbm-speed-test storage --compression=gzip --size-gb 100Test started100.00GB sent in 37m17s.Avg upload rate = 45.78MB/s

pbm整体的性能相对于mongodump并没有较大的提升,主要还是体现在下列几个特点:

  • 在分片集群中进行一致性备份和恢复
  • 支持完全备份/恢复、选择性备份恢复等多种粒度
  • 支持基于时间点的恢复

选择性备份和恢复

选择性备份和恢复功能可以针对指定的数据库或集合,但目前还只是一个实验性功能,谨慎使用。它具有以下场景选项:

  • 备份单个数据库或特定集合,并从中恢复所有数据
  • 从单个数据库备份恢复特定的集合
  • 从全备中恢复某些数据库或集合
  • 从全备中Point-in-recovery某些数据库或集合

备份指定集合时,需要指定--ns选项,格式为<database.collection>。分片环境的URI需要填写config的地址

pbm backup --ns=test.col1

如果要备份整个test数据库,可以改为下列格式

pbm backup --ns=test.*

恢复指定数据库或集合,恢复过程中不会影响现有集群的可用性

pbm restore 2023-02-22T07:18:40Z --ns test.col1

基于时间点恢复数据库或集合

pbm restore --base-snapshot 2023-02-22T07:18:40Z --time 2023-02-22T09:06:00 --ns test.col1

已知限制

  1. 只支持逻辑备份恢复
  2. 不支持分片集合
  3. 不支持批量指定namespace
  4. 不支持Multi-collection事务
  5. 不能备份恢复本地数据库中的系统集合
  6. 时间点恢复需要通过完全备份来作为基础

参考链接:https://docs.percona.com/percona-backup-mongodb/intro.html


http://www.ppmy.cn/news/33732.html

相关文章

下载并导入MySQL示例数据库employees

MySQL示例数据库employees一、下载employees数据库二、MySQL官方参考手册三、具体步骤3.1 下载test_db3.2 在test_db-master中打开cmd(进入test_db-master目录)3.3 run-install3.4 验证employee数据3.5 show databases\tables & select * from departments**3.6 select * f…

前端git必备技能,如何合并分支以及出现合并冲突后如何解决

文章目录一、合并分支二、可能出现的冲突和解决三、过程分享一、合并分支 注意&#xff0c;我们常说的master或main主干也可以理解为分支&#xff0c;可以是分支合并到主干&#xff0c;或分支合并到分支。 需求&#xff1a;cloudweb的2.6.0和2.6.1是并行开发的&#xff0c;现…

linux中写定时任务

场景&#xff1a;我们生产环境中有大量的日志记录&#xff0c;但是我们的磁盘没有太大&#xff0c;需要定时清理磁盘 文章目录crond 定时任务详解安装定时任务crontab服务启动与关闭crontab操作crontab 命令test.sh查看日志丢弃linux中的执行日志Linux进入nano模式方式一方式二…

【8】核心易中期刊推荐——人工智能与机器人

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

【代码随想录-刷题学习JavaScript】day2-part02数组

继续数组的部分 977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II 今天会有个小结 一、LeetCode977.有序数组的平方 文章讲解 视频讲解 二、LeetCode 209.长度最小的子数组 题目建议&#xff1a; 本题关键在于理解滑动窗口&#xff0c;这个滑动…

太强了,英伟达面对ChatGPT还有这一招...

大家好&#xff0c;我是 Jack。 今年可谓是 AI 元年&#xff0c;ChatGPT、AIGC、VITS 都火了一波。 我也先后发布了这几期视频&#xff1a; 这是一个大模型的时代&#xff0c;AI 能在文本、图像、音频等领域大放异彩&#xff0c;得益于大模型。而想要预训练大模型&#xff0c…

int *p = a、p = a、*p = a

int *p &a; //初始化一个int *类型指针&#xff0c;同时将变量a的地址存入p指针这里是一个特殊用法&#xff0c;仅在初始化变量的时候可以使用&#xff0c;应分为两个部分去进行理解。int *p; //初始化一个int * 类型指针pp &a; //将变量a的地址存入p指针&#xff0c…

基于深度学习的动物识别系统(YOLOv5清新界面版,Python代码)

摘要&#xff1a;动物识别系统用于识别和统计常见动物数量&#xff0c;通过深度学习技术检测日常几种动物图像识别&#xff0c;支持图片、视频和摄像头画面等形式。在介绍算法原理的同时&#xff0c;给出Python的实现代码、训练数据集以及PyQt的UI界面。动物识别系统主要用于常…

哈夫曼编码、哈夫曼树

已知一个文件中出现的各字符及其对应的率如下表所示。若采用定长编码&#xff0c;则该文件中字符的码长应为( )。若采用Huffman编码&#xff0c;则字符序列face的编码应为&#xff08; ) 字符abcdef频率4513121695码长决定了可以显示几位字符&#xff0c;题中一共有6位&#x…

【Linux】环境变量(基本概念 常见环境变量 测试PATH 环境变量相关命令)

文章目录环境变量基本概念常见环境变量测试PATH别的环境变量通过系统调用获取或设置环境变量环境变量相关命令export: 设置一个新的环境变量set: 显示本地定义的shell变量和环境变量unset: 清除环境变量通过代码如何获取环境变量环境变量 基本概念 环境变量(environment vari…

ThreadPool线程池源码解析

ThreadPool线程池源码解析 文章目录前言一、基本使用二、执行流程三、源码分析ThreadPoolExecutor 中重要属性ThreadPoolExecutor 内部类Workerexecute&#xff08;&#xff09;方法addWorker(command, true)方法runWorker(worker )方法getTask()方法shutdown和shutdownNow四、…

Java栈和队列·下

Java栈和队列下2. 队列(Queue)2.1 概念2.2 实现2.3 相似方法的区别2.4 循环队列3. 双端队列 (Deque)3.1 概念4.java中的栈和队列5. 栈和队列面试题大家好&#xff0c;我是晓星航。今天为大家带来的是 Java栈和队列下 的讲解&#xff01;&#x1f600; 继上一个讲完的栈后&…

1.9 日本蜡烛图技术之支撑和压力的其他含义

破低反涨和破高反跌形态 支撑和压力的研究不能局限于涨跌幅边界研究&#xff0c;用K线图来验证会注意到很多突破来临的信号破低反涨形态 一种移动和反向移动&#xff0c;价格跌破支撑&#xff0c;然后反弹重新上涨通常建立新的支撑线 破高反跌形态&#xff1a;突破压力后&…

hadoop理论基础(一)

1.hadoop的组成2 HDFS概述HDFS&#xff08;Hadoop Distributed File System&#xff09;是一个分布式文件系统&#xff08;1&#xff09;NameNode:存储文件的元数据;如文件名、文件目录结构、文件属性&#xff0c;以及每个文件的块列表和块所在的DataNode等。(2)DataNode:在本地…

【测试开发篇4】测试模型

目录 一、软件测试V模型 编码前 概要设计&#xff1a; 详细设计&#xff1a; 编码后&#xff1a; 单元测试&集成测试 系统测试 验收测试 V模型的特点 优点&#xff1a; 缺点&#xff1a; 二、软件测试W模型 编码之前&#xff1a; 编码的时候&#xff1a; 编…

Three.js——learn01

Three.js——learn01Three.js——learn01本地搭建文档通过parcel搭建Threejs环境1.初始化2.安装parcel设置打包位置3.设置目录结构QuickStart安装threejsindex.htmlindex.cssindex.js启动Three.js——learn01 本地搭建文档 登录GitHub搜索three.js git clone https://github…

KubeSphere All in one安装配置手册

KubeSphere All in one安装配置手册 1. 初始化 1.1 配置apt源 # vi /etc/apt/sources.list deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiversedeb…

【多线程】多线程案例

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; ✨每日一语&#xff1a;we can not judge the value of a moment until it becomes a memory. 目 录&#x1f35d;一. 单例模式&#x1f364;1. 饿汉模式实现&#x1f9aa;2. 懒汉模…

redhat httpd服务安装、访问浏览器及自定义访问页面

目录 1.查看本地仓库&#xff0c;如果没有配置&#xff0c;就在这目录创建一个 2.挂载 3.下载httpd服务 4.修改httpd配置文件 5.重启httpd服务 6.查看当前可用IP地址 7.随便用一个IP 看是否有东西 8.无法访问&#xff0c;原因是我们防火墙没有放行httpd服务 1.查看本地仓库&a…

Cookie和Session详解

目录 前言&#xff1a; Session详解 Cookie和Session区别和关联 服务器组织会话的方式 使用Tomcat实现登录成功跳转到欢迎页面 登录前端页面 登录成功后端服务器 重定向到欢迎页面 抓包分析交互过程 小结&#xff1a; 前言&#xff1a; Cookie之前博客有介绍过&#x…