你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure 虚拟网络中设置 Apache HBase 群集复制

了解如何在 Azure 中的一个虚拟网络内部或者在两个虚拟网络之间设置 Apache HBase 复制。

群集复制使用源推送方法。 HBase 群集可以是一个源或一个目标,也可以同时充当这两个角色。 复制是异步的。 复制的目标是保持最终一致性。 在启用复制的情况下,当源接收到对列系列的编辑时,该编辑将传播到所有目标群集。 当数据从一个群集复制到另一个群集,会跟踪源群集和所有已使用数据的群集,以防止复制循环。

本文介绍如何设置源-目标复制。 对于其他群集拓扑,请参阅 Apache HBase 参考指南

下面是单个虚拟网络的 HBase 复制用例:

  • 负载均衡。 例如,可以在目标群集上运行扫描或 MapReduce 作业,在源群集上引入数据。
  • 添加高可用性。
  • 在不同的 HBase 群集之间迁移数据。
  • 将 Azure HDInsight 群集从一个版本升级到另一个版本。

下面是两个虚拟网络的 HBase 复制用例:

  • 设置灾难恢复。
  • 对应用程序进行负载均衡和分区。
  • 添加高可用性。

可以使用 GitHub 中的脚本操作脚本复制群集。

先决条件

在开始学习本文之前,必须有一个 Azure 订阅。 请参阅获取 Azure 免费试用版

设置环境

有三个配置选项:

  • 两个 Apache HBase 群集位于一个 Azure 虚拟网络中。
  • 两个 Apache HBase 群集位于同一区域中的两个不同虚拟网络中。
  • 两个 Apache HBase 群集位于两个不同区域中的两个不同虚拟网络中(异地复制)。

本文介绍异地复制方案。

为了帮助设置环境,我们创建了一些 Azure 资源管理器模板。 如果想要使用其他方法设置环境,请参阅:

在两个不同的区域中设置两个虚拟网络

若要使用模板在两个不同区域创建两个虚拟网络并在 VNet 之间创建 VPN 连接,请选择下面的“部署到 Azure”按钮

新群集的“部署到 Azure”按钮

模板中的某些硬编码值:

VNet 1

属性
位置 美国西部
VNet 名称 <ClusterNamePrevix>-vnet1
地址空间前缀 10.1.0.0/16
子网名称 子网 1
子网前缀 10.1.0.0/24
子网(网关)名称 GatewaySubnet(不能更改)
子网(网关)前缀 10.1.255.0/27
网关名称 vnet1gw
网关类型 Vpn
网关 VPN 类型 RouteBased
网关 SKU 基本
网关 IP vnet1gwip

VNet 2

属性
位置 美国东部
VNet 名称 <ClusterNamePrevix>-vnet2
地址空间前缀 10.2.0.0/16
子网名称 子网 1
子网前缀 10.2.0.0/24
子网(网关)名称 GatewaySubnet(不能更改)
子网(网关)前缀 10.2.255.0/27
网关名称 vnet2gw
网关类型 Vpn
网关 VPN 类型 RouteBased
网关 SKU 基本
网关 IP vnet1gwip

或者,按照以下步骤手动设置两个不同的 vnet 和 VM

  1. 在不同的区域中创建两个 VNET(虚拟网络)
  2. 在两个 VNET 中启用对等互连。 转到在上述步骤中创建的虚拟网络,然后单击“对等互连”并添加另一区域的对等互连链接。 为两个虚拟网络都执行此操作。
  3. 在每个 VNET 中创建最新版本的 UBUNTU

设置 DNS

在上一部分,模板在两个虚拟网络的每一个中创建 Ubuntu 虚拟机。 在此部分,请先在两个 DNS 虚拟机上安装 Bind,然后在两个虚拟机上配置 DNS 转发。

若要安装 Bind,需找到两个 DNS 虚拟机的公共 IP 地址。

  1. 打开 Azure 门户
  2. 打开 DNS 虚拟机,方法是选择“资源组”> [资源组名称] > [vnet1DNS]。 资源组名称是在上一过程中创建的。 默认的 DNS 虚拟机名称为 vnet1DNSvnet2NDS
  3. 选择“属性”,打开虚拟网络的属性页。
  4. 记下“公共 IP 地址”,并验证“专用 IP 地址”。 vnet1DNS 的专用 IP 地址应该是 10.1.0.4,vnet2DNS 的专用 IP 地址应该是 10.2.0.4
  5. 将两个虚拟网络的 DNS 服务器更改为使用默认(Azure 提供的)DNS 服务器以允许对下载包进行入站和出站访问,从而可以按以下步骤安装 Bind。

若要安装 Bind,请执行以下过程:

  1. 使用 SSH 连接到 DNS 虚拟机的公共 IP 地址。 以下示例连接到位于 40.68.254.142 的虚拟机:

    ssh sshuser@40.68.254.142
    

    sshuser 替换为创建 DNS 虚拟机时指定的 SSH 用户帐户。

    注意

    可通过多种方法获取 ssh 实用工具。 在 Linux、Unix 和 macOS 上,操作系统会附带此实用工具。 如果使用的是 Windows,请考虑以下选项之一:

  2. 若要安装 Bind,请通过 SSH 会话使用以下命令:

     sudo apt-get update -y
     sudo apt-get install bind9 -y
    
  3. 配置 Bind 以将名称解析请求转发到本地 DNS 服务器。 为此,请使用以下文本作为 /etc/bind/named.conf.options 文件的内容:

    acl goodclients {
        10.1.0.0/16; # Replace with the IP address range of the virtual network 1
        10.2.0.0/16; # Replace with the IP address range of the virtual network 2
        localhost;
        localhost;
    };
    
    options {
        directory "/var/cache/bind";
        recursion yes;
        allow-query { goodclients; };
    
        forwarders {
            168.63.129.16; #This is the Azure DNS server
        };
    
        dnssec-validation auto;
    
        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };
    };
    

    重要

    goodclients 节中的值替换为两个虚拟网络的 IP 地址范围。 此节定义此 DNS 服务器从其接受请求的地址。

    若要编辑该文件,请使用以下命令:

    sudo nano /etc/bind/named.conf.options
    

    若要保存文件,请使用 Ctrl+X、Y,然后按 Enter。

  4. 在 SSH 会话中使用以下命令:

    hostname -f
    

    此命令返回类似于以下文本的值:

    vnet1DNS.icb0d0thtw0ebifqt0g1jycdxd.ex.internal.cloudapp.net
    

    icb0d0thtw0ebifqt0g1jycdxd.ex.internal.cloudapp.net 文本是此虚拟网络的 DNS 后缀。 保存该值,因为稍后会使用它。

    还必须从其他 DNS 服务器中找出 DNS 后缀。 因为下一步骤需要用到。

  5. 若要配置 Bind,以便为虚拟网络中的资源解析 DNS 名称,请使用以下文本作为 /etc/bind/named.conf.local 文件的内容:

    // Replace the following with the DNS suffix for your virtual network
    zone "v5ant3az2hbe1edzthhvwwkcse.bx.internal.cloudapp.net" {
            type forward;
            forwarders {10.2.0.4;}; # The Azure recursive resolver
    };
    

    重要

    必须将 v5ant3az2hbe1edzthhvwwkcse.bx.internal.cloudapp.net 替换为另一个虚拟网络的 DNS 后缀。 转发器 IP 是另一虚拟网络中 DNS 服务器的专用 IP 地址。

    若要编辑该文件,请使用以下命令:

    sudo nano /etc/bind/named.conf.local
    

    若要保存文件,请使用 Ctrl+X、Y,然后按 Enter。

  6. 若要启动 Bind,请使用以下命令:

    sudo service bind9 restart
    
  7. 若要验证绑定是否可以解析另一虚拟网络中的资源名称,请使用以下命令:

    sudo apt install dnsutils
    nslookup vnet2dns.v5ant3az2hbe1edzthhvwwkcse.bx.internal.cloudapp.net
    

    重要

    vnet2dns.v5ant3az2hbe1edzthhvwwkcse.bx.internal.cloudapp.net 替换为另一网络中 DNS 虚拟机的完全限定的域名 (FQDN)。

    10.2.0.4 替换为另一虚拟网络中自定义 DNS 服务器的内部 IP 地址

    显示的响应类似于以下文本:

    Server:         10.2.0.4
    Address:        10.2.0.4#53
    
    Non-authoritative answer:
    Name:   vnet2dns.v5ant3az2hbe1edzthhvwwkcse.bx.internal.cloudapp.net
    Address: 10.2.0.4
    

    到目前为止,如果不指定 DNS 服务器 IP 地址,则无法查找另一网络中的 IP 地址。

配置虚拟网络以使用自定义 DNS 服务器

若要配置虚拟网络以使用自定义 DNS 服务器,而不是 Azure 递归解析程序,请使用以下步骤:

  1. Azure 门户中,选择“虚拟网络”,然后选择“DNS 服务器”

  2. 选择“自定义”,然后输入自定义 DNS 服务器的内部 IP 地址。 最后,选择“保存”

  3. 打开 vnet1 中的 DNS 服务器虚拟机,然后单击“重启”。 必须重启虚拟网络中的所有虚拟机才能使 DNS 配置生效。

  4. 重复这些步骤即可为 vnet2 配置自定义 DNS 服务器。

若要测试 DNS 配置,可以使用 SSH 连接到这两个 DNS 虚拟机,然后使用其主机名称 ping 另一虚拟网络的 DNS 服务器。 如果不起作用,请使用以下命令来检查 DNS 状态:

sudo service bind9 status

创建 Apache HBase 群集

使用以下配置在这两个虚拟网络的每一个中创建 Apache HBase 群集:

  • 资源组名称:使用的资源组名称与创建虚拟网络时所用的相同。
  • 群集类型:HBase
  • 版本:HBase 1.1.2 (HDI 3.6)
  • 位置:与虚拟网络使用同一位置。 默认情况下,vnet1 为“美国西部”,vnet2 为“美国东部”。
  • 存储:为群集创建新的存储帐户。
  • 虚拟网络(在门户的“高级”设置中):选择在上一过程中创建的 vnet1。
  • 子网:模板中所用的默认名称为 subnet1

若要确保正确配置环境,必须能够在两个群集之间 ping 头节点的 FQDN。

加载测试数据

复制群集时,必须指定要复制的表。 在本节中,要将一些数据载入源群集。 在下一部分,你将在两个群集之间启用复制。

若要创建一个“联系人”表并在其中插入一些数据,请遵照 Apache HBase 教程:开始在 HDInsight 中使用 Apache HBase 中的说明。

注意

如果要从自定义命名空间复制表,则需要确保也在目标群集上定义相应的自定义命名空间。

启用复制

以下步骤说明如何从 Azure 门户调用脚本操作脚本。 有关使用 Azure PowerShell 和 Azure 经典 CLI 运行脚本操作的信息,请参阅使用脚本操作自定义 HDInsight 群集

从 Azure 门户启用 HBase 复制

  1. 登录 Azure 门户

  2. 打开源 HBase 群集。

  3. 在群集菜单中,选择“脚本操作”。

  4. 在页面顶部,选择“提交新项”。

  5. 选择或输入以下信息:

    1. 名称:输入“启用复制”。
    2. Bash 脚本 URL:输入 https://raw.githubusercontent.com/Azure/hbase-utils/master/replication/hdi_enable_replication.sh
    3. :确保已选定此参数。 清除其他节点类型。
    4. 参数:以下示例参数将对所有现有表启用复制,并将源群集中的所有数据复制到目标群集:

    -m hn1 -s <source hbase cluster name> -d <destination hbase cluster name> -sp <source cluster Ambari password> -dp <destination cluster Ambari password> -copydata

    注意

    对源和目标群集 DNS 名称使用主机名而不是 FQDN。

    本演练假设 hn1 为活动头节点。 检查群集以确定活动的头节点。

  6. 选择“创建”。 该脚本可能会运行一段时间,尤其是在使用 -copydata 参数的情况下。

必需参数:

名称 说明
-s、--src-cluster 指定源 HBase 群集的 DNS 名称。 例如:-s hbsrccluster、--src-cluster=hbsrccluster
-d、--dst-cluster 指定目标(副本)HBase 群集的 DNS 名称。 例如:-s dsthbcluster、--src-cluster=dsthbcluster
-sp、--src-ambari-password 指定源 HBase 群集的 Ambari 管理员密码。
-dp、--dst-ambari-password 指定目标 HBase 群集的 Ambari 管理员密码。

可选参数:

名称 说明
-su、--src-ambari-user 指定源 HBase 群集的 Ambari 管理员用户名。 默认值为 admin
-du、--dst-ambari-user 指定目标 HBase 群集的 Ambari 管理员用户名。 默认值为 admin
-t、--table-list 指定要复制的表。 例如:--table-list="table1;table2;table3"。 如果不指定表,将复制所有现有的 HBase 表。
-m、--machine 指定要在其中运行脚本操作的头节点。 此值应当根据活动的头节点进行选择。 在 HDInsight 门户或 Azure PowerShell 中以脚本操作的形式运行 $0 脚本时,可使用此选项。
-cp、-copydata 在启用复制的情况下,允许迁移表中的现有数据。
-rpm、-replicate-phoenix-meta 针对 Phoenix 系统表启用复制。

请谨慎使用此选项。 建议在使用此脚本之前,在副本群集上重新创建 Phoenix 表。
-h、--help 显示用法信息。

脚本print_usage() 节中提供了详细的参数说明。

成功部署脚本操作后,可以使用 SSH 连接到目标 HBase 群集,并验证是否已复制数据。

复制方案

以下列表显示了一些普通用例及其参数设置:

  • 针对两个群集之间的所有表启用复制。 此方案不需要复制或迁移表中的现有数据,也不使用 Phoenix 表。 使用以下参数:

    -m hn1 -s <source hbase cluster name> -d <destination hbase cluster name> -sp <source cluster Ambari password> -dp <destination cluster Ambari password>

  • 针对特定的表启用复制。 若要针对 table1、table2 和 table3 启用复制,请使用以下参数:

    -m hn1 -s <source hbase cluster name> -d <destination hbase cluster name> -sp <source cluster Ambari password> -dp <destination cluster Ambari password> -t "table1;table2;table3"

  • 针对特定的表启用复制并复制现有数据。 若要针对 table1、table2 和 table3 启用复制,请使用以下参数:

    -m hn1 -s <source hbase cluster name> -d <destination hbase cluster name> -sp <source cluster Ambari password> -dp <destination cluster Ambari password> -t "table1;table2;table3" -copydata

  • 针对所有表启用复制,并将 Phoenix 元数据从源复制到目标。 Phoenix 元数据复制并不完善。 请谨慎使用。 使用以下参数:

    -m hn1 -s <source hbase cluster name> -d <destination hbase cluster name> -sp <source cluster Ambari password> -dp <destination cluster Ambari password> -t "table1;table2;table3" -replicate-phoenix-meta

设置 ESP 群集之间的复制

先决条件

  1. 两个 ESP 群集应位于同一领域(域)。 检查 /etc/krb5.conf 文件默认领域属性以确认。
  2. 常见用户应同时具有对两个群集的读取和写入访问权限
    1. 例如,如果两个群集具有相同的群集管理员用户(例如 admin@abc.example.com),该用户可用于运行复制脚本。
    2. 如果两个群集使用相同的用户组,则可以添加新用户或使用组中的现有用户。
    3. 如果两个群集使用不同的用户组,则可以将新用户添加到两个组或使用组中的现有用户。

执行复制脚本的步骤

注意

仅当 DNS 无法正确解析目标群集的主机名时,才执行以下步骤。

  1. 在源群集节点 /etc/hosts 文件中复制接收器群集主机 IP 和主机名映射。
  2. 从目标(接收器)群集的 /etc/hosts 文件中复制头节点、工作器节点、ZooKeeper 节点主机和 IP 映射。
  3. 添加复制的条目源群集 /etc/hosts 文件。 应将这些条目添加到头节点、工作器节点和 ZooKeeper 节点。

步骤 1:使用 ktutil 为用户创建密钥表文件。 $ ktutil

  1. addent -password -p admin@ABC.EXAMPLE.COM -k 1 -e RC4-HMAC
  2. 请求密码以进行身份验证,提供用户密码
  3. wkt /etc/security/keytabs/admin.keytab

注意

确保密钥表文件以 <username>.keytab 格式存储在 /etc/security/keytabs/ 文件夹中。

步骤 2:使用 -ku 选项运行脚本操作

  1. 在 ESP 群集上提供 -ku <username>
名称 说明
-ku, --krb-user 对于 ESP 群集,可对源群集和目标群集进行身份验证的通用 Kerberos 用户

复制并迁移数据

启用复制后,可以使用两个单独的脚本操作脚本来复制或迁移数据:

可以遵循启用复制中所述的相同过程来调用脚本操作。 使用以下参数:

-m hn1 -t <table1:start_timestamp:end_timestamp;table2:start_timestamp:end_timestamp;...> -p <replication_peer> [-everythingTillNow]

脚本print_usage() 节中提供了详细的参数说明。

方案

  • 复制特定表(test1、test2 和 test3)中到目前(当前时间戳)为止编辑的所有行

    -m hn1 -t "test1::;test2::;test3::" -p "<zookeepername1>;<zookeepername2>;<zookeepername3>:2181:/hbase-unsecure" -everythingTillNow

    或:

    -m hn1 -t "test1::;test2::;test3::" --replication-peer="<zookeepername1>;<zookeepername2>;<zookeepername3>:2181:/hbase-unsecure" -everythingTillNow

  • 复制指定时间范围内的特定表

    -m hn1 -t "table1:0:452256397;table2:14141444:452256397" -p "<zookeepername1>;<zookeepername2>;<zookeepername3>:2181:/hbase-unsecure"

禁用复制

若要禁用复制,可以使用 GitHub 中的另一个脚本操作脚本。 可以遵循启用复制中所述的相同过程来调用脚本操作。 使用以下参数:

-m hn1 -s <source hbase cluster name> -sp <source cluster Ambari password> <-all|-t "table1;table2;...">

脚本print_usage() 节中提供了详细的参数说明。

方案

  • 对所有表禁用复制

    -m hn1 -s <source hbase cluster name> -sp Mypassword\!789 -all

    --src-cluster=<source hbase cluster name> --dst-cluster=<destination hbase cluster name> --src-ambari-user=<source cluster Ambari user name> --src-ambari-password=<source cluster Ambari password>

  • 对指定的表(table1、table2 和 table3)禁用复制

    -m hn1 -s <source hbase cluster name> -sp <source cluster Ambari password> -t "table1;table2;table3"

注意

如果要删除目标群集,请确保将其从源群集的对等列表中删除。 可以通过在源群集上的 hbase shell 中运行命令 remove_peer '1' 来完成此操作。 如果不这样做,源群集可能无法正常运行。

后续步骤

本文介绍了如何设置一个虚拟网络内部或者两个虚拟网络之间的 Apache HBase 复制。 若要了解有关 HDInsight 和 Apache HBase 的详细信息,请参阅以下文章: