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