設定 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 Resource Manager 範本。 如果您偏好使用其他方法設定環境,請參閱:

在兩個不同區域中設定兩個虛擬網路

若要使用會兩不同區域建立兩個虛擬網路,並在 VNet 之間建立 VPN 連線的範本,請選取下列 [部署至 Azure] 按鈕。

部署至新叢集的 [Azure] 按鈕

範本中的一些硬式編碼值:

VNet 1

屬性
Location 美國西部
VNet 名稱 <ClusterNamePrevix>-vnet1
位址空間首碼 10.1.0.0/16
子網路名稱 subnet 1
子網路首碼 10.1.0.0/24
子網路 (閘道) 名稱 GatewaySubnet (無法變更)
子網路 (閘道) 首碼 10.1.255.0/27
閘道名稱 vnet1gw
閘道類型 Vpn
閘道 VPN 類型 RouteBased
閘道 SKU 基本
閘道 IP vnet1gwip

VNet 2

屬性
Location 美國東部
VNet 名稱 <ClusterNamePrevix>-vnet2
位址空間首碼 10.2.0.0/16
子網路名稱 subnet 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. 依序選取 [資源群組]> > [資源群組名稱]> > [vnet1DNS] 來開啟 DNS 虛擬機器。 資源群組名稱是您在上一個程序中所建立的名稱。 預設 DNS 虛擬機器名稱是 vnet1DNS 和 vnet2NDS
  3. 選取 [屬性] 以開啟虛擬網路的屬性頁面。
  4. 記下 [公用 IP 位址],並另外確認 [私人 IP 位址]。 私人 IP 位址應該是 10.1.0.4 (如果是 vnet1DNS) 和 10.2.0.4 (如果是 vnet2DNS)。
  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+XYEnter 鍵。

  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+XYEnter 鍵。

  6. 若要啟動 Bind,請使用下列命令:

    sudo service bind9 restart
    
  7. 若要確認該 Bind 可以解析另一個虛擬網路中的資源名稱,請使用下列命令:

    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 虛擬機器,然後使用另一個虛擬網路的 DNS 伺服器主機名稱對該 DNS 伺服器執行 ping。 如果沒有作用,請使用下列命令來檢查 DNS 狀態:

sudo service bind9 status

建立 Apache HBase 叢集

使用下列組態在兩個虛擬網路中各建立一個 Apache HBase 叢集:

  • 資源群組名稱︰使用和您在虛擬網路中所建立的名稱相同的資源群組名稱。
  • 叢集類型:HBase
  • 版本:HBase 1.1.2 (HDI 3.6)
  • 位置:使用與虛擬網路相同的位置。 根據預設,vnet1 是「美國西部」,vnet2 是「美國東部」
  • 儲存體︰為叢集建立新的儲存體帳戶。
  • 虛擬網路 (從入口網站上的 [進階] 設定):選取您在上一個程序中所建立的 vnet1。
  • 子網路:範本中所使用的預設名稱為 subnet1

若要確定環境的設定是否正確,您必須能夠對兩個叢集之間的前端節點 FQDN 執行 ping。

載入測試資料

當您複寫叢集時,您必須指定要複寫的資料表。 在本節中,您會把部分資料載入到來源叢集中。 在下一節中,您會啟用兩個叢集之間的複寫。

若要建立一個連絡人資料表,並在此資料表中插入一些資料,請依照 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 為使用者建立 keytab 檔案。 $ ktutil

  1. addent -password -p admin@ABC.EXAMPLE.COM -k 1 -e RC4-HMAC
  2. 要求密碼以進行驗證,提供使用者密碼
  3. wkt /etc/security/keytabs/admin.keytab

注意

請確定 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 殼層上執行命令 remove_peer '1',即可完成此作業。 無法讓此來源叢集成功操作可能導致無法正常運作。

下一步

在本文中,您已了解如何在虛擬網路內或兩個虛擬網路之間設定 Apache HBase 複寫。 若要深入了解 HDInsight 與 Apache HBase,請參閱下列文章: