HBase备份与恢复 #
一、备份概述 #
1.1 备份类型 #
text
HBase备份类型
├── 快照备份
│ ├── 元数据快照
│ ├── 速度快
│ └── 占用空间小
│
├── Export导出
│ ├── 数据导出到HDFS
│ ├── 全量备份
│ └── 可跨集群恢复
│
├── CopyTable
│ ├── 表级复制
│ └── 跨集群复制
│
└── Replication
├── 实时复制
└── 灾备方案
1.2 备份策略 #
text
备份策略
├── 全量备份
│ └── 定期全量备份
│
├── 增量备份
│ └── 基于快照的增量备份
│
└── 实时备份
└── Replication实时复制
二、快照备份 #
2.1 快照原理 #
text
┌─────────────────────────────────────────────────────────────────────┐
│ 快照原理 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 快照特点: │
│ ├── 只记录元数据 │
│ ├── 不复制实际数据 │
│ ├── 创建速度快 │
│ └── 占用空间小 │
│ │
│ 快照流程: │
│ 1. 触发Flush │
│ 2. 记录HFile列表 │
│ 3. 创建元数据快照 │
│ 4. 完成快照 │
│ │
│ 数据写入: │
│ ├── 快照后新数据正常写入 │
│ └── 原HFile不被删除(被快照引用) │
│ │
└─────────────────────────────────────────────────────────────────────┘
2.2 创建快照 #
ruby
# 创建快照
snapshot 'user', 'user_snapshot_20240101'
# 查看快照列表
list_snapshots
# 查看特定表的快照
list_snapshots 'user.*'
# 查看快照详情
describe_snapshot 'user_snapshot_20240101'
2.3 快照管理 #
ruby
# 删除快照
delete_snapshot 'user_snapshot_20240101'
# 删除多个快照
delete_all_snapshot 'user_.*'
# 克隆快照为新表
clone_snapshot 'user_snapshot_20240101', 'user_clone'
# 克隆快照到归档表
clone_snapshot 'user_snapshot_20240101', 'user_archive', false
2.4 从快照恢复 #
ruby
# 方式一:恢复原表(表需禁用)
disable 'user'
restore_snapshot 'user_snapshot_20240101'
enable 'user'
# 方式二:克隆为新表
clone_snapshot 'user_snapshot_20240101', 'user_restored'
# 方式三:导出快照到其他集群
# 见下文快照导出
2.5 快照导出 #
bash
# 导出快照到HDFS
hbase snapshot export \
-snapshot user_snapshot_20240101 \
-copy-to hdfs://target-cluster/hbase \
-mappers 16
# 从HDFS导入快照
hbase snapshot import \
-snapshot user_snapshot_20240101 \
-copy-from hdfs://source-cluster/hbase
三、Export导出 #
3.1 Export工具 #
bash
# 导出表到HDFS
hbase org.apache.hadoop.hbase.mapreduce.Export \
-D mapreduce.job.queuename=default \
user \
/backup/user_20240101
# 导出指定版本
hbase org.apache.hadoop.hbase.mapreduce.Export \
-D hbase.mapreduce.scan.version=3 \
user \
/backup/user_20240101
# 导出指定时间范围
hbase org.apache.hadoop.hbase.mapreduce.Export \
-D hbase.mapreduce.scan.timerange.start=1704067200000 \
-D hbase.mapreduce.scan.timerange.end=1704153600000 \
user \
/backup/user_20240101
3.2 Import导入 #
bash
# 从HDFS导入数据
hbase org.apache.hadoop.hbase.mapreduce.Import \
user \
/backup/user_20240101
# 导入到新表
# 先创建目标表
echo "create 'user_restored', 'info'" | hbase shell
# 导入数据
hbase org.apache.hadoop.hbase.mapreduce.Import \
user_restored \
/backup/user_20240101
四、CopyTable #
4.1 CopyTable复制 #
bash
# 复制表到同一集群
hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
--peer.adr=localhost:2181:/hbase \
--new.name=user_copy \
user
# 复制表到其他集群
hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
--peer.adr=target-zk:2181:/hbase \
--new.name=user_copy \
user
# 复制指定时间范围
hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
--peer.adr=target-zk:2181:/hbase \
--starttime=1704067200000 \
--endtime=1704153600000 \
user
五、Replication复制 #
5.1 Replication配置 #
xml
<!-- hbase-site.xml -->
<!-- 启用Replication -->
<property>
<name>hbase.replication</name>
<value>true</value>
</property>
<!-- Replication源集群配置 -->
<property>
<name>replication.source.nb.capacity</name>
<value>1000</value>
</property>
<property>
<name>replication.source.maxretries.multiplier</name>
<value>300</value>
</property>
5.2 配置复制对 #
ruby
# 添加复制对
add_peer '1', 'target-zk:2181:/hbase'
# 设置复制表
enable_table_replication 'user'
# 禁用表复制
disable_table_replication 'user'
# 查看复制状态
list_replicated_tables
# 查看复制对状态
list_peers
# 删除复制对
remove_peer '1'
5.3 复制监控 #
ruby
# 查看复制状态
status 'replication'
# 查看复制延迟
show_peer_table_configs
六、备份脚本 #
6.1 自动备份脚本 #
bash
#!/bin/bash
# backup_hbase.sh
TABLES="user order log"
BACKUP_DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/hbase/${BACKUP_DATE}"
SNAPSHOT_PREFIX="auto_backup"
# 创建备份目录
hdfs dfs -mkdir -p ${BACKUP_DIR}
# 备份每个表
for TABLE in ${TABLES}; do
echo "Backing up table: ${TABLE}"
# 创建快照
SNAPSHOT_NAME="${SNAPSHOT_PREFIX}_${TABLE}_${BACKUP_DATE}"
echo "snapshot '${TABLE}', '${SNAPSHOT_NAME}'" | hbase shell
# 导出快照
hbase snapshot export \
-snapshot ${SNAPSHOT_NAME} \
-copy-to ${BACKUP_DIR}/${TABLE}
# 删除快照(可选)
echo "delete_snapshot '${SNAPSHOT_NAME}'" | hbase shell
done
# 清理旧备份(保留7天)
OLD_DATE=$(date -d "7 days ago" +%Y%m%d)
hdfs dfs -rm -r /backup/hbase/${OLD_DATE}
echo "Backup completed: ${BACKUP_DIR}"
6.2 定时备份 #
bash
# crontab配置
# 每天凌晨2点执行备份
0 2 * * * /opt/scripts/backup_hbase.sh >> /var/log/hbase_backup.log 2>&1
七、恢复策略 #
7.1 恢复场景 #
text
恢复场景
├── 误删数据
│ └── 从快照恢复
│
├── 误删表
│ └── 从快照克隆
│
├── 数据损坏
│ └── 从备份恢复
│
└── 灾难恢复
└── 从异地备份恢复
7.2 恢复流程 #
bash
# 恢复流程示例
# 1. 确认恢复点
list_snapshots 'user.*'
# 2. 禁用表
echo "disable 'user'" | hbase shell
# 3. 恢复快照
echo "restore_snapshot 'user_snapshot_20240101'" | hbase shell
# 4. 启用表
echo "enable 'user'" | hbase shell
# 5. 验证数据
echo "scan 'user', {LIMIT => 10}" | hbase shell
7.3 灾难恢复 #
bash
# 灾难恢复流程
# 1. 导入快照
hbase snapshot import \
-snapshot user_snapshot_20240101 \
-copy-from hdfs://backup-cluster/backup/hbase/20240101/user
# 2. 克隆快照
echo "clone_snapshot 'user_snapshot_20240101', 'user'" | hbase shell
# 3. 验证数据
echo "count 'user'" | hbase shell
八、备份最佳实践 #
8.1 备份策略建议 #
text
备份策略建议
├── 定期快照
│ └── 每日快照,保留7天
│
├── 定期导出
│ └── 每周导出,保留4周
│
├── 异地备份
│ └── 跨集群复制
│
└── 重要数据
└── 增加备份频率
8.2 备份验证 #
text
备份验证建议
├── 定期恢复测试
│ └── 每月测试恢复
│
├── 数据校验
│ └── 校验备份数据完整性
│
└── 恢复演练
└── 定期进行恢复演练
8.3 存储管理 #
text
存储管理建议
├── 定期清理旧备份
├── 监控备份空间
├── 压缩备份数据
└── 异地存储备份
九、常见问题 #
9.1 快照创建慢 #
bash
# 问题:快照创建慢
# 解决:检查Flush状态
# 手动Flush
echo "flush 'user'" | hbase shell
# 创建快照
echo "snapshot 'user', 'user_snapshot'" | hbase shell
9.2 恢复失败 #
ruby
# 问题:恢复失败
# 解决:检查表状态
# 检查表是否禁用
is_disabled 'user'
# 如果未禁用
disable 'user'
restore_snapshot 'user_snapshot'
enable 'user'
9.3 备份空间不足 #
bash
# 问题:备份空间不足
# 解决:清理旧备份
# 查看备份目录
hdfs dfs -du -h /backup/hbase
# 删除旧备份
hdfs dfs -rm -r /backup/hbase/20230101
十、总结 #
本节介绍了HBase备份与恢复:
| 方式 | 特点 |
|---|---|
| 快照 | 快速、占用空间小 |
| Export | 全量导出、跨集群 |
| CopyTable | 表级复制 |
| Replication | 实时复制 |
下一步,让我们学习性能优化!
最后更新:2026-03-27