このソリューションは、HBase スナップショットと HBase レプリケーションの技術を組み合わせて、ソース HBase クラスタがサービス中のまま既存データと増分データの両方をオンラインで移行し、移行プロセス中のデータ損失を防ぎます。
ソリューション概要
スナップショットベースのアプローチは HBase からのオフライン移行のみをサポートし、ソースクラスタをオンラインに保つことはできません。移行中もソースクラスタは引き続き実行されるため、以下のエラーが発生する可能性があります。
増分データの損失: スナップショットのエクスポートとリストア中に、ソースクラスタで生成された書き込みまたは更新操作がターゲットクラスタに同期されない可能性があります。
データ整合性の問題: スナップショットのみに依存すると、移行中のリアルタイムの増分データを処理できません。
以下のソリューションでこれらの問題を解決できます。
レプリケーション関係 (ピア) を確立する:
HBase レプリケーションを使用して、ソースクラスタとターゲットクラスタの間にテーブルレベルのレプリケーション関係を確立します。レプリケーション中は自動同期を無効にします。
ソースクラスタはテーブルのリアルタイムの書き込みおよび更新操作を記録しますが、ターゲットクラスタにはすぐに同期しません。
既存データを移行する:
HBase スナップショットを使用して、ソースクラスタから既存データをエクスポートします。
ソースクラスタとターゲットクラスタのストレージシステム (HDFS や OSS-HDFS など) が相互接続されている場合は、スナップショットをターゲットクラスタにエクスポートします。そうでない場合は、最初にソースクラスタの中間パスにエクスポートしてから、ターゲットクラスタに同期します。
増分データを同期する: 既存データのリストアが完了したら、レプリケーションピアの自動同期機能を有効にします。移行中に生成された増分データが再生され、ソースとターゲット間のデータ整合性が確保されます。
これらの手順により、このソリューションはソースクラスタの継続的な運用を確保しながら、既存データと増分データの両方を完全に移行し、データ損失を回避します。
注意事項
HBase バージョンの互換性:
HBase 1.x バージョン:
hbase.replication=trueを設定し、プライマリクラスタとバックアップクラスタを再起動して、レプリケーション機能を有効にします。HBase 2.x バージョン:
hbase.replicationパラメータはデフォルトで削除されています。追加の設定は必要ありません。
レプリケーション構成: HBase はカラムファミリーに基づいてレプリケーションを構成します。特定のカラムファミリーのデータを移行する必要がある場合は、レプリケーションプロパティが正しく構成されていることを確認してください。
ネットワーク接続:
CEN、専用回線、または VPN を介して、ソース HBase クラスタとターゲット HBase クラスタ間のネットワーク接続を確保します。
事前にソースクラスタとターゲットクラスタ間のネットワーク接続を確立し、以下のポートがソースクラスタに対して開かれていることを確認します。
Zookeeper サービスポート: Zookeeper のターゲットクラスタの ECS インスタンスのポート
2181です。HBase サービスポート: EMR HBase のターゲットクラスタがある ECS インスタンスのポート
16010、16020、および16030です。
手順
ステップ 1: ピア (レプリケーション関係) を作成する
ソースクラスタとターゲットクラスタの間にテーブルレベルのレプリケーション関係を確立し、既存のスナップショットデータの同期が完了するまで自動同期を一時的に無効にします。
ソースクラスタのマスターノードにログオンします。詳細については、「クラスタにログオンする」をご参照ください。
次のコマンドを実行して、HBase シェルに入ります。
hbase shellピア (レプリケーション関係) を追加します。
HBase シェルで次のコマンドを実行して、ターゲットクラスタにピアを追加します。移行するテーブルを指定します。
add_peer '${peer_name}', CLUSTER_KEY => "${slave_zk}:${port}:/hbase", TABLE_CFS => { "${table_name}" => [] }パラメータ:
${peer_name}: レプリケーション関係の名前。カスタマイズできます。この例では、peer1です。${slave_zk}: ターゲットクラスタ ZooKeeper のアドレス。これは通常、複数の ZooKeeper ノードの内部 IP アドレスまたはホスト名です。その形式は{slave_zk1}:2181,{slave_zk2}:2181,{slave_zk3}:2181です。${port}: ターゲットクラスタ ZooKeeper のポート。デフォルトポートは 2181 です。${table_name}: 移行するテーブルの名前。この例では、t1です。
テーブルレベルのレプリケーションを有効にします。
テーブルレベルのレプリケーションを有効にして、指定されたテーブルが書き込まれたデータをターゲットクラスタに同期できるようにします。
enable_table_replication 't1'自動同期を一時的に無効にします。
このコマンドは、指定されたピアのデータレプリケーションプロセスを一時停止するために使用されます。無効にすると、ソースクラスタは新しいデータ更新をターゲットクラスタに送信しなくなります。既存のデータは削除または影響を受けません。
disable_peer 'peer1'
ステップ 2: スナップショットを作成する
ソースクラスタの HBase シェルで次のコマンドを実行して、スナップショットを作成します。移行するテーブルの既存データがエクスポートされます。
snapshot '${table_name}', '${snapshot_name}'パラメータ:
${table_name}: 移行するテーブルの名前。この例ではt1です。${snapshot_name}: カスタムスナップショット名。この例ではt1-snapshotです。
例:
snapshot 't1', 't1-snapshot'
ステップ 3: スナップショットをターゲットクラスタにエクスポートする
シナリオ 1: ソースクラスタとターゲットクラスタのストレージシステムが相互接続されている
ソースクラスタとターゲットクラスタのストレージシステムが相互接続されている場合は、ソースクラスタで次のコマンドを実行します。スナップショットはターゲットクラスタに直接エクスポートされます。
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot ${snapshot_name} -copy-to ${target_rootdir_path}パラメータ:
${snapshot_name}: カスタムスナップショット名。この例ではt1-snapshotです。${target_rootdir_path}: ターゲットクラスタ HBase のルートディレクトリパス。実際の状況に応じて置き換えてください。OSS-HDFS: コンソールからターゲットクラスタの [HBase] サービスを確認し、[hbase-site.xml] ファイルの [hbase.rootdir] 設定項目を表示して、詳細なパス情報を取得できます。

HDFS: コンソールからターゲットクラスタの [Hadoop-Common] サービスを確認し、[core-site.xml] の [fs.defaultFS] 設定項目を表示して、詳細なパス情報を取得できます。
例:
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot t1-snapshot -copy-to oss://xxx.cn-hangzhou.oss-dls.aliyuncs.com/hbase/c-9d34bc8fxxx
シナリオ 2: ソースクラスタとターゲットクラスタのストレージシステムが相互接続されていない
ソースクラスタがターゲットクラスタのストレージパスに直接アクセスできない場合は、最初にスナップショットをソースクラスタの中間パス (HDFS や OSS など) にエクスポートする必要があります。次に、ターゲットクラスタに同期します。この例では、HDFS から OSS-HDFS にデータを移行する方法を示します。
スナップショットを中間パスにエクスポートします。
ソース HBase クラスタで次のコマンドを実行して、スナップショットをソースクラスタの中間パスにエクスポートします。
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot ${snapshot_name} -copy-to ${src_temp_path}/${table_name}パラメータ:
${snapshot_name}: カスタムスナップショット名。この例ではt1-snapshotです。${src_temp_path}: ソースクラスタの中間パス。たとえば、ソースクラスタが HDFS を使用している場合は、HDFS パスを中間パスとして選択できます。${table_name}: 移行するテーブルの名前。この例ではt1です。
例:
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot t1-snapshot -copy-to hdfs:///tmp/hbase-snapshot/t1
データをターゲットパスに移行します。
次のコマンドを実行して、JindoDistCp ツールを使用して、ソースクラスタの中間パスからターゲットクラスタのパスにデータを移行します。JindoDistCp の詳細については、「JindoDistCp ユーザーガイド」をご参照ください。
E-MapReduce (EMR) コンソールにログオンし、OSS または OSS-HDFS にアクセスするために使用する AccessKey ペアを指定します。
使用時に何度も入力する必要がないように、[Hadoop-Common] サービスの [core-site.xml] タブに次の設定項目を追加します。設定項目の追加に関する具体的な操作については、「設定項目を管理する」をご参照ください。
パラメータ
説明
fs.oss.accessKeyId
OSS/OSS-HDFS の AccessKey ID。
fs.oss.accessKeySecret
OSS/OSS-HDFS の AccessKey Secret。
ソース HBase クラスタで、
jindo-distcp-tool-*.jarがあるディレクトリに移動します。cd /opt/apps/JINDOSDK/jindosdk-current/tools説明EMR クラスタ: EMR-5.6.0 以降のバージョン、EMR-3.40.0 以降のバージョンには JindoDistCp がデプロイされており、
/opt/apps/JINDOSDK/jindosdk-current/toolsディレクトリにjindo-distcp-tool-*.jarとしてあります。EMR 以外のクラスタ: JindoSDK (JindoDistCp ツールを含む) を自分でダウンロードできます。詳細については、「JindoSDK をダウンロード、インストール、およびアップグレードする」をご参照ください。
次のコマンドを実行して、スナップショットをターゲット HBase クラスタに移行します。
hadoop jar jindo-distcp-tool-*.jar --src ${src_temp_path}/${table_name} --dest ${target_temp_path}/${table_name} --disableChecksum --parallelism 10パラメータ:
${src_temp_path}: ソースクラスタの中間パス。${target_temp_path}: ターゲットクラスタの中間パス。${target_bucket}: ターゲットバケット名。
例:
hadoop jar jindo-distcp-tool-4.6.11.jar --src hdfs:///tmp/hbase-snapshot/t1 --dest oss://hbase-test.cn-hangzhou.oss-dls.aliyuncs.com/hbase/recv/t1 --disableChecksum --parallelism 10
スナップショットをターゲット HBase クラスタにインポートします。
ターゲット HBase クラスタで次のコマンドを実行して、ターゲットパスから HBase ルートディレクトリにスナップショットをインポートします。
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot ${snapshot_name} -copy-from ${target_temp_path} -copy-to ${target_rootdir_path}パラメータ:
${target_temp_path}: ターゲットクラスタの一時パス。${target_rootdir_path}: ターゲット HBase クラスタのルートディレクトリパス。コンソールからターゲットクラスタの [HBase] サービスを確認し、[hbase-site.xml] ファイルの [hbase.rootdir] 設定項目を表示して、詳細なパス情報を取得できます。
例:
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot t1-snapshot -copy-from oss://hbase-test.cn-hangzhou.oss-dls.aliyuncs.com/hbase/recv/t1 -copy-to oss://hbase-target.cn-hangzhou.oss-dls.aliyuncs.com/hbase/c-5418ce2a4xxx
移行結果を確認します。
移行後、次のコマンドを使用して、ターゲットパスのデータが完全かどうかを確認できます。
hdfs dfs -ls ${target_rootdir_path}
ステップ 4: スナップショットを使用して既存データをリストアする
ターゲットクラスタのマスターノードにログオンします。詳細については、「クラスタにログオンする」をご参照ください。
次のコマンドを実行して HBase シェルに入ります。
hbase shell次のコマンドを実行して、スナップショットをリストアし、ターゲットクラスタでテーブルを有効にします。
restore_snapshot '${snapshot_name}' enable '${table_name}'パラメータ:
${snapshot_name}: カスタムスナップショット名。${table_name}: 移行するテーブルの名前。
例:
restore_snapshot 't1-snapshot' enable 't1'
ステップ 5: 増分データ同期を有効にする
ソースクラスタの HBase シェルで次のコマンドを実行して、ピア同期を有効にします。
enable_peer '${peer_name}'例:
enable_peer 'peer1'ステップ 6: データを確認する
移行後にデータが完全かどうかを確認します。
小規模データ量: 確認には Scan を使用します。
scan '${table_name}'例:
scan 't1'中規模データ量: 確認には count を使用します。
count '${table_name}'大規模データ量: サンプル確認には get を使用します。
get '${table_name}', '${rowkey}'コード内の
${rowkey}は、HBase テーブルの各行の一意の識別子です。
ステップ 7: スナップショットを削除する
確認後、次のコマンドを実行して、ターゲットテーブルに関連するすべてのスナップショットを削除し、ストレージ容量を解放します。
delete_table_snapshots '${table_name}'例:
delete_table_snapshots 't1'ステップ 8: ピアをクリーンアップする
増分データ同期が完了したら、すべての読み取りおよび書き込みリクエストがターゲット HBase クラスタに切り替えられるように、アプリケーションに対してデュアルライトまたはカットオーバー操作を実行する必要があります。データの重複同期を避けるため、切り替え後にソースクラスタとターゲットクラスタ間のレプリケーション関係 (ピア) を削除する必要があります。
クライアントを移行します。
HBase クラスタに関連するアップストリームおよびダウンストリームアプリケーション (API またはコマンドラインを介して HBase を読み書きするアプリケーションを含む) をターゲット HBase クラスタに切り替えます。これを行うには、次の操作を実行します。
接続構成を更新する: アプリケーションの設定ファイルまたはコードを変更して、HBase 接続情報 (Zookeeper アドレス、ポートなど) をソースクラスタからターゲットクラスタに切り替えます。
機能を確認する: アプリケーションがターゲットクラスタに正常に読み書きできることを確認します。必要な機能テストとデータ検証を実行します。
デュアルランまたはカットオーバー: ビジネス要件に基づいて、デュアルラン (ソースクラスタとターゲットクラスタの両方に同時に読み書き) するか、ターゲットクラスタに直接カットオーバーするかを選択します。
ピアの自動同期機能を無効にします。
ソースクラスタの HBase シェルで、指定されたピアの自動同期機能を無効にします。データ同期がすぐに停止することを確認します。
disable_peer '${peer_name}'例:
disable_peer 'peer1'ピアを削除します。
ピアを無効にした後、ピアを削除して、ソースクラスタとターゲットクラスタ間のレプリケーション関係を完全に切断します。
remove_peer '${peer_name}'例:
remove_peer 'peer1'ピアが正常に削除されたかどうかを確認します。
次のコマンドを実行して、現在のすべてのピアをリストし、この例の
peer1が削除されていることを確認します。list_peers