备份管理的完整操作流程、参数说明与最佳实践,包含详细的命令示例和配置参数。
AIO 备份平台 GoldenDB 备份管理手册(详细版)
——平台架构 · XtraBackup集成 · Agent部署 · 数据管道 · 恢复实战
基于 AIO v5.5.2 + Percona XtraBackup 8.0.25-17 适用对象:DBA / 运维工程师 / 备份管理员 编制日期:2026年6月
第一章 AIO 备份平台是什么
第二章 平台整体架构(含架构图)
第三章 GoldenDB 备份类型与策略
第四章 全量备份流程(含流程图)
第五章 XtraBackup 在 AIO 中的集成(含命令详解图)
第六章 增量备份流程(含流程图)
第七章 数据传输管道详解(含管道图)
第八章 备份存储:ZFS 卷管理
第九章 GoldenDB 元数据备份
第十章 RDB Agent 部署与权限(含架构图)
第十一章 恢复与挂载流程(含流程图)
第十二章 GTM 日志备份
第十三章 配置与环境变量
第十四章 常见问题与排查
附录 A 关键配置参数速查
附录 B 备份命令完整参考
AIO(All-In-One)是一套数据库与文件系统的备份、恢复、挂载、清理、巡检、编排平台。它不是"单纯的 Airflow 项目"或"单纯的 Python Web 项目",而是一个完整的企业级数据保护解决方案。
核心能力:
• 物理热备份:基于 Percona XtraBackup,不停库、不锁表
• 增量备份:基于 LSN 追踪变化页面,节省存储空间
• 流式传输:数据在源端本地压缩,通过 QoS 通道回传
• 快照保护:基于 ZFS 快照,秒级创建恢复点
• 元数据一致性:备份 GoldenDB 集群元数据,确保恢复后分片一致
• 多数据库支持:MySQL/GoldenDB/Oracle/PostgreSQL/GaussDB/TDSQL/OceanBase 等
AIO 平台支持多种数据库的备份恢复,GoldenDB 是其中之一。已支持的类型包括:MySQL、GoldenDB、Oracle、PostgreSQL/GaussDB、DM(达梦)、TDSQL、PolarDB、OceanBase、AntDB、TeleDB、K8s MySQL、文件/归档等。
AIO 平台由三层组成:
CDM 控制面(10.7.16.216:9008):负责 API、模型、元数据、任务记录、初始化、业务服务。前端是 Vue.js SPA,后端是 Flask + uWSGI + gevent。
Airflow 编排面(10.7.16.216:9080):负责 DAG 编排、调度、Worker 执行、任务日志。使用 CeleryExecutor 模式,支持分布式 Worker。
共享执行底座:负责 operator、远程执行、shell 封装、回调、数据库类型适配。包括 aio_tasks、aio_public_module、aio_lib 三个共享库。
• cfg/aio.env:整套平台的输入配置源,包含数据库连接、Redis、端口等
• cfg/cdm.runtime.env:CDM 运行时环境(由 init.cdm.sh 生成)
• cfg/airflow.runtime.env:Airflow 运行时环境(由 init.airflow.sh 生成)
• cfg/airflow.cfg:Airflow 核心配置(CeleryExecutor)
• /etc/profile.d/cdm.runtime.sh:CDM shell 环境
• /etc/profile.d/airflow.runtime.sh:Airflow shell 环境
| 备份类型 | DAG名称 | 说明 | 频率建议 |
|---|---|---|---|
| 全量备份 | tiny_goldendb (full) | 基于XtraBackup完整拷贝 | 每日/每周 |
| 增量备份 | tiny_goldendb (inc) | 基于LSN的变化页面拷贝 | 每小时 |
| GTM日志备份 | goldendb_gtmlog_backup | 备份GTM活动事务数据 | 每小时 |
| 元数据备份 | goldendb_meta_backup | 备份集群元数据(.dat/.idx) | 每次全量后 |
| 日志备份 | goldendb_log_backup (via tiny) | 备份Binlog用于PITR | 持续 |
AIO 平台支持灵活的备份策略配置,通过 CDM Web 界面或 API 设置:
• 全量备份周期:每日/每周/自定义
• 增量备份间隔:1小时/4小时/自定义
• 保留策略:按天数或按份数
• 存储位置:ZFS 卷(本地)/ S3(对象存储)
Step 1 - CDM 接收备份请求:用户通过 Web 界面或 API 发起备份任务,CDM 校验参数后创建任务记录。
Step 2 - 触发 Airflow DAG:CDM 通过 SAL(Service Abstraction Layer)触发 Airflow DAG(tiny_goldendb),传入备份配置参数。
Step 3 - 环境检查:Worker 检查本地 XtraBackup 版本、RPC 服务、QoS 工具、lz4 是否可用;同时检查远程 Agent 连接。
Step 4 - 创建 ZFS 卷:根据源端数据大小,在 ZFS 存储池中创建或扩容卷(zvol)。
Step 5 - 下载 my.cnf:通过 RPC 从 GoldenDB 源端下载 MySQL 配置文件。
Step 6 - 获取数据大小:连接 MySQL 执行 SHOW VARIABLES 获取 datadir 和 undo 目录,通过 du -s 计算大小。
Step 7 - 启动 QoS 传输服务:在 Worker 端启动 QoS 服务,监听随机端口(12000-13000),准备接收数据。
Step 8 - 执行 XtraBackup:通过 RPC 在 GoldenDB 源端执行备份命令(详见第五章)。
Step 9 - 数据写入 ZFS 卷:备份数据通过 QoS 通道回传,解压后写入 ZFS 卷。
Step 10 - 创建 ZFS 快照:sync 后创建 ZFS 快照,确保数据一致性。
Step 11 - 备份元数据:在 GoldenDB Manager 节点调用 backup_metadata.py 导出集群元数据。
AIO 在 GoldenDB 源端通过 RPC 执行的实际 XtraBackup 命令:
xtrabackup \
--defaults-file=<my.cnf路径> \
--host='<GoldenDB节点IP>' \
--user='<数据库用户名>' \
--port=<数据库端口> \
--password='<密码>' \
--datadir=<数据目录> \
--parallel=<并行线程数> \
--slave_info \
--backup \
--no-server-version-check \
--stream=xbstream \
| lz4 -B4 \
| qos --host=<Worker_IP> --port=<QoS端口>
参数说明:
• --defaults-file:GoldenDB DN 实例的 my.cnf 配置文件路径
• --slave_info:记录从库 Binlog 位置,用于搭建从库
• --stream=xbstream:流式输出,不写本地文件
• --no-server-version-check:跳过 XtraBackup 版本与 MySQL 版本检查
• lz4 -B4:LZ4 压缩(块大小 4KB),压缩比 2:1~3:1
• qos:QoS 传输工具,将压缩数据通过网络传到 Worker 端
xtrabackup \
--defaults-file=<my.cnf路径> \
--host='<GoldenDB节点IP>' \
--incremental \
--incremental-lsn=<上次全量备份的to_lsn> \
--slave_info \
--user='<用户名>' --port=<端口> --password='<密码>' \
--datadir=<数据目录> \
--parallel=<N> \
--backup --no-server-version-check --stream=xbstream \
| lz4 -B4 \
| qos --host=<Worker_IP> --port=<QoS端口>
增量备份与全量的区别:多了 --incremental 和 --incremental-lsn 参数。LSN 从全量备份的 xtrabackup_checkpoints 文件中读取。
# Worker 端 QoS 服务接收命令
qos --server --port=<端口> | lz4 -d -B4 | xbstream -x -C '<备份目录>'
# 备份目录结构
/volmountpoint/aiopool/<volume_name>/
├── full/ # 全量备份
├── incr/ # 增量备份
└── metadata/ # 元数据
增量备份的核心是 LSN(Log Sequence Number)链条:
# 读取全量备份的 to_lsn
cat /volmountpoint/aiopool/<vol>/full/xtrabackup_checkpoints
# 输出: to_lsn = 15188961605
# 增量备份使用该 LSN
xtrabackup --incremental --incremental-lsn=15188961605 ...
# 增量备份的 xtrabackup_checkpoints:
# from_lsn = 15188961605 (等于全量的 to_lsn)
# to_lsn = 15188962100
⚠️ 关键:如果增量备份的 from_lsn 不等于上次备份的 to_lsn,说明增量链断裂。
# 先 Prepare 全量(加 --apply-log-only)
xtrabackup --prepare --apply-log-only --target-dir=<full_dir>
# 再 Apply 增量(加 --apply-log-only)
xtrabackup --prepare --apply-log-only \
--target-dir=<full_dir> \
--incremental-basedir=<incr_dir>
# 最后一步(不加 --apply-log-only)
xtrabackup --prepare \
--target-dir=<full_dir> \
--incremental-basedir=<incr_dir>
| NC (旧) | nc -l -p PORT | lz4 -d | xbstream -x | 简单 | 不稳定,端口冲突多 |
|---|---|---|---|
| QoS (新,当前使用) | qos --server --port PORT | lz4 -d | xbstream -x | 限速、端口管理、进程守护 | 需要额外工具 |
QoS 使用端口范围 12000-13000,通过文件锁管理端口分配:
• 使用端口记录在 used_port.json 中
• 通过文件锁(fcntl)防止并发冲突
• 备份完成后自动释放端口
GoldenDB 源端 → XtraBackup (本地读取) → lz4 压缩 → QoS 传输 → Worker 接收 → xbstream 解包 → 写入 ZFS 卷
关键点:数据在源端本地读取、本地压缩,不经过数据库网络协议,对业务影响最小。
AIO 使用 ZFS 作为备份存储引擎,存储池名称为 aiopool,挂载点为 /volmountpoint/aiopool/
ZFS 的核心优势:
• 快照(Snapshot):秒级创建一致性恢复点,几乎不占额外空间
• 压缩(Compression):数据自动压缩,节省磁盘空间
• 校验(Checksum):自动检测数据损坏
• 卷管理(ZVol):创建固定大小的块设备,用于存储备份数据
# 创建 ZFS 卷
zfs create -V <大小>G aiopool/<volume_name>
# 创建快照(备份完成后执行)
sync && zfs snapshot aiopool/<volume_name>@<execution_batch>
# 查看快照
zfs list -t snapshot aiopool/<volume_name>
# 回滚快照(恢复时)
zfs rollback aiopool/<volume_name>@<snapshot_name>
GoldenDB 是分布式数据库,除了数据节点(DN)的数据外,还有集群元数据(拓扑、分片规则、GTM 信息等)存储在 Manager 节点。只备份 DN 数据而忽略元数据,恢复后集群无法正确识别分片关系。
AIO 通过以下步骤备份 GoldenDB 元数据:
1. SSH 到 Manager 节点(10.7.16.64)
2. 切换到 Manager 用户(如 zxmanager)
3. 调用 GoldenDB 官方脚本 backup_metadata.py
4. 下载生成的 .dat/.idx 文件到备份卷
5. 打包压缩存储
# 元数据备份命令(AIO 自动执行)
sudo su - <manager_user> -c \
'python ~/bin/backup_metadata.py --cluster_id=<ID> --backup_path=<路径>'
# 生成的文件
DBPasswdInfos.dat # 数据库密码信息
DictionaryInfos.dat # 数据字典
DictionaryInfos.idx # 数据字典索引
TableIndexInfos.dat # 表索引信息
TableIndexInfos.idx # 表索引索引
备份一体机对 GoldenDB 的保护采用 Agent(代理)模式。源端数据库主机不直接暴露数据库端口给备份系统,而是由 Agent 在源端提供一个受控的执行与传输通道。
Agent 的核心组件:
• RPC 服务:监听指定端口,接收备份机下发的指令
• XtraBackup 8.0.25-17:物理热备份工具
• xbstream / lz4 / qos:数据打包、压缩、传输工具
• 元数据导出脚本:调用 GoldenDB 官方 backup_metadata.py
• 检测脚本:check_goldendb.sh(检测实例状态、版本、binlog 等)
# 1. 上传安装包到 GoldenDB 源端
tar -zxf rdb_agent_5.5.2.0_bc.x86_64.tar.gz
cd rdb_agent_5.5.2.0_bc.x86_64
# 2. 执行安装
./install
# 3. 验证安装
./verify
数据库权限(XtraBackup 标准要求):
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, BACKUP_ADMIN, PROCESS
ON *.* TO 'xtrabackup'@'localhost';
系统权限(sudo 免密):
• xtrabackup:物理备份
• su - <db_user>:实例检测
• du / sh:目录探测
• su - <mgr_user> -c backup_metadata.py:元数据导出
AIO 支持两种恢复方式:
• 完整恢复(Physical Restore):将备份数据恢复到新的 GoldenDB 实例
• 挂载恢复(Mount):将备份卷挂载为只读,用于数据查询和验证
1. 选择备份快照:从 CDM 界面选择要恢复的备份点
2. 创建恢复卷:基于 ZFS 快照创建可写卷
3. Prepare 备份数据:xtrabackup --prepare 应用 Redo Log
4. 拷贝数据:xtrabackup --copy-back 恢复到 MySQL 数据目录
5. 恢复元数据:调用 restore_metadata.py 恢复集群拓扑
6. 启动实例:启动 GoldenDB DN 实例
7. 验证数据:检查数据完整性和一致性
GTM(Global Transaction Manager)是 GoldenDB 的全局事务管理器。GTM 日志记录了所有全局事务的活动状态,包括 GTID 分配、事务提交等信息。备份 GTM 日志可以用于:
• 恢复到指定的全局事务时间点
• 排查分布式事务问题
• 搭建新的 GTM 备节点
GTM 日志备份的 Airflow DAG 为 goldendb_gtmlog_backup,流程为:
checkRemoteServer → get_active_tran_filename → get_data_total_size → worker_prepare → create_dir → get_active_tran_data → callback
关键步骤:
1. 检查远程服务器连接
2. 获取当前活动事务文件名
3. 计算数据大小
4. 创建存储目录
5. 下载活动事务数据
6. 完成回调
# /opt/aio/cfg/aio.env
AIO_HOME=/opt/aio
AIO_DB_HOSTNAME=10.7.16.216 # CDM 数据库
AIO_WEBSRV_HOST=10.7.16.216 # CDM Web 服务
AIO_WEBSRV_PORT=9008
AIO_REDIS_HOST=10.7.16.216 # Redis
AIO_REDIS_PORT=6379
AIRFLOW_WEBSRV_HOST=10.7.16.216 # Airflow Web
AIRFLOW_WEBSRV_PORT=9080
AIO_ROLE_MODE=non-separate # CDM与Worker同机部署
每次备份任务通过 Airflow dag_run.conf 传入参数,GoldenDB 相关参数包括:
• node_ipaddr:GoldenDB 节点 IP
• node_db_username / node_db_passwd:数据库用户名密码
• node_db_port:数据库端口
• node_mysql_cnf_path:my.cnf 配置文件路径
• data_dir:数据目录路径
• xtrabackup:XtraBackup 版本号(如 8.0-linux-x86_64)
• xtrabackup_parallel:并行线程数
• cluster_id:GoldenDB 集群 ID
• node_id:节点 ID
• connect_type:连接方式(agent 或 ssh)
# 查看服务状态
python3 /opt/aio/airflow/scripts/rdb.py status
# 启动/停止服务
python3 /opt/aio/airflow/scripts/rdb.py start <service>
python3 /opt/aio/airflow/scripts/rdb.py stop <service>
# 常见服务名
web, scheduler, default_worker, worker, cdm, apscheduler
原因:RPC 服务未启动或端口不通。
排查:检查 Agent 服务状态、防火墙规则、端口占用。
原因:Worker 端和源端的 XtraBackup 版本不一致。
排查:执行 xtrabackup --version 检查两端版本。
原因:存储池可用空间低于 20%。
排查:执行 zpool status aiopool 检查空间。AIO 会在备份前检查,空间不足会自动报错。
原因:全量备份被清理,但增量备份仍在。
排查:检查各备份的 xtrabackup_checkpoints 文件中的 LSN 范围。
原因:Manager 用户权限不足或 backup_metadata.py 脚本不存在。
排查:SSH 到 Manager 节点,手动执行 backup_metadata.py 测试。
原因:之前的备份进程未正常退出,端口未释放。
排查:检查 used_port.json,清理残留端口记录。
| AIO_WEBSRV_PORT | 9008 | CDM Web 服务端口 |
|---|---|---|
| AIRFLOW_WEBSRV_PORT | 9080 | Airflow Web 服务端口 |
| POOL_NAME | aiopool | ZFS 存储池名称 |
| VOLUME_MOUNT_POINT | /volmountpoint | ZFS 卷挂载点 |
| PORT_RANGE_START | 12000 | QoS 端口范围起始 |
| PORT_RANGE_END | 13001 | QoS 端口范围结束 |
| VOLUME_DEFAULT_COMPRESS_RATIO | 2.0 | ZFS 卷默认压缩比 |
| AIO_ROLE_MODE | non-separate | CDM与Worker部署模式 |
| snapshot_send_compress | true | 快照传输是否压缩 |
| snapshot_send_mode | rpc | 快照传输模式 |
以下是 AIO 中与 GoldenDB 备份相关的所有关键命令:
# === 全量备份 ===
xtrabackup --defaults-file=<cnf> --host=<IP> --user=<USER> \
--port=<PORT> --password=<PWD> --datadir=<DATADIR> \
--parallel=<N> --slave_info --backup --no-server-version-check \
--stream=xbstream | lz4 -B4 | qos --host=<DN_IP> --port=<PORT>
# === 增量备份 ===
xtrabackup --defaults-file=<cnf> --host=<IP> --user=<USER> \
--port=<PORT> --password=<PWD> --datadir=<DATADIR> \
--incremental --incremental-lsn=<LSN> --slave_info \
--parallel=<N> --backup --no-server-version-check --stream=xbstream \
| lz4 -B4 | qos --host=<DN_IP> --port=<PORT>
# === Worker 端接收 ===
qos --server --port=<PORT> | lz4 -d -B4 | xbstream -x -C '<DIR>'
# === Prepare 全量 ===
xtrabackup --prepare --target-dir=<FULL_DIR>
# === Prepare 增量(中间步骤) ===
xtrabackup --prepare --apply-log-only --target-dir=<FULL_DIR> \
--incremental-basedir=<INCR_DIR>
# === Prepare 增量(最终步骤) ===
xtrabackup --prepare --target-dir=<FULL_DIR> \
--incremental-basedir=<INCR_DIR>
# === 恢复 ===
xtrabackup --copy-back --target-dir=<FULL_DIR> --datadir=<DATADIR>
# === 元数据备份 ===
python ~/bin/backup_metadata.py --cluster_id=<ID> --backup_path=<PATH>
# === ZFS 快照 ===
sync && zfs snapshot aiopool/<VOL>@<BATCH>