Alibaba Cloud Network Load Balancer (NLB) は、DataWorks の SSH ノードにインテリジェントな負荷分散を提供し、単一障害点を防ぎ、タスク構成を簡素化します。このトピックでは、DataWorks でこのソリューションをデプロイして使用し、SSH タスクを安定して実行する方法について説明します。
背景情報
DataWorks では、SSH データソースは通常、固定の Elastic Compute Service (ECS) インスタンスのホストアドレスで構成されます。そのホストが異常な状態 (クラッシュやリソース不足など) になると、SSH ノードの実行に失敗する可能性があります。この問題に対処するため、Network Load Balancer (NLB) インスタンスのサーバーグループに複数の ECS インスタンスを追加できます。NLB は内部アルゴリズムを使用して、タスクリクエストを利用可能な ECS インスタンスに分散し、継続的にヘルスチェックを実行します。ECS インスタンスに障害が発生した場合、NLB は自動的にリクエストを他の正常なインスタンスにルーティングします。これにより、単一インスタンスの障害によるタスクの中断を防ぎ、高可用性を確保します。
上の図に示すように:
-
負荷分散なし:DataWorks の SSH ノードタスクは、接続されている ECS インスタンスでのみ実行できます。そのインスタンスが過負荷になったり障害が発生したりすると、タスクは遅延または中断されます。
-
負荷分散あり:DataWorks の SSH ノードタスクは、NLB ポリシーに基づいてサーバーグループ内の ECS インスタンスに自動的にルーティングされます。NLB はサーバーグループのヘルスチェックも実行します。異常な ECS インスタンスを検出すると、タスクを他の正常なインスタンスに自動的にルーティングし、継続性と高可用性を確保します。
このソリューションは、リソースの枯渇と単一障害点を防ぎ、タスク実行の効率と信頼性を向上させます。
前提条件
-
使用する RAM ユーザーがワークスペースに追加されていること。
RAM ユーザーを使用してタスクを開発する場合、その RAM ユーザーをメンバーとしてワークスペースに追加し、[開発] または [ワークスペース管理者] ロールを割り当てる必要があります。[ワークスペース管理者] ロールには必要以上の権限が含まれているため、割り当てる際には注意が必要です。メンバーの追加とロールの割り当て方法の詳細については、「ワークスペースへのメンバーの追加」をご参照ください。
-
サーバーレスリソースグループがワークスペースに関連付けられていること。詳細については、「サーバーレスリソースグループの使用」ディレクトリのトピックをご参照ください。
制限事項
-
SSH ノード内のコードは
128 KBを超えることはできません。 -
DataWorks リソースグループ、ECS インスタンス、および NLB インスタンスは、同じ VPC とリージョンに存在する必要があります。
環境の準備
SSH ノードの負荷分散と高可用性を有効にするには、少なくとも 2 つの ECS インスタンスを作成し、それぞれに検証用の一意のサンプルデータを追加します。
ECS インスタンスの作成
以下の手順に従って、必要な ECS インスタンスを作成します。
-
ECS インスタンスを購入します。
ECS インスタンスの購入ページに移動し、[カスタム起動] タブを選択し、以下のパラメーターを設定して ECS インスタンスを作成します。その他のパラメーターの詳細については、「[カスタム起動] タブでのインスタンスの作成」をご参照ください。
パラメーター
説明
リージョン
ご利用の DataWorks ワークスペースが存在するリージョンを選択します。
[ネットワークとゾーン]
サーバーレスリソースグループに使用されているのと同じ Virtual Private Cloud (VPC) と vSwitch を選択します。
Security Group
サーバーレスリソースグループの vSwitch にバインドされているセキュリティグループを選択します。
その他のパラメーター
ビジネス要件に基づいて他のパラメーターを設定します。
-
数量を設定します。
ECS インスタンス購入ページの右側で [数量] オプションを見つけ、必要な ECS インスタンスの数を入力します。このチュートリアルでは 2 つのインスタンスを使用します。
-
[注文の作成] をクリックして、ECS インスタンスの作成と購入を完了します。
サンプルデータの準備
作成した 2 つの ECS インスタンスに、後で結果を区別できるように、それぞれ一意のサンプルデータを書き込みます。
-
ECS インスタンスにログインします。
-
ECS コンソールに移動し、ECS インスタンスが存在するリージョンに切り替えて、作成した 2 つのインスタンスを見つけます。
-
インスタンスの Operation 列で、[リモート接続] をクリックします。[リモート接続] ダイアログボックスで、[今すぐサインイン] を選択します。
-
[インスタンスへのログイン] ページで、認証情報を設定し、ログインを完了します。
-
-
サンプルデータを作成します。
-
ECS インスタンス 1 で、次のコマンドを実行します:
echo "I am the first server" > /tmp/a.txt -
ECS インスタンス 2 で、次のコマンドを実行します:
echo "I am the second server" > /tmp/a.txt
-
NLB インスタンスの設定
以下の手順に従って NLB インスタンスを作成し、2 つの ECS インスタンスを追加してバックエンドサーバーグループを設定し、リスナーをセットアップして負荷分散を有効にします。
NLB インスタンスの作成
以下の手順で NLB インスタンスを作成できます。詳細については、「NLB インスタンス作成の前提条件」および「NLB インスタンスの作成と管理」をご参照ください。
-
NLB インスタンスの購入ページに移動します。
Network Load Balancer コンソールにログインします。トップナビゲーションバーでリージョンを選択します。[インスタンス] ページで [NLB の作成] をクリックして、[クラウドサービス購入ページ] に移動します。
重要DataWorks ワークスペースと同じリージョンを選択してください。リージョンの選択を誤ると、新しいインスタンスを作成する必要があります。
-
NLB インスタンスを設定して購入します。
[クラウドサービス購入ページ] で、以下のパラメーターを設定して NLB インスタンスを作成します:
パラメーター
説明
ネットワーク
ネットワークタイプ
[内部向け] を選択します。
VPC
サーバーレスリソースグループで使用されている VPC を選択します。
ゾーン
サーバーレスリソースグループの vSwitch が存在するゾーンを選択します。
IP バージョン
[IPv4] を選択します。
管理設定
インスタンス名
カスタムのインスタンス名を入力します。
リソースグループ
デフォルトのリソースグループを選択します。
-
購入を確定します。
すべてのパラメーターを設定した後、すぐに作成 をクリックします。[注文の確認] ページで、有効化 をクリックします。
バックエンドサーバーグループの作成
NLB インスタンスが [アクティブ] 状態になった後、以下の手順に従ってバックエンドサーバーグループを作成し、NLB インスタンスにバインドします。詳細については、「NLB サーバーグループ」をご参照ください。
-
インスタンス詳細ページに移動します。
-
Network Load Balancer コンソールにログインします。トップナビゲーションバーでリージョンを選択します。インスタンスリストで、作成したインスタンスを見つけます。
-
インスタンス名をクリックして、インスタンス詳細ページに移動します。
-
-
バックエンドサーバーグループを作成します。
-
インスタンス詳細ページの上部で、[サーバーグループの作成] をクリックして [サーバーグループの作成] ページに移動します。
-
[サーバーグループ名] を
ECS_NLBに設定し、Create をクリックします。
-
-
バックエンドサーバーを追加します。
-
[サーバーグループが正常に作成されました] ダイアログボックスで、[バックエンドサーバーの追加] をクリックします。
-
[バックエンドサーバー] タブで、[バックエンドサーバーの追加] をクリックして [バックエンドサーバーの追加] ページに移動します。
-
作成した 2 つの ECS インスタンスを選択します。
-
Next step をクリックして、[ポート/重み] ステップに移動します。
-
-
ポートと重みを設定します。
-
ポート を
22に設定します。 -
OK をクリックして設定を完了します。
-
バックエンドサーバーが正常に追加されるまで待ちます。
リスナーの設定
ECS インスタンスをバックエンドサーバーグループに追加した後、次のように NLB インスタンスのリスナーを設定します。詳細については、「TCP リスナーの追加」をご参照ください。
-
インスタンス詳細ページに移動します。
-
Network Load Balancer コンソールにログインします。トップナビゲーションバーでリージョンを選択します。インスタンスリストで、作成したインスタンスを見つけます。
-
インスタンス名をクリックして、インスタンス詳細ページに移動します。
-
-
リスナーを設定します。
-
インスタンス詳細ページの上部で、[リスナーの作成] をクリックして [Server Load Balancer の設定] ウィザードを開きます。
-
リスナープロトコルを [TCP] に、リスナーポートを
22に設定します。 -
Next step をクリックします。
-
-
サーバーグループを選択します。
-
[サーバーグループの選択] ステップで、[サーバータイプ] に、「バックエンドサーバーグループの作成」で作成したサーバーグループ
ECS_NLBを選択します。 -
Next step をクリックします。
-
-
レビューのために送信します。
[設定のレビュー] ステップで、ECS インスタンスとリスナーポートを確認し、Submit をクリックします。
SSH データソースの設定
上記の設定が完了したら、NLB インスタンスを SSH データソースとして追加します。詳細については、「SSH データソース」をご参照ください。
DataWorks コンソールにログインします。対象のリージョンで、左側のナビゲーションウィンドウの をクリックします。ドロップダウンリストからワークスペースを選択し、入力 管理センター をクリックします。
-
左側のナビゲーションウィンドウで、 をクリックして Data Sources ページに移動します。
-
[データソース] ページで、Add Connection をクリックして Add Connection ページに移動します。
-
Add Connection ページで、データソースタイプとして SSH を選択して [SSH データソースの追加] ページに移動します。このページで次のようにパラメーターを設定できます。
パラメーター
説明
データソース名
データソースのカスタム名を入力します。例:
SSH_DB。構成モード
デフォルトの User-created Data Store with Public IP Addresses を使用します。
認証方法
[DataWorks SSH 公開鍵認証] を推奨します。
ホストアドレス
Network Load Balancer コンソールにログインします。トップナビゲーションバーでリージョンを選択します。インスタンスを見つけてその名前をクリックし、インスタンス詳細ページを開きます。[ドメイン名] をコピーして [ホストアドレス] として使用します。
ホストポート
サーバーのホストポートは
22です。ユーザー名
サーバーのユーザー名は
rootです。公開鍵
キーペアの生成 をクリックします。プラットフォームは、設定したユーザー名に基づいて公開鍵を生成します。
重要接続をテストする前に、公開鍵を
2 つのECS ホストの.ssh/authorized_keysファイルに追加してください。そうしないと、テストは失敗します。 -
リソースグループの接続性をテストします。
接続設定 セクションで、ワークスペースにバインドされているサーバーレスリソースグループを見つけ、Connected state 列の テスト接続 をクリックします。
SSH タスクの実行
以下の手順に従って SSH ノードを作成・開発し、タスク結果を確認してその機能性を検証できます。
SSH ノードの作成
以下の手順で SSH ノードを作成できます。詳細については、「SSH ノードの作成」をご参照ください。
-
DataWorks コンソールの [ワークスペース] ページに移動します。トップナビゲーションバーで目的のリージョンを選択します。目的のワークスペースを見つけ、[アクション] 列の を選択します。
-
左側のナビゲーションウィンドウで、
アイコンをクリックします。Project Directory の横にある
アイコンをクリックし、 を選択して New Node ダイアログボックスを開きます。 -
New Node ダイアログボックスで、SSH ノードのカスタム Name を入力します。
-
Confirm をクリックしてノードエディターに移動します。
SSH ノードの開発
ノードエディターページで、以下のサンプルコードを追加し、実行環境を設定します。
-
SSH ノードのコードを記述します。
コードエディタに、次のサンプルコマンドを入力します:
cat /tmp/a.txt -
実行環境を設定します。
-
データソース:エディター上部の Select a data source ドロップダウンリストから、
SSH_DBデータソースを選択します。 -
リソースグループ設定:右側のペインで Run Configuration をクリックし、Resource Group をご利用のサーバーレスリソースグループに設定します。
-
-
ツールバーの Save ボタンをクリックして SSH ノードを保存します。
タスク結果の表示
SSH ノードを複数回実行し、出力を比較して負荷分散が有効であることを確認します。
-
SSH ノードタスクを実行します。
ツールバーの Run ボタンをクリックします。最初の実行が完了したら、タスクを再度実行します。
-
タスク結果を表示します。
説明タスクが毎回異なる ECS インスタンスにルーティングされるため、実行ごとに出力が異なる場合があります。
実行結果 1。
2025-04-11 16:53:05 INFO ============================================= 2025-04-11 16:53:06,657 INFO [SshWrapperMain.java:151] - Get PrivateKey Content OK 2025-04-11 16:53:06,667 INFO [SshExecutorUtil.java:33] - User: xxx 2025-04-11 16:53:06,668 INFO [SshExecutorUtil.java:34] - Host: xxx 2025-04-11 16:53:06,668 INFO [SshExecutorUtil.java:35] - Port: 22 2025-04-11 16:53:07,876 INFO [SshExecutorUtil.java:55] - session connect success 2025-04-11 16:53:07,877 INFO [SshExecutorUtil.java:56] - code: cat /tmp/a.txt 2025-04-11 16:53:07,894 INFO [SshExecutorUtil.java:66] - channel connect success I am the first server 2025-04-11 16:53:09 INFO ============================================= 2025-04-11 16:53:09 INFO Exit code of the Shell command 0 2025-04-11 16:53:09 INFO --- Invocation of Shell command completed --- 2025-04-11 16:53:09 INFO Shell run successfully! 2025-04-11 16:53:09 INFO Current task status: FINISH 2025-04-11 16:53:09 INFO Cost time is: 3.238s実行結果 2:
この出力は "I am the second server" を示しており、リクエストが 2 番目の ECS インスタンスにルーティングされたことを示します。実行ログは次のとおりです:
2025-04-11 16:53:56 INFO ============================================================ 2025-04-11 16:53:57,632 INFO [SshWrapperMain.java:151] - Get PrivateKey Content OK 2025-04-11 16:53:57,645 INFO [SshExecutorUtil.java:33] - User: 2025-04-11 16:53:57,645 INFO [SshExecutorUtil.java:34] - Host: 2025-04-11 16:53:57,645 INFO [SshExecutorUtil.java:35] - Port: 22 2025-04-11 16:53:58,746 INFO [SshExecutorUtil.java:55] - session connect success 2025-04-11 16:53:58,746 INFO [SshExecutorUtil.java:56] - code: cat /tmp/a.txt 2025-04-11 16:53:58,764 INFO [SshExecutorUtil.java:66] - channel connect success I am the second server 2025-04-11 16:53:59 INFO ============================================================ 2025-04-11 16:53:59 INFO Exit code of the Shell command 0 2025-04-11 16:53:59 INFO --- Invocation of Shell command completed --- 2025-04-11 16:53:59 INFO Shell run successfully! 2025-04-11 16:53:59 INFO Current task status: FINISH 2025-04-11 16:53:59 INFO Cost time is: 3.011s
仕組み
以下では、DataWorks が NLB を使用して高同時実行 SSH タスクの安定した実行を保証する仕組みについて説明します:
このソリューションは、複数の ECS インスタンスを NLB サーバーグループに追加し、NLB インスタンスの DNS 名を DataWorks の SSH データソースとして使用することで機能します。SSH ノードからのタスクリクエストは NLB リスナーによって傍受され、その負荷分散ポリシーに基づいて正常な ECS インスタンスに分散されます。実行結果は NLB を介して返され、SSH ノードのログに表示されます。