HDFS 基于 BOS 的容灾
1. 概述
本文介绍如何在 BMR 集群中使用 BOS 作为 HDFS 容灾备份介质,实现 HDFS 数据的周期性备份和故障后的数据恢复。
BMR 集群已自动打通 BOS 访问能力,集群内可直接通过 bos:// 路径访问 BOS Bucket,不需要用户额外配置 BOS FileSystem、AK/SK、Endpoint 等参数。
适用场景:
- HDFS 数据需要跨可用区或跨集群备份。
- 生产集群发生故障后,需要在新集群中恢复关键数据。
- 希望使用对象存储作为低成本、独立于 HDFS 集群生命周期的容灾存储。
- 需要定期将 HDFS 数据同步到 BOS,用于备份、归档或迁移。
2. 方案架构
1 定期备份
2┌────────────────────────┐
3│ 生产 BMR 集群 │
4│ │
5│ HDFS: /data │
6└───────────┬────────────┘
7 │
8 │ DistCp(备份/恢复)
9 ▼
10┌────────────────────────┐
11│ BOS │
12│ │
13│ bos://bucket/backup/... │
14└───────────┬────────────┘
15 │
16 │ 故障恢复时同步回新集群
17 ▼
18┌────────────────────────┐
19│ 恢复 BMR 集群 │
20│ │
21│ HDFS: /data │
22└────────────────────────┘
各组件职责:
| 组件 | 说明 |
|---|---|
| 生产 BMR 集群 | 承载线上 HDFS 数据,定期将 HDFS 数据备份到 BOS |
| BOS | 作为 HDFS 容灾备份存储,独立于集群生命周期 |
| 恢复 BMR 集群 | 故障后新建或已有的备用集群,从 BOS 恢复 HDFS 数据 |
| DistCp | Hadoop 分布式复制工具,适合大规模 HDFS 与 BOS 之间的数据同步 |
3. 前提条件
在开始前,请确认以下条件:
- 已有可用的 BMR 集群。
- 已创建用于备份的 BOS Bucket。
- BMR 集群和 BOS Bucket 在同一个区域。
- 当前用户或集群访问身份对目标 BOS Bucket 具有读写权限。
- 当前用户对待备份的 HDFS 目录具有读权限。
- 当前用户对恢复目标父目录具有写权限,例如恢复到
/data时,需要具备在 HDFS 根目录/下创建或写入/data的权限。 - 已规划好备份目录、备份周期和保留策略。
说明:BMR 集群默认已自动打通 BOS,不需要额外配置
fs.bos.impl、fs.bos.endpoint、AK/SK 等参数。 本文主要面向同一区域内的跨可用区或跨集群容灾场景。如需跨区域容灾,需要额外考虑 BOS 跨区域复制、网络连通和权限配置。
4. 备份目录规划
建议在 BOS 中为 HDFS 容灾创建独立目录,按照集群、环境、日期或业务线组织备份数据。
示例:
1bos://<bucket>/hdfs-dr/
2├── prod-cluster-01/
3│ ├── data/
4│ └── user/
5└── prod-cluster-02/
6 ├── data/
7 └── user/
推荐目录规范:
| 路径 | 说明 |
|---|---|
bos://<bucket>/hdfs-dr/<cluster-id>/data/ |
业务数据备份 |
bos://<bucket>/hdfs-dr/<cluster-id>/user/ |
用户目录备份 |
示例变量:
1export BACKUP_ROOT=bos://<bucket>/hdfs-dr/prod-cluster-01
本文示例采用“备份目录本身”的约定:将 HDFS /data 目录备份到 ${BACKUP_ROOT}/ 后,BOS 上对应路径为 ${BACKUP_ROOT}/data;恢复时再从 ${BACKUP_ROOT}/data 恢复回 HDFS /data。
下文以 /data 为例说明备份和恢复流程,其他 HDFS 目录可按相同方式规划独立备份路径。建议每个待备份 HDFS 目录使用独立的 BOS 目标路径,避免不同目录共用同一个目标路径后,在增量同步或清理时相互影响。
5. 验证 BOS 访问
在 BMR 集群节点上执行:
1hadoop fs -ls bos://<bucket>/
如果能够正常列出 Bucket 内容,说明集群已具备访问 BOS 的能力。
6. HDFS 数据备份
6.1 全量备份
使用 distcp 将 HDFS 目录复制到 BOS。
示例:备份 /data 目录。
1hadoop distcp \
2 -m 20 \
3 -bandwidth 50 \
4 /data \
5 bos://<bucket>/hdfs-dr/prod-cluster-01/
执行完成后,备份数据位于:
1bos://<bucket>/hdfs-dr/prod-cluster-01/data
参数说明:
| 参数 | 说明 |
|---|---|
-m 20 |
Map 任务并发数,根据集群规模和网络带宽调整 |
-bandwidth 50 |
限制每个 Map 的带宽,单位 MB/s,避免影响线上业务 |
/data |
源 HDFS 目录 |
bos://<bucket>/hdfs-dr/prod-cluster-01/ |
目标 BOS 备份根路径 |
6.2 增量备份
对于已经完成过全量备份的目录,可以使用 -update 进行增量同步。
1hadoop distcp \
2 -update \
3 -m 20 \
4 -bandwidth 50 \
5 /data \
6 bos://<bucket>/hdfs-dr/prod-cluster-01/
-update 会跳过未变化的文件,仅复制新增或发生变化的文件。
如需在增量同步时删除目标端多余文件,可以使用 -delete 参数。使用前请确认目标 BOS 路径只用于当前 HDFS 目录备份,避免删除其他目录的历史备份数据。
注意:
-delete会删除 BOS 目标路径中源端已不存在的文件。首次使用前建议先在测试目录验证,避免误删历史备份。
7. 故障恢复流程
当生产 BMR 集群发生不可恢复故障,或需要在新集群中恢复数据时,可以按照以下流程操作。
7.1 创建或准备恢复集群
准备一个新的 BMR 集群,建议满足以下条件:
- 与生产集群 Hadoop/HDFS 版本兼容。
- HDFS 总容量不小于待恢复数据量。
- 网络可访问备份 BOS Bucket。
- 已具备执行 DistCp 所需的 HDFS 和计算资源。
7.2 验证恢复集群访问 BOS
1hadoop fs -ls bos://<bucket>/hdfs-dr/prod-cluster-01/
确认可以看到备份数据。
7.3 确认恢复目标路径
恢复前需要确认目标路径是否已经存在,避免把数据恢复到错误目录或覆盖已有数据。
1hdfs dfs -ls /
2hdfs dfs -test -e /data && hdfs dfs -ls /data || echo "/data does not exist"
如果 /data 不存在,可以直接恢复到 HDFS 根目录;如果 /data 已存在,请先确认该目录是否为空、是否允许合并恢复,或选择新的恢复目录进行验证。
7.4 从 BOS 恢复数据到 HDFS
恢复 /data:
1hadoop distcp \
2 -m 20 \
3 -bandwidth 50 \
4 bos://<bucket>/hdfs-dr/prod-cluster-01/data \
5 /
上述命令会将 BOS 中的 data 目录恢复到 HDFS 根目录下,对应恢复路径为 /data。
如需先恢复到临时目录进行校验,可以执行:
1hdfs dfs -mkdir -p /tmp/hdfs-dr-restore
2
3hadoop distcp \
4 -m 20 \
5 -bandwidth 50 \
6 bos://<bucket>/hdfs-dr/prod-cluster-01/data \
7 /tmp/hdfs-dr-restore/
临时恢复完成后,对应路径为 /tmp/hdfs-dr-restore/data。
8. 恢复后校验
恢复完成后,需要进行数据完整性校验。
8.1 校验目录大小和文件数
源集群可用时,在源集群执行:
1hdfs dfs -count -h /data
恢复集群执行:
1hdfs dfs -count -h /data
对比目录数、文件数和总大小。
9. 备份策略建议
9.1 备份频率
| 数据类型 | 建议频率 |
|---|---|
| 核心生产数据 | 每小时或每天多次 |
| 普通业务数据 | 每天一次 |
| 历史归档数据 | 每周或每月一次 |
9.2 并发和带宽控制
DistCp 任务会消耗 HDFS、计算、网络和 BOS 访问资源。
建议:
- 在线业务高峰期降低
-m并发。 - 使用
-bandwidth控制单个 Map 带宽。 - 大目录优先在低峰期备份。
- 对不同业务目录分批备份,避免集中冲击 NameNode。
- 首次全量备份后,后续尽量使用增量备份。
评价此篇文章
