DataWorks の SSH ノードは、デフォルトで特定の Elastic Compute Service (ECS) インスタンスに接続します。そのインスタンスに障害が発生したり、リソースが枯渇したりすると、SSH タスクが停止または中断します。Alibaba Cloud Network Load Balancer (NLB) を介して SSH トラフィックをルーティングすることで、タスクロジックを変更することなく、複数の ECS インスタンスにタスクを分散させ、単一障害点 (SPOF) を排除できます。
このトピックでは、ECS インスタンスの作成、NLB の設定、NLB インスタンスを SSH データソースとして追加、タスクがインスタンス間で分散されることの確認まで、一連のセットアップ手順を説明します。
仕組み
NLB インスタンスのドメイン名で SSH データソースを設定すると、DataWorks の SSH ノードからのすべてのタスクリクエストは NLB のリスナーによってインターセプトされます。NLB は、その負荷分散ポリシーに基づいて正常な ECS インスタンスを選択し、リクエストをそのインスタンスに転送します。ECS インスタンスがタスクを実行し、結果は NLB を介して透過的に返され、SSH ノードの実行ログに表示されます。
次の表は、NLB を使用する場合と使用しない場合の SSH タスク実行の違いをまとめたものです。
| 項目 | 負荷分散なし | 負荷分散あり |
|---|---|---|
| 障害の影響 | 影響を受けた ECS インスタンス上のタスクが遅延または停止する | NLB が正常なインスタンスにタスクを自動的に再ルーティングする |
| タスクの継続性 | 単一インスタンスの障害時に中断される | サーバーグループ全体で維持される |
| リソースの枯渇 | 1 つのインスタンスが枯渇するとタスクが失敗する | リクエストがインスタンス間で分散される |
| 運用保守の労力 | 回復には手動での介入が必要 | NLB のヘルスチェックがフェイルオーバーを自動的に処理する |
この機能の利用シーン
次のような場合に、SSH ノードに対して NLB を利用した負荷分散を設定します。
-
ECS インスタンスの障害やリソース枯渇による SSH タスクの失敗が許容できない場合
-
タスクの実行時間が長く、実行中のインスタンス再起動によってワークフローが中断される可能性がある場合
-
SSH ワークロード用に複数の ECS インスタンスを管理しており、タスクロジックを変更せずに自動フェイルオーバーを実現したい場合
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
-
RAM ユーザーは、[開発] または [ワークスペース管理者] ロールでワークスペースに追加されます。 詳細については、「ワークスペースにメンバーを追加する」をご参照ください。
重要Workspace Administrator ロールには、通常必要とされる以上の広範な権限が含まれています。慎重に割り当ててください。
-
サーバーレスリソースグループがワークスペースに関連付けられていること。詳細については、「サーバーレスリソースグループの使用」をご参照ください。
制限事項
-
SSH ノードのコードは
128 KBを超えることはできません。 -
DataWorks のリソースグループ、ECS インスタンス、および NLB インスタンスは、すべて同じリージョン内の同じ Virtual Private Cloud (VPC) に存在する必要があります。VPC またはリージョンが一致しない場合、接続に失敗します。
ステップ 1:ECS インスタンスの作成
少なくとも 2 つの ECS インスタンスを作成します。この例では、負荷分散が機能することを確認するために、異なるサンプルデータを持つ 2 つのインスタンスを使用します。
インスタンスの作成
-
ECS 購入ページに移動し、[カスタム起動] をクリックします。
-
以下のパラメーターを設定します。パラメーター設定の詳細については、「[カスタム起動] タブでのインスタンスの作成」をご参照ください。
パラメーター 説明 リージョン DataWorks ワークスペースが存在するリージョンを選択します ネットワークとゾーン サーバーレスリソースグループで使用される VPC と vSwitch を選択します セキュリティグループ サーバーレスリソースグループの vSwitch に関連付けられているセキュリティグループを選択します その他のパラメーター ビジネス要件に基づいて設定します -
購入ページの右側で、[数量] を
2に設定します。 -
[注文の作成] をクリックし、プロンプトに従って購入を完了します。
サンプルデータの設定
各 ECS インスタンスにログインし、後で負荷分散を検証できるように、異なるサンプルデータを書き込みます。
-
ECS コンソールにログインし、インスタンスが存在するリージョンを選択します。
-
[インスタンス] ページで、対象インスタンスの [操作] 列にある [接続] をクリックします。[リモート接続] ダイアログボックスで、[今すぐサインイン] をクリックします。
-
[インスタンスログイン] ダイアログボックスで、認証情報を入力してログインします。
-
次のコマンドを ECS インスタンス 1 で実行します。
echo "I am the second server" > /tmp/a.txt -
ステップ 2~3 を ECS インスタンス 2 に対して繰り返し、次に実行します:
echo "I am the second server" > /tmp/a.txtecho "I am the second server" > /tmp/a.txt
ステップ 2:NLB インスタンスの作成
ECS インスタンスに SSH トラフィックをルーティングする NLB インスタンスを作成します。詳細については、「NLB インスタンスの作成と管理」をご参照ください。
NLB インスタンスは、DataWorks ワークスペースと同じリージョンに作成してください。リージョンが異なると、接続に失敗します。
-
NLB コンソールにログインします。トップナビゲーションバーで、対象のリージョンを選択します。
-
左側のナビゲーションウィンドウで、[インスタンス] をクリックします。[インスタンス] ページで、[NLB の作成] をクリックします。[クラウドサービス購入ページ] が表示されます。
-
以下のパラメーターを設定します。
セクション パラメーター 値 ネットワーク ネットワークタイプ 内部向け VPC サーバーレスリソースグループがデプロイされている VPC ゾーン サーバーレスリソースグループの vSwitch が存在するゾーン IP バージョン IPv4 管理設定 インスタンス名 カスタム名を入力します リソースグループ デフォルトのリソースグループを選択します -
[今すぐ作成] をクリックします。[注文の確認] ページで、[今すぐアクティベート] をクリックします。
ステップ 3:バックエンドサーバーグループの作成
NLB インスタンスが 有効 状態になったら、サーバーグループを作成し、そこに ECS インスタンスを追加します。詳細については、「NLB サーバーグループ」をご参照ください。
-
NLB コンソールで、NLB インスタンスを見つけ、その ID をクリックしてインスタンス詳細ページを開きます。
-
[NLB クイックスタート] セクションで、[サーバーグループの作成] をクリックします。
-
[サーバーグループの作成] ダイアログボックスで、[サーバーグループ名] を
ECS_NLBに設定し、[作成] をクリックします。 -
確認ダイアログボックスで、[バックエンドサーバーの追加] をクリックします。
-
[バックエンドサーバー] タブで、[バックエンドサーバーの追加] をクリックします。表示されるパネルで、両方の ECS インスタンスを選択します。
-
[次へ] をクリックして [ポート/重み] ステップに進みます。各インスタンスの [ポート] を
22に設定し、[OK] をクリックします。
次に進む前に、追加が完了するのを待ちます。
ステップ 4:リスナーの設定
ポート 22 に TCP リスナーを追加して、NLB からサーバーグループに SSH トラフィックをルーティングします。詳細については、「TCP リスナーを追加する」をご参照ください。
-
NLB インスタンス詳細ページで、[NLB クイックスタート] セクションの [リスナーの作成] をクリックします。
-
[サーバーロードバランサーの設定] ページで、[リスナープロトコル] を [TCP] に、[リスナーポート] を
22に設定します。[次へ] をクリックします。 -
[サーバーグループの選択] ステップで、[サーバータイプ] を選択し、サーバーグループリストから
ECS_NLBを選択します。[次へ] をクリックします。 -
[設定の確認] ステップで、ECS インスタンスとリスナーポートが正しいことを確認します。[送信] をクリックします。
ステップ 5:NLB インスタンスを SSH データソースとして追加
DataWorks で、NLB インスタンスのドメイン名をホストアドレスとして使用して、SSH データソースを設定します。詳細については、「SSH データソース」をご参照ください。
データソースの設定
-
DataWorks コンソールにログインします。左側のナビゲーションウィンドウで、[その他] > [管理センター] を選択します。
-
ドロップダウンリストからワークスペースを選択し、[管理センターへ] をクリックします。
-
左側のナビゲーションウィンドウで、[データソース] をクリックします。[データソース] タブで、[データソースの追加] をクリックします。
-
[データソースの追加] ダイアログボックスで、[SSH] をクリックします。[SSH データソースの追加] ページで、以下のパラメーターを設定します。NLB インスタンスのドメイン名を取得するには、NLB コンソールでインスタンス詳細ページを開き、[インスタンス詳細] タブの [基本情報] セクションに移動し、[ドメイン名] の横にある [コピー] をクリックします。
パラメーター 値 データソース名 カスタム名。例: SSH_DB設定モード 接続文字列モード (固定) 認証方式 DataWorks SSH 公開鍵認証 (推奨) ホストアドレス NLB インスタンスのドメイン名 (下記参照) ホストポート 22ユーザー名 root公開鍵 [キーペアの生成] をクリックしてキーを生成します
各 ECS インスタンスへの公開鍵の追加
このステップは、ネットワーク接続をテストする前に完了してください。スキップすると、接続テストは失敗します。
[キーペアの生成] をクリックした後、生成された公開鍵をコピーし、各 ECS インスタンスの .ssh/authorized_keys ファイルに追加します。
-
[SSH データソースの追加] ページに表示された公開鍵をコピーします。
-
ECS インスタンス 1 にログインします(ステップ 1: ECS インスタンスを作成する の手順に従って)および実行します:
echo "<public-key>" >> ~/.ssh/authorized_keys<public-key>をコピーしたキーに置き換えます。 -
ECS インスタンス 2 についても同様に繰り返します。
接続性のテスト
[接続設定] セクションで、ワークスペースに関連付けられているサーバーレスリソースグループを見つけ、[接続ステータス] 列の [ネットワーク接続のテスト] をクリックします。
ステップ 6:SSH ノードの作成と実行
Data Studio で SSH ノードを作成し、複数回実行して、NLB が両方の ECS インスタンスにリクエストを分散させることを確認します。
ノードの作成
-
[ワークスペース] ページで、ワークスペースを見つけ、[操作] 列で [ショートカット] > [Data Studio] を選択します。
-
Data Studio の左側のナビゲーションウィンドウで、
アイコンをクリックします。
アイコンを [ワークスペースディレクトリ] の横でクリックし、[ノードの作成] > [一般] > [SSH] を選択します。 -
[ノードの作成] ダイアログボックスで、[名前] を設定し、[OK] をクリックします。
ノードの設定と実行
-
コードエディタで、以下を入力します。
cat /tmp/a.txt -
設定タブの上部にある [データソースの選択] ドロップダウンリストから、
SSH_DBを選択します。 -
右側のナビゲーションウィンドウで、[デバッグ設定] をクリックします。[リソースグループ] ドロップダウンリストからサーバーレスリソースグループを選択します。
-
ツールバーの [保存] をクリックし、次に [実行] をクリックします。
結果の検証
ノードを数回実行します。NLB は負荷分散アルゴリズムに基づいてタスクを ECS インスタンスにランダムに分散するため、実行ごとに異なる結果が表示される場合があります。
実行結果 1 
実行結果 2
連続した実行で同じ結果が表示されるのは正常です。NLB は複数回の実行にわたって同じインスタンスにタスクを分散させることがあります。複数回の実行で両方のインスタンスからの結果が表示されれば、負荷分散が機能していることが確認できます。
すべての実行で一貫して同じ結果が返される場合は、以下を確認してください。
-
公開鍵が両方の ECS インスタンスの
.ssh/authorized_keysに正しく追加されている -
両方のインスタンスは、NLB サーバーグループで正常なステータスを示しています。
-
リスナーポート (
22) はバックエンドサーバーポートと一致します
次のステップ
-
NLB サーバーグループ内のバックエンドサーバーのヘルスステータスを監視するには、「NLB サーバーグループ」をご参照ください。
-
SSH ノード開発の詳細については、「ノード開発」をご参照ください。
付録:実装原理
次の図は、NLB が DataWorks のタスクをどのように分散させ、SSH タスクの安定した実行を保証するかを示しています。
NLB インスタンスのサーバーグループに複数の ECS インスタンスを追加し、DataWorks の SSH データソースのホストアドレスとして NLB インスタンスのドメイン名を指定すると、SSH ノードを設定した際に、SSH ノード上のタスクリクエストが、データソースに基づいて NLB インスタンス用に設定されたリスナーによって監視され、対応するタスクが負荷分散ポリシーに基づいて正常な ECS インスタンスに分散されて実行されます。実行結果は NLB インスタンスによって透過的に返され、SSH ノードの実行ログにリアルタイムで表示されます。