基于OSS的HDFS集群容灾方案

单可用区故障可能导致 HDFS 数据丢失及服务中断。本方案通过 OSS 跨可用区存储实现定期冷备,以便在故障发生时迅速启动新的集群并恢复数据,从而保障业务的连续性。

方案架构

核心逻辑在于利用阿里云对象存储OSS作为高可用的冷备数据中心,定期将生产EMR集群的数据及元数据备份至OSS。在发生灾难时,可在新的可用区启动一个EMR集群,并从OSS中拉取备份数据进行恢复。

image

架构说明:

  • 生产EMR集群:位于可用区A,承载线上业务的读写,定期将数据及元数据备份至OSS。

  • 备份EMR集群:位于可用区B,当生产EMR集群发生故障时,快速创建实例并从OSS恢复数据,以确保业务的连续性。

  • 对象存储OSS:作为灾备存储介质。

核心流程

步骤一:准备备份环境

  1. 创建OSS Bucket

    1. 登录OSS控制台,在左侧导航栏进入Bucket列表页面,单击创建Bucket

    2. 配置以下关键参数,其余保留默认值:

      • Bucket名称:输入一个全局唯一的名称,例如 backup-hdfs-bucket

      • 地域:选择EMR集群所在地域。

      • 存储冗余类型:选择同城冗余存储。

    3. 单击完成创建

  2. 配置 OSS 的 AccessKey

    1. Hadoopcore-site.xml文件中,添加访问OSS所需的配置。

      <configuration>
          <property>
              <name>fs.oss.accessKeyId</name>
              <value>YourAccessKeyId</value>
          </property>
      
          <property>
              <name>fs.oss.accessKeySecret</name>
              <value>YourAccessKeySecret</value>
          </property>
      
          <property>
              <name>fs.oss.endpoint</name>
              <!-- 阿里云ECS环境下推荐使用内网OSS Endpoint,即oss-cn-xxx-internal.aliyuncs.com -->
              <value>oss-cn-xxx.aliyuncs.com</value>
          </property>
      </configuration>
    2. 配置完成后,在集群节点上执行命令,确认可以正常访问OSS Bucket。

      hadoop fs -ls oss://your-bucket-name/

步骤二:数据与元数据备份

  • 数据备份

    # 定义变量
    BACKUP_DIR="/data"
    BUCKET="oss://${your-bucket-name}/data"
    
    # 执行DistCp命令
    hadoop distcp -update -m 20 $BACKUP_DIR $BUCKET

    参数说明:

    • BACKUP_DIR:EMR集群需要备份的目录。

    • BUCKET:步骤一种创建的OSS Bucket。

    • -update:仅复制源路径中不存在或发生变化的文件,适用于增量备份场景。

    • -m 20:指定DistCp使用的Map任务并发度为20,需根据集群规模和网络带宽调整。

    关于使用distcp的参考,请参见Hadoop社区文档。或者,您也可以使用DataWorks的数据同步功能,请参见使用DistCp任务实现大规模文件迁移

  • 元数据备份

    • NameNode元数据:元数据通常位于NameNode节点的本地磁盘,默认路径为/mnt/disk1/hdfs/name/current

    • JournalNode元数据(HA模式):在高可用(HA)模式下,还需备份JournalNode集群的数据,默认路径为/mnt/disk1/hdfs/journal

    使用distcpossutil工具,将上述目录定期完整复制到OSS的独立路径下。

    说明

    元数据备份的核心作用在于:当生产环境EMR集群所在可用区恢复后,若集群仍因元数据损坏无法正常运作,可通过元数据备份实现快速替换以恢复业务。需特别说明的是,备份EMR集群的数据恢复过程会自动重建元数据,禁止使用备份元数据以避免数据不一致风险。

步骤三:故障恢复

在生产可用区发生故障后,请按照以下步骤在备用可用区恢复EMR集群。

  1. 准备新集群
    在另一健康可用区,使用集群克隆或者容灾计划等功能创建新的EMR集群,并确保满足必要的节点资源和存储空间。

  2. 恢复数据
    在新集群上执行DistCp命令,将数据从OSS Bucket拉取回新的EMR集群。

    # 定义变量
    OSS_BUCKET="oss://your-bucket-name/data"
    NEW_HDFS_DIR="/path/to/your/data"
    
    # 执行DistCp恢复命令
    hadoop distcp -update -m 20 ${OSS_BUCKET} ${NEW_HDFS_DIR}
  3. 新集群验证

    • 切换集群地址:将上游数据生产应用和下游数据消费应用的配置指向新的EMR集群地址。

    • 数据验证:对关键业务流程进行测试,以验证新集群数据的完整性和有效性。

    • 切换集群:在全面验证新集群的功能和性能后,即可正式进行切换至新集群。

实施建议

  • 备份策略

    • 根据数据重要性分级,采用不同备份频率。例如,对于关键业务数据,建议实施每日全量备份+每小时增量备份。

    • 结合数据生命周期管理,优化老旧数据的备份频率。

  • 性能调优

    • 使用压缩传输减少网络带宽消耗。

    • 调整MapReduce任务配置,以优化备份恢复的性能。

    • 合理配置distcp的并发度(-m参数),以平衡网络带宽与负载。