更新时间:2023-03-17 GMT+08:00

配置HBase备份

操作场景

HBase集群备份作为提高HBase集群系统高可用性的一个关键特性,为HBase提供了实时的异地数据备份功能。它对外提供了基础的运维工具,包含主备关系维护、重建,数据校验,数据同步进展查看等功能。为了实现数据的实时备份,可以把本HBase集群中的数据备份到另一个集群。

前提条件

  • 主备集群都已经安装并启动成功(在Console页面“现有集群”页签,查看集群状态为“运行中”),且获取集群的管理员权限。
  • 必须保证主备集群间的网络畅通和端口的使用。
  • 主备集群必须已配置跨集群互信。
  • 如果主集群上有历史数据,需要同步到备集群上,那么主备集群必须配置跨集群拷贝,请参见启用集群间拷贝功能
  • 主备集群上的时间必须一致,而且主备集群上的NTP服务必须使用同一个时间源。
  • 必须在主备集群中的“/etc/hosts”文件中,配置主备集群所有机器的机器名与业务IP地址的对应关系。配置方式为在hosts文件中追加"192.***.***.*** host1"。
  • 主备集群间的网络带宽需要根据业务流量而定,不应少于最大的可能业务流量。

使用约束

  • 尽管备份提供了实时的数据复制功能,但实际的数据同步进展,由多方面的因素决定的,例如,当前主集群业务的繁忙程度,备集群进程的健康状态等。因此,在正常情形下,备集群不应该接管业务。极端情形下是否可以接管业务,可由系统维护人员以及决策人员根据当前的数据同步指标来决定。
  • 备份功能当前仅支持一主一备。
  • 通常情况下,不允许对备集群的同步表进行表级别的操作,例如修改表属性、删除表等,一旦误操作备集群后会造成主集群数据同步失败、备集群对应表的数据丢失。
  • 主集群的HBase表已启用备份功能同步数据,用户每次修改表的结构时,需要手动修改备集群的同步表结构,保持与主集群表结构一致。

操作步骤

启用主集群的备份功能来同步put方式写入的数据

  1. 登录MRS控制台,单击集群名称,选择“组件管理”。
  2. 进入HBase服务参数“全部配置”界面,具体操作请参考修改集群服务配置参数

    若集群详情页面没有“组件管理”页签,请先完成IAM用户同步(在集群详情页的“概览”页签,单击“IAM用户同步”右侧的“同步”进行IAM用户同步)。

  3. (可选)如表1所示,为HBase备份操作过程中的可选配置项,您可以根据描述来进行参数配置,或者使用缺省提供的值。

    表1 可选配置项

    配置入口

    配置项

    默认值

    描述

    “HMaster > 性能”

    hbase.master.logcleaner.ttl

    600000

    HLog文件生存时间。如果配置值为“604800000”(单位:毫秒),表示HLog的保存期限为7天。

    hbase.master.cleaner.interval

    60000

    HMaster清理过去HLog文件的周期,即超过设置的时间的HLog会被自动删除。建议尽可能配置大的值来保留更多的HLog。

    “RegionServer > Replication”

    replication.source.size.capacity

    16777216

    edits最大大小。单位为byte。如果edit大小超过这个值Hlog edits将会发送到备集群。

    replication.source.nb.capacity

    25000

    edits最大数目,是另一个触发Hlog edits到备集群的条件。当主集群同步数据到备集群中时,主集群会从HLog中读取数据,此时会根据本参数配置的个数读取并发送。与“replication.source.size.capacity”一起配置使用。

    replication.source.maxretriesmultiplier

    10

    replication出现异常时的最大重试次数。

    replication.source.sleepforretries

    1000

    每次重试的sleep时间。(单位:毫秒)

    hbase.regionserver.replication.handler.count

    6

    RegionServer上的replication RPC服务器实例数。

启用主集群备份功能来同步Bulkload方式写入的数据

  1. 是否启用Bulkload写数据备份功能?

    当使用了HBase 的Bulkload导入数据的特性时且需要同步这些数据时,需要开启批量写数据备份功能。

    是,执行5

    否,执行9

  2. 参考修改集群服务配置参数进入HBase服务参数“全部配置”界面。
  3. 在主、备集群的HBase配置界面,搜索并修改“hbase.replication.cluster.id”参数,表示主、备集群HBase的id,例如主集群HBase的id配置为“replication1”,备集群HBase的id配置为“replication2”,用于主备集群的连接。为了节省数据开销建议参数值长度不超过30。
  4. 在备集群的HBase配置界面,搜索并修改“hbase.replication.conf.dir”参数,表示备集群中所使用主集群客户端的HBase配置,用于启用bulkload数据备份功能时的数据备份。参数值为路径名,例如“/home”。

    • MRS 3.x之前的版本无需配置此参数,可跳过步骤7
    • 当启用bulkload数据备份功能时,需在备集群的所有RegionServer节点上手动放置主集群中HBase相应客户端配置文件(core-site.xml, hdfs-site.xml, hbase-site.xml),放置配置文件的实际路径为“${hbase.replication.conf.dir}/${hbase.replication.cluster.id}”。例如备集群的hbase.replication.conf.dir配置为“/home”,主集群的hbase.replication.cluster.id配置为“replication1”,则配置文件放置在备集群中实际的路径为“/home/replication1”。并修改对应目录及文件相应权限,可执行如下命令chown -R omm:wheel /home/replication1
    • 客户端配置文件可从主集群中的的客户端中获取,例如,路径为“/opt/client/HBase/hbase/conf”

  5. 在主集群的HBase配置界面,搜索并修改“hbase.replication.bulkload.enabled”参数,将配置项的值修改为“true”,启用Bulkload写数据备份功能。

重启HBase服务并安装客户端。

  1. 保存配置,并重启HBase服务。
  2. 在主备集群,更新客户端配置文件。

同步主集群表数据。(主集群无数据可不执行)

  1. 以“hbase”用户进入集群的HBase shell界面。

    1. 在已更新客户端的主管理节点,执行以下命令切换到客户端目录。

      cd /opt/client

    2. 执行以下命令配置环境变量。

      source bigdata_env

    3. 如果当前集群已启用Kerberos认证,执行以下命令认证当前用户。如果当前集群未启用Kerberos认证,则无需执行此命令。

      kinit hbase

      执行kinit hbase后系统提示输入密码,hbase用户默认密码是Hbase@123。

    4. 直接执行HBase组件的客户端命令。

      hbase shell

  1. 检查备集群上是否已有历史数据。如果有历史数据且需要保持主备集群上的数据完全一致,需要先清理备集群上的数据。

    1. 在备集群的hbase shell界面中,执行list命令查看备集群中已经存在的表。
    2. 根据输出列表删除备集群上的数据表。

      disable 'tableName'

      drop 'tableName'

  2. 检查配置HBase备份并启用数据同步后,主集群是否已存在表及数据,且历史数据需要同步到备集群。

    执行list命令查看主集群中已经存在的表,使用scan 'tableName'命令查看表中是否已经有历史数据。

    • 是,存在表且需要同步数据,执行14
    • 否,不需要同步数据,任务结束。

  3. 配置HBase备份时不支持自动同步表中的历史数据,需要对主集群的历史数据进行备份,然后再手动同步历史数据到备集群中。

    手动同步即单表的同步,单表手动同步通过Export、distcp、Import来完成。

    单表手动同步操作步骤:

    1. 从主集群导出表中数据。

      hbase org.apache.hadoop.hbase.mapreduce.Export -Dhbase.mapreduce.include.deleted.rows=true 表名 保存源数据的目录

      例如,hbase org.apache.hadoop.hbase.mapreduce.Export -Dhbase.mapreduce.include.deleted.rows=true t1 /user/hbase/t1

    2. 把导出的数据复制到备集群。

      hadoop distcp 主集群保存源数据的目录 hdfs://ActiveNameNodeIP:9820/备集群保存源数据的目录

      其中,ActiveNameNodeIP是备集群中主NameNode节点的IP地址。

      例如,hadoop distcp /user/hbase/t1 hdfs://192.168.40.2:9820/user/hbase/t1

    3. 使用备集群HBase表用户,在备集群中导入数据。

      hbase org.apache.hadoop.hbase.mapreduce.Import -Dimport.bulk.output=备集群保存输出的目录 表名 备集群保存源数据的目录

      hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles 备集群保存输出的目录 表名

      例如,hbase org.apache.hadoop.hbase.mapreduce.Import -Dimport.bulk.output=/user/hbase/output_t1 t1 /user/hbase/t1

      hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /user/hbase/output_t1 t1

添加主备集群备份关系。

  1. 在HBase shell中执行如下命令,创建主集群HBase与备集群HBase之间的备份同步关系。

    add_peer '备集群ID', CLUSTER_KEY => '备集群ZooKeeper地址信息',{HDFS_CONFS => true}

    • 备集群ID表示主集群识别备集群使用的id,建议使用字母与数字。
    • 备集群ZooKeeper地址信息包含ZooKeeper业务IP地址、侦听客户端连接的端口和备集群的HBase在ZooKeeper上的根目录。
    • {HDFS_CONFS => true}表示将主集群的默认HDFS配置信息同步到对应集群,用于备集群的HBase访问主集群的HDFS。如果不启用Bulkload批量写数据备份,可以不使用此参数。

      例如,添加包含BulkLoad数据的主备集群备份关系,若备集群ID为“replication2”,备集群ZooKeeper地址信息为“192.168.40.2,192.168.40.3,192.168.40.4:2181:/hbase”。

      • 安全集群请执行:add_peer 'replication2',CLUSTER_KEY => '192.168.40.2,192.168.40.3,192.168.40.4:2181:/hbase',CONFIG => { "hbase.regionserver.kerberos.principal" => "<val>", "hbase.master.kerberos.principal" => "<val2>" },普通集群请执行add_peer 'replication2',CLUSTER_KEY => '192.168.40.2,192.168.40.3,192.168.40.4:2181:/hbase'
        其中参数“hbase.master.kerberos.principal”和“hbase.regionserver.kerberos.principal”为安全集群中hbase的kerberos用户,可搜索客户端中hbase-site.xml文件得到参数值。例如,客户端安装在master节点的“/opt/client”下,则可使用命令grep "kerberos.principal" /opt/client/HBase/hbase/conf/hbase-site.xml -A1获取,如下图所示。
        图1 获取hbase的principal
      1. 获取ZooKeeper业务IP地址。

        登录MRS控制台,单击集群名称,选择“组件管理 > ZooKeeper > 实例”,获取ZooKeeper业务IP地址。

      2. 在ZooKeeper服务参数“全部配置”界面,搜索获取clientPort,即为客户端连接服务器的端口。
      3. 执行list_peers命令判断主备备份关系添加结果,当界面提示以下信息表示成功。
        hbase(main):003:0> list_peers
        PEER_ID CLUSTER_KEY ENDPOINT_CLASSNAME STATE REPLICATE_ALL NAMESPACES TABLE_CFS BANDWIDTH SERIAL
        replication2 192.168.0.13,192.168.0.177,192.168.0.25:2181:/hbase ENABLED  true   0 false

指定主备集群写数据状态。

  1. 在主集群HBase shell界面,执行以下命令保持写数据状态。

    set_clusterState_active

    界面提示以下信息表示执行成功:

    hbase(main):001:0> set_clusterState_active
    => true

  2. 在备集群HBase shell界面,执行以下命令保持只读数据状态。

    set_clusterState_standby

    界面提示以下信息表示执行成功:

    hbase(main):001:0> set_clusterState_standby
    => true

启用HBase备份功能同步数据。

  1. 检查备集群的HBase服务实例中,是否已存在一个命名空间,与待启用备份功能的HBase表所属的命名空间名称相同?

    在备集群的HBase shell中,执行list_namespace命令,查询命名空间。
    • 是,存在同名的命令空间,执行19
    • 否,不存在同名的命令空间,需先在备集群的HBase shell中,执行

      create_namespace 'ns1'创建同名的命名空间,然后执行19

  2. 在主集群的HBase shell中,执行以下命令,启用主集群表的数据实时备份功能,确保后续主集群中修改的数据能够实时同步到备集群中。

    一次只能针对一个HTable进行数据同步。

    enable_table_replication '表名'

    • 若备集群中不存与要开启实时同步的表同名的表,则该表会自动创建。
    • 若备集群中存在与要开启实时同步的表同名的表,则两个表的结构必须一致。
    • 若'表名'设置了加密算法SMS4或AES,则不支持对此HBase表启用将数据从主集群实时同步到备集群的功能。
    • 若备集群不在线,或备集群中已存在同名但结构不同的表,启用备份功能将失败。

      若备集群不在线,请启动备集群。

      若备集群中已存在同名但结构不同的表,请修改备集群的表结构为相同的表结构。在备集群的HBase shell中,执行alter命令,参考示例修改。

  3. 在主集群的HBase shell中,执行以下命令,启用主集群的实时备份功能,同步HBase的权限表。

    enable_table_replication 'hbase:acl'

    主集群HBase源数据表修改权限时,如果备集群需要正常读取数据,请修改备集群角色的权限。

检验主备集群数据同步状态。

  1. 在HBase客户端执行以下命令,校验主备集群同步的数据。启用备份同步功能后,也可以执行该命令检验新的同步数据是否一致。

    hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication --starttime=开始时间 --endtime=结束时间 列族名称 备集群ID 表名

    • 开始时间必须早于结束时间。
    • 开始时间和结束时间需要填写时间戳的格式,例如执行date -d "2015-09-30 00:00:00" +%s将普通时间转化为时间戳格式。因此命令返回的为10位数字(精确到秒),而HBase识别的为13位(精确到毫秒),所以需要在date命令返回的结果后补上3个0。

    主备集群发生倒换

    1. 当备集群需要被倒换为主集群时,请参见2~1015~20重新配置主备关系。
    2. 勿需执行“同步集群表数据”操作,即11~14

相关命令

表2 HBase备份

操作

命令

描述

建立主备关系

add_peer '备集群ID', '备集群地址信息'

示例:

add_peer '1', 'zk1,zk2,zk3:2181:/hbase'

add_peer '1', 'zk1,zk2,zk3:2181:/hbase1'

建立主集群与备集群的关系,让其互相对应。如果启用Bulkload批量写数据备份,则命令为add_peer '备集群ID',CLUSTER_KEY => '备集群地址信息'并配置参数"hbase.replication.conf.dir",同时手动拷贝主集群的hbase相应客户端配置文件到备集群的所有RegionServer节点,详情请参考4~11

移除主备关系

remove_peer '备集群ID'

示例:

remove_peer '1'

在主集群中移除备集群的信息。

查询主备关系

list_peers

在主集群中查询已经设置的备集群的信息,主要为Zookeeper信息。

启用用户表实时同步

enable_table_replication '表名'

示例:

enable_table_replication 't1'

在主集群中,设置已存在的表同步到备集群。

禁用用户表实时同步

disable_table_replication '表名'

示例:

disable_table_replication 't1'

在主集群中,设置已存在的表不同步到备集群。

主备集群数据校验

bin/hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication --starttime=开始时间 --endtime=结束时间 列族名称 备集群ID 表名

检查指定的表在主备集群间的数据是否一致。

命令行中参数说明如下:

  • 开始时间:如果未设置,则取默认的开始时间为0。
  • 结束时间:如果未设置,则取默认的结束时间为当前操作提交的时间。
  • 表名:如果未输入表名,则默认校验所有的启用了实时同步的用户表。

切换数据写入状态

set_clusterState_active

set_clusterState_standby

设置集群HBase表是否可写入数据。

新增或更新已经在对端集群保存的主集群中HDFS配置

set_replication_hdfs_confs 'PeerId', {'key1' => 'value1', 'key2' => 'value2'}

启用包含Bulkload数据的备份,在主集群修改HDFS参数时,新的参数值默认不会从主集群自动同步到备集群,需要手动执行命令同步。受影响的参数如下:

  • “fs.defaultFS”
  • “dfs.client.failover.proxy.provider.hacluster”
  • “dfs.client.failover.connection.retries.on.timeouts”
  • “dfs.client.failover.connection.retries”

例如,“fs.defaultFS”修改为“hdfs://hacluster_sale”,同步HDFS配置到id为1的备集群时执行:set_replication_hdfs_confs '1', {'fs.defaultFS' => 'hdfs://hacluster_sale'}