設定 Azure 虛擬網路中的 Apache HBase 叢集複寫
了解如何在虛擬網路內或 Azure 中的兩個虛擬網路之間設定 Apache HBase 複寫。
叢集複寫會使用來源推入方法。 HBase 叢集可以是來源、目的地,或可同時滿足兩個角色。 複寫不是同步進行。 複寫的目標最終會一致。 如果來源在複寫啟用時接收到資料行系列的編輯,該編輯會傳播到所有目的地叢集。 當資料從一個叢集複寫到另一個叢集時,會追蹤來源叢集和已取用資料的所有叢集,以防止複寫迴圈。
在本文中,您會設定來源與目的地之間的複寫。 若需其他叢集拓撲,請參閱 Apache HBase 參考指南。
以下是適用於單一虛擬網路的 HBase 複寫使用案例︰
- 負載平衡。 例如,您可以在目的地叢集上執行掃描或 MapReduce 工作,以及在來源叢集上內嵌資料。
- 新增高可用性。
- 在 HBase 叢集之間移轉資料。
- 將 Azure HDInsight 叢集從一個版本升級到另一個版本。
以下是適用於兩個虛擬網路的 HBase 複寫使用案例︰
- 設定災害復原。
- 負載平衡與分割應用程式。
- 新增高可用性。
必要條件
開始閱讀本文之前,您必須擁有 Azure 訂用帳戶。 請參閱取得 Azure 免費試用。
設定環境
您有三個組態選項:
- 有兩個 Apache HBase 叢集位於單一 Azure 虛擬網路中。
- 有兩個 Apache HBase 叢集位於相同區域但不同的兩個虛擬網路中。
- 有兩個 Apache HBase 叢集位於不同區域且不同的兩個虛擬網路中 (異地複寫)。
本文涵蓋異地複寫案例。
為了協助您設定環境,我們建立了一些 Azure Resource Manager 範本。 如果您偏好使用其他方法設定環境,請參閱:
在兩個不同區域中設定兩個虛擬網路
若要使用會兩不同區域建立兩個虛擬網路,並在 VNet 之間建立 VPN 連線的範本,請選取下列 [部署至 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
- 在不同區域中建立兩個 VNet (虛擬網路)
- 在兩個 VNET 中啟用對等互連。 前往在上述步驟中建立的虛擬網路,然後按一下 [對等互連],然後新增另一個區域的對等互連連結。 對這兩個虛擬網路執行此動作。
- 在每個 VNET 中建立最新版本的 UBUNTU。
設定 DNS
在最後一節,範本會在兩個虛擬網路中各建立一個 Ubuntu 虛擬機器。 而在這一節,您會在兩個 DNS 虛擬機器上安裝 Bind,然後在兩個虛擬機器上設定 DNS 轉送。
為了安裝 Bind,您需要尋找兩個 DNS 虛擬機器的公用 IP 位址。
- 開啟 Azure 入口網站。
- 依序選取 [資源群組]> > [資源群組名稱]> > [vnet1DNS] 來開啟 DNS 虛擬機器。 資源群組名稱是您在上一個程序中所建立的名稱。 預設 DNS 虛擬機器名稱是 vnet1DNS 和 vnet2NDS。
- 選取 [屬性] 以開啟虛擬網路的屬性頁面。
- 記下 [公用 IP 位址],並另外確認 [私人 IP 位址]。 私人 IP 位址應該是 10.1.0.4 (如果是 vnet1DNS) 和 10.2.0.4 (如果是 vnet2DNS)。
- 變更兩個虛擬網路的 DNS 伺服器,使用預設 (Azure 提供) 的 DNS 伺服器,以允許對內及對外存取,在下列步驟中下載套件來安裝 Bind。
若要安裝 Bind,請使用下列程序:
使用 SSH 連線至 DNS 虛擬機器的公用 IP 位址。 下列範例會連線到 40.68.254.142 的虛擬機器:
ssh sshuser@40.68.254.142
將
sshuser
取代為建立 DNS 虛擬機器時所指定的 SSH 使用者帳戶。注意
有多種方式可取得
ssh
公用程式。 在 Linux、Unix 及 macOS 上,它會提供作為作業系統的一部分。 如果您是使用 Windows,請考慮下列選項的其中之一:若要安裝 Bind,使用下列 SSH 工作階段中的命令:
sudo apt-get update -y sudo apt-get install bind9 -y
將 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 鍵。
在 SSH 工作階段中,使用下列命令:
hostname -f
此命令會傳回類似下列文字的值:
vnet1DNS.icb0d0thtw0ebifqt0g1jycdxd.ex.internal.cloudapp.net
icb0d0thtw0ebifqt0g1jycdxd.ex.internal.cloudapp.net
文字是此虛擬網路的 DNS 尾碼。 儲存這個值以便稍後使用。您也必須從另一個 DNS 伺服器找出 DNS 尾碼。 您在下一步需要用到它。
若要將 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 鍵。
若要啟動 Bind,請使用下列命令:
sudo service bind9 restart
若要確認該 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 遞迴解析程式,請使用下列步驟:
在 Azure 入口網站中,選取虛擬網路,然後選取 [DNS 伺服器]。
選取 [自訂],並輸入自訂 DNS 伺服器的內部 IP 位址。 最後,選取 [儲存]。
在 vnet1 中開啟 DNS 伺服器虛擬機器,然後按一下 [重新啟動]。 您必須重新啟動虛擬網路中的所有虛擬機器,才能讓 DNS 組態生效。
重複步驟,為 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 複寫
登入 Azure 入口網站。
開啟來源 HBase 叢集。
從 [叢集] 功能表中,選擇 [指令碼動作]。
在頁面的頂端,選取 [提交新項目] 。
選取或輸入下列資訊︰
- 名稱:輸入「啟用複寫」。
- Bash 指令碼 URL:輸入 https://raw.githubusercontent.com/Azure/hbase-utils/master/replication/hdi_enable_replication.sh。
- 前端:務必選取此參數。 清除其他節點類型。
- 參數:下列範例參數會針對所有現有的資料表啟用複寫,然後將來源叢集的所有資料複製到目的地叢集:
-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 為作用中的前端節點。 請檢查您的叢集,以找出作用中的前端節點。
選取 建立。 指令碼執行需要花費一些時間,特別是在使用 -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 叢集之間的複寫
先決條件
- 這兩個 ESP 叢集都應該位於相同的領域 (網域)。 請檢查
/etc/krb5.conf
檔案預設領域屬性以確認。 - 一般使用者應該同時具有這兩個叢集的讀取和寫入存取權
- 例如,如果這兩個叢集都有相同的叢集管理使用者 (例如,
admin@abc.example.com
),該使用者就可以用來執行複寫指令碼。 - 如果這兩個叢集都使用相同的使用者群組,您可以新增使用者或使用群組中的現有使用者。
- 如果這兩個叢集使用不同的使用者群組,您可以將使用者新增至這兩個群組,或使用群組中的現有使用者。
- 例如,如果這兩個叢集都有相同的叢集管理使用者 (例如,
執行複寫指令碼的步驟
注意
只有在 DNS 無法正確解析目的地叢集的主機名稱時,才執行下列步驟。
- 複製來源叢集節點 /etc/hosts 檔案中的接收叢集主機 IP 和主機名稱對應。
- 從目的地 (接收) 叢集的 /etc/hosts 檔案複製前端節點、背景工作角色節點和 ZooKeeper 節點主機和 IP 對應。
- 新增複製的項目來源叢集 /etc/hosts 檔案。 這些項目應該新增至前端節點、背景工作角色節點和 ZooKeeper 節點。
步驟 1: 使用 ktutil
為使用者建立 keytab 檔案。
$ ktutil
addent -password -p admin@ABC.EXAMPLE.COM -k 1 -e RC4-HMAC
- 要求密碼以進行驗證,提供使用者密碼
wkt /etc/security/keytabs/admin.keytab
注意
請確定 keytab 檔案儲存在 <username>.keytab
格式的 /etc/security/keytabs/
資料夾中。
步驟 2: 使用 -ku
選項執行指令碼動作
- 在 ESP 叢集上提供
-ku <username>
。
名稱 | 描述 |
---|---|
-ku, --krb-user |
針對 ESP 叢集,可同時驗證來源與目的地叢集的通用 Kerberos 使用者 |
複製並移轉資料
啟用複寫後,有兩個可用來複製或移轉資料的個別指令碼動作指令碼:
適用於小型資料表的指令碼 (表格約數 GB 大小,且整體複製預估會在一小時內完成)
適用於大型資料表的指令碼 (預估複製時間會超過一小時的表格)
您可以依照啟用複寫中描述的相同程序,來呼叫指令碼動作。 使用下列參數:
-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,請參閱下列文章: