基于商业备份集恢复
PolarDB-X Operator 从 v1.7.0 版本开始支持从阿里云PolarDB-X实例商业备份集中恢复出 PolarDB-X 集群。本文介绍如何通过已有的商业备份集恢复出 PolarDB-X 集群。
前提:阿里云PolarDB-X实例 需要为 兼容MySQL 8.0的企业版实例。
介绍
基于商业备份集恢复主要为了满足如下需求:
- 多云冗灾。生产实例在阿里云上,但是希望在别的云厂商搭建该实例的从实例。
- 线下测试使用。虽然已经在阿里云公有云上开通PolarDB-X实例,但是有些客户仍然有一部分线下的自建机器可用于日常测试使用。
操作步骤
总体步骤分为两部分: 导入备份集 和 发起恢复任务
导入备份集
运行的导入备份集工具,需要三个配置文件放在工具的配置目录下:
名称 | 文件名 | 是否必选 | 描述 |
---|---|---|---|
备份集元数据文件 | backupset_info.json | 是 | JSON格式,保存云上备份集的元数据,主要包含实例拓扑和备份文件的下载链接 |
开源备份集存储端配置文件 | sink.json | 是 | JSON格式,存储端的类型、地址、鉴权密钥等 |
备份集导入工具运行配置 | filestream.json | 否 | JSON格式,可配置参数:parallelism(类型为int,设置上传并发度,默认为5) |
准备工作
- 一个能调用 Open API DescribeOpenBackupSet 的账号。
- 确定线下备份集的存储端,当前支持的存储方式,参见文档:备份存储配置。
- 一台安装了docker的主机,要求该主机有1GB的空闲内存,且以下网络是连通的:
- 主机到线下存储端网络相通。
- 主机到阿里云对象存储(OSS)的Endpoint的网络连通,地域根据云上PolarDB-X所在地域选择,要求对应地域公网Endpoint和内网Endpoint至少有一个可以连通。
- 主机可连通镜像地址: polardbx-opensource-registry.cn-beijing.cr.aliyuncs.com
一般同地域的阿里云ECS上可连通内网Endpoint。
获取云上实例的备份集元数据
- 登录阿里云账号
- 跳转到 Open API DescribeOpenBackupSet 调试页面
- 按要求输入接口参数 RegionId、DBInstanceName、RestoreTime
- 点击发起调用
- 保存返回结果中的Data字段的内容, 保存到文件 backupset_info.json
存储端配置 配置字段与文档备份存储配置中的相同。采用JSON格式,比如:
{
"type": "oss",
"name": "backuposs",
"endpoint": "oss-cn-beijing-internal.aliyuncs.com",
"accessKey": "xxxxx",
"accessSecret": "xxxx",
"bucket": "backup"
}
保存到文件 sink.json
导入步骤
登录主机,创建一个用于放置配置文件的目录,下文将该目录表示为 $CONFIG, 该目录包含如下文件:
- 备份集元数据文件,backupset_info.json
- 存储端配置文件,sink.json
- (可选)备份集导入工具运行配置,filestream.json
拉取工具镜像
docker pull polardbx-opensource-registry.cn-beijing.cr.aliyuncs.com/polardbx/backupset-importer:v1.7.0
运行工具镜像
docker run -d -v /root/config:/config --network=host --name=polardbx-backupset-importer --entrypoint="/backupset-importer" polardbx-opensource-registry.cn-beijing.cr.aliyuncs.com/polardbx/backupset-importer:v1.7.0 -conf=/config
重复运行该命令,会有容器名称 polardbx-backupset-importer 已被占用的报错,请按照提示,将之前的容器进行重命名或者删除。删除可使用命令
docker rm polardbx-backupset-importer
, 重命名命令可使用docker rename polardbx-backupset-importer newname_polardbx-backupset-importer
- 查看工具运行日志
docker logs polardbx-backupset-importer -f
- 带有关键字 "generate backupset upload objs" 的日志,列出需要上传的数据备份文件
- 带有关键字 "generate binlog upload objs" 的日志,列出需要上传的日志备份文件
- 待导入的备份文件,会有5个worker线程,并发上传文件,每个worker对正在上传的文件,每30秒汇报一次进度,比如:
2024-10-29T08:46:54Z INFO backupset-importer report upload process {"action": "upload", "filepath": "polardbx-binlogbackup/default/pxc-xxxxxx/cb-2jyblvf5ea9hh7f6/pxc-xdb-s-xxxxx/xxxx/pxc-xdb-s-xxxxxx-cand-0/100385621/9_20/binlog-file/mysql_bin.000012", "sent": 0, "totalSize": 139206155, "process": "0%"}
如果由于宿主机重启、网络中断等原因,上传过程被意外中断,可重启容器进行续传。上传失败的文件会被重新上传,已上传的文件不会被重复上传。
- 检查上传结果
查看容器状态
查看 State 字段 "Status": "exited" 且 "ExitCode": 0 ,表示导入任务已经正常结束。docker inspect polardbx-backupset-importer
如有异常,可 docker logs polardbx-backupset-importer
查看是否有报错日志。
基于导入的备份集做恢复
参考 指定时间点恢复 中 跨K8S集群恢复PolarDB-X集群 编写用于恢复的yaml文件。
填写说明
.spec.config.dn.mycnfOverwrite 由于云上实例内核参数的差异,需要恢复的时候填上以下参数:
innodb_log_file_size=8589934592 innodb_page_size=16384 innodb_data_file_path=ibdata1:200M:autoextend innodb_undo_tablespaces=6 innodb_log_group_home_dir=/data/mysql/data innodb_undo_directory=/data/mysql/data
.spec.restore.storageProvider 根据导入备份集的存储端配置填写
- .spec.restore.from.clusterName 填入被恢复实例的实例名称,比如
pxc-xxxxxx
- .spec.restore.from.backupSetPath 填入数据备份集的文件路径,可去存储端查看,或者
docker logs polardbx-backupset-importer 2>&1 | grep polardbx-backup
查看日志参考备份集的上传路径,比如polardbx-backup/pxc-bjrmsikf8pjrru/cb-53fjd5wetvbpbm36-20240924222506/
- .spec.restore.time 填入UTC格式的时间(按照0时区),可选的时间范围是备份集元数据中两个字段确定 canBackupMinRecoverToTimeUTC 和 canBinlogRecoverToTimeUTC,时间范围是 (canBackupMinRecoverToTimeUTC,canBinlogRecoverToTimeUTC)
- .spec.restore.binlogSource.heartbeatSName 根据云上实例的配置,需要填写为
heartbeat
- .spec.restore.binlogSource.namespace 根据导入工具的设定,需要填写为
default
- .spec.restore.binlogSource.storageProvider 根据导入备份集的存储端配置填写
填写例子如下:
apiVersion: polardbx.aliyun.com/v1
kind: PolarDBXCluster
metadata:
name: pxc-restore-oss
spec:
config:
dn:
mycnfOverwrite: |-
innodb_log_file_size=8589934592
innodb_page_size=16384
innodb_data_file_path=ibdata1:200M:autoextend
innodb_undo_tablespaces=6
innodb_log_group_home_dir=/data/mysql/data
innodb_undo_directory=/data/mysql/data
topology:
nodes:
cn:
template:
image: polardbx-opensource-registry.cn-beijing.cr.aliyuncs.com/polardbx/polardbx-sql:v2.4.0_5.4.19
dn:
template:
image: polardbx-opensource-registry.cn-beijing.cr.aliyuncs.com/polardbx/polardbx-engine:v2.4.0_8.4.19
restore:
storageProvider:
storageName: oss
sink: happydaixing
from:
clusterName: pxc-bjrmsikf8pjrru
backupSetPath: "polardbx-backup/pxc-xxxxx/cb-xxxxxx-20240924222506/"
time: "2024-09-26T03:22:05Z"
binlogSource:
heartbeatSName: "heartbeat"
namespace: default
storageProvider:
storageName: oss
sink: happydaixing
将填写文件并保存,使用 kubectl apply -f
命令即可发起恢复实例的创建。