温馨提示×

Ubuntu HDFS如何实现数据备份

小樊
36
2025-11-29 03:08:49
栏目: 智能运维

Ubuntu 环境下 HDFS 备份与恢复实操指南

一 备份总览与适用场景

  • HDFS 副本冗余:通过提高 dfs.replication 实现同集群容错,适合节点故障的快速自愈,但并非跨集群或跨地域的备份。
  • 快照 SnapShot:对目录创建时间点只读副本,开销小、恢复快,适合误删或逻辑错误的快速回滚。
  • 跨集群复制 DistCp:在集群间进行全量/增量数据拷贝,适合同城/异地备份与迁移。
  • 回收站 Trash:误删后短期可恢复,属于“缓冲式”保护,不能替代长期备份。
  • NameNode 元数据备份:定期持久化 fsimageedits,是集群级灾难恢复的关键。
  • 纠删码 Erasure Coding:在接近三副本容错能力下降低存储占用,属于存储策略优化,不能替代跨集群备份。

二 快速上手 常用命令清单

  • 快照(目录需先允许快照)
    • 允许快照:hdfs dfsadmin -allowSnapshot /path/to/dir
    • 创建快照:hdfs dfs -createSnapshot /path/to/dir snap_20251129
    • 列出快照:hdfs dfsadmin -listSnapshots /path/to/dir
    • 从快照恢复:hdfs dfs -cp /path/to/dir/.snapshot/snap_20251129/file /path/to/dir/file
  • 回收站(默认关闭,开启后误删可恢复)
    • 配置 core-site.xml:
      <property><name>fs.trash.interval</name><value>120</value></property>
      <property><name>fs.trash.checkpoint.interval</name><value>120</value></property>
      
    • 恢复示例:hdfs dfs -mv /user/hadoop/.Trash/Current/file /user/hadoop/file
  • 跨集群备份 DistCp
    • 全量备份:hdfs distcp -m 50 hdfs://src-nn:8020/data hdfs://backup-nn:8020/backup/20251129
    • 增量备份(基于上次 DistCp 的变更):hdfs distcp -update -m 50 hdfs://src-nn:8020/data hdfs://backup-nn:8020/backup/latest
  • 手动拷贝与归档
    • 同集群拷贝:hdfs dfs -cp -r /data /backup/20251129
    • 导出到本地归档:hdfs dfs -get /data /local/backup/20251129.tar.gz
  • 数据校验
    • 块与位置校验:hdfs fsck /data -files -blocks -locations

三 关键备份场景与步骤

  • 场景A 同集群快照回滚(快速恢复误删/误改)
    1. 对目标目录启用快照:hdfs dfsadmin -allowSnapshot /data
    2. 创建快照:hdfs dfs -createSnapshot /data snap_20251129
    3. 发生误删后,从快照拷贝回原路径:hdfs dfs -cp /data/.snapshot/snap_20251129/file /data/file
  • 场景B 跨集群/异地备份(DistCp)
    1. 准备备份集群(目标 NameNodeHDFS 可用,目录已创建)
    2. 执行全量备份:hdfs distcp -m 50 hdfs://src-nn:8020/data hdfs://backup-nn:8020/backup/20251129
    3. 后续按日/小时做增量:hdfs distcp -update -m 50 hdfs://src-nn:8020/data hdfs://backup-nn:8020/backup/latest
    4. 校验:hdfs dfs -count hdfs://backup-nn:8020/backup/20251129hdfs fsck
  • 场景C NameNode 元数据备份与恢复(集群级灾难恢复关键)
    1. 进入安全模式:sudo -u hdfs hdfs dfsadmin -safemode enter
    2. 保存命名空间:sudo -u hdfs hdfs dfsadmin -saveNamespace(生成最新 fsimage 并重置 edits
    3. 备份元数据目录(默认如 /dfs/nn/current)到安全位置
    4. 恢复时先停 NN,替换 current 目录并恢复属主:sudo -u hdfs chown -R hdfs:hdfs /dfs/nn/current,退出安全模式:sudo -u hdfs hdfs dfsadmin -safemode leave
  • 场景D 回收站误删恢复(短期保护)
    1. 确认已开启回收站(见上文配置)
    2. 在回收站中找到文件并移回:hdfs dfs -mv /user/hadoop/.Trash/Current/file /user/hadoop/file
  • 场景E Hive 元数据备份(若使用 Hive)
    • 备份(示例为 MariaDB):mysqldump -uroot -p --databases metastore > metastore_$(date +%F).sql
    • 恢复:mysql -uroot -p < metastore_$(date +%F).sql

四 自动化与调度示例

  • DistCp 每日全量 + 增量脚本(Ubuntu 使用 cron)
    #!/usr/bin/env bash
    set -e
    SRC="hdfs://src-nn:8020/data"
    BK_BASE="hdfs://backup-nn:8020/backup"
    DATE=$(date +%F)
    LATEST="$BK_BASE/latest"
    YESTERDAY="$BK_BASE/$DATE"
    
    # 全量或首次
    if ! hdfs dfs -test -d "$LATEST"; then
      hdfs distcp -m 50 "$SRC" "$YESTERDAY"
    else
      hdfs distcp -update -m 50 "$SRC" "$LATEST"
    fi
    
    # 原子切换 latest 指针
    hdfs dfs -rm -r "$LATEST" 2>/dev/null || true
    hdfs dfs -mkdir -p "$LATEST"
    hdfs dfs -cp -r "$YESTERDAY"/* "$LATEST/"
    
    # 简单校验
    hdfs dfs -count "$LATEST"
    
    • 定时任务(每天 02:00):0 2 * * * /opt/backup/backup_hdfs_distcp.sh >> /var/log/hdfs_backup.log 2>&1
  • 配置与脚本备份(随数据一起保护)
    • 打包 Hadoop 配置:sudo tar czvf /opt/backup/hadoop-conf-$(date +%F).tar.gz /etc/hadoop/conf/*.xml
    • 同步到远端:rsync -avz /opt/backup/ backup-server:/data/backup/hdfs/
    • 建议与数据备份同频,保留至少 7–30 天

五 策略与最佳实践

  • 全量+增量结合:首次全量,后续用 DistCp -update 做增量;重要目录可叠加快照做细粒度回滚。
  • 多地点与云对象存储:将备份指向异地集群S3 兼容对象存储(如 MinIO),降低单点风险。
  • 定期恢复演练:按月/季度验证可恢复性与完整性(校验行数、校验和、抽样对比)。
  • 监控与告警:对 DistCp 作业状态、NameNode 安全模式、磁盘/配额 设置监控与告警。
  • 存储策略优化:冷数据启用 Erasure Coding 节省空间,热数据保持较高副本Balancer均衡。
  • 安全合规:备份链路启用 KerberosTLS,严格控制备份目录权限与保留策略。

0