3.17. 応答しないサイトを無効にするための AWS Lambda のデプロイ
マルチクラスターデプロイメントの構成要素であるロードバランサーの一部として AWS Lambda をデプロイします。
この章では、マルチクラスターデプロイメントの 2 つのサイト間でスプリットブレインが発生する状況を解決する方法を説明します。1 つのサイトに障害が発生するとレプリケーションが無効になるため、他のサイトは引き続きリクエストを処理できます。
このデプロイメントは、マルチクラスターデプロイメントの概念 の章で説明されているセットアップで使用することを想定としています。このデプロイメントは、マルチクラスターデプロイメントの構成要素 の章で説明されている他の構成要素とともに使用してください。
以下のブループリントは、機能的に完全な最小限の例を示すためのものであり、通常のインストールに適したベースラインのパフォーマンスを実現します。ただし、お使いの環境、組織の標準、セキュリティーのベストプラクティスに合わせて変更する必要があります。
3.17.1. アーキテクチャー リンクのコピーリンクがクリップボードにコピーされました!
マルチクラスターデプロイメントのサイト間でネットワーク通信障害が発生すると、2 つのサイト間でデータのレプリケーションを継続できなくなります。Data Grid には FAIL 障害ポリシーが設定されており、可用性よりも整合性が優先されます。したがって、ネットワーク接続を復元するかクロスサイトレプリケーションを無効にすることで障害が解決されるまで、すべてのユーザーリクエストにエラーメッセージが表示されます。
このような状況では、オンラインまたはオフラインとしてマークするサイトを判断するために、クォーラムが一般的に使用されます。しかし、マルチクラスターデプロイメントは 2 つのサイトのみで構成されるため、これは不可能です。代わりに、“フェンシング” を活用して、一方のサイトが他方のサイトに接続できない場合に、ロードバランサー設定に残るサイトが 1 つだけになるようにして、このサイトだけが後続のユーザーリクエストを処理できるようにします。
フェンシングの手順では、ロードバランサーの設定に加え、2 つの Data Grid クラスター間のレプリケーションを無効にして、ロードバランサー設定に残っているサイトからのユーザーリクエストに対応できるようにします。その結果、レプリケーションが無効になるとサイトは同期されなくなります。
非同期状態から回復するには、サイトの同期 で説明されているとおり手動で再同期する必要があります。このような理由から、フェンシングによって削除されたサイトは、ネットワーク通信障害が解決されても自動的に再追加されません。削除されたサイトは、サイトをオンラインにする の手順に従って、必ず 2 つのサイトを同期してから再度追加してください。
この章では、Prometheus アラート と AWS Lambda 関数を組み合わせてフェンシングを実装する方法を説明します。Data Grid サーバーのメトリクスによってスプリットブレインが検出されると、Prometheus アラートがトリガーされ、Prometheus AlertManager が AWS Lambda ベースの Webhook を呼び出します。トリガーされた Lambda 関数は、現在の Global Accelerator 設定を検査し、オフラインであると報告されたサイトを削除します。
両方のサイトがまだ稼働しているがネットワーク通信がダウンしている真のスプリットブレインシナリオでは、両方のサイトが同時に Webhook をトリガーする可能性があります。これを防止するために、一度に 1 つの Lambda インスタンスのみを実行できるようにします。AWS Lambda のロジックにより、ロードバランサー設定には必ず 1 つのサイトエントリーが残ります。
3.17.2. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
- ROSA HCP を基盤とする Keycloak マルチクラスターデプロイメント
- AWS CLI がインストールされている
- AWS Global Accelerator ロードバランサー
-
jqツールがインストールされている
3.17.3. 手順 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift のユーザーアラートのルーティングを有効にします。
コマンド:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lambda Webhook の認証に使用するユーザー名とパスワードの組み合わせを決定し、そのパスワードを保存する AWS シークレットを作成します。
コマンド:
aws secretsmanager create-secret \ --name webhook-password \ --secret-string changeme \ --region eu-west-1
aws secretsmanager create-secret \ --name webhook-password \1 --secret-string changeme \2 --region eu-west-13 Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lambda の実行に使用するロールを作成します。
コマンド:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lambda が AWS Secrets にアクセスできるように、'LambdaSecretManager' ポリシーを作成してアタッチします。
コマンド:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ElasticLoadBalancingReadOnlyポリシーをアタッチして、Lambda がプロビジョニングされたネットワークロードバランサーに対してクエリーを実行できるようにします。コマンド:
aws iam attach-role-policy \ --role-name ${FUNCTION_NAME} \ --policy-arn arn:aws:iam::aws:policy/ElasticLoadBalancingReadOnlyaws iam attach-role-policy \ --role-name ${FUNCTION_NAME} \ --policy-arn arn:aws:iam::aws:policy/ElasticLoadBalancingReadOnlyCopy to Clipboard Copied! Toggle word wrap Toggle overflow GlobalAcceleratorFullAccessポリシーをアタッチして、Lambda が Global Accelerator EndpointGroup を更新できるようにします。コマンド:
aws iam attach-role-policy \ --role-name ${FUNCTION_NAME} \ --policy-arn arn:aws:iam::aws:policy/GlobalAcceleratorFullAccessaws iam attach-role-policy \ --role-name ${FUNCTION_NAME} \ --policy-arn arn:aws:iam::aws:policy/GlobalAcceleratorFullAccessCopy to Clipboard Copied! Toggle word wrap Toggle overflow 必要なフェンシングロジックを含む Lambda ZIP ファイルを作成します。
コマンド:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Lambda 関数を作成します。
コマンド:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- OpenShift クラスターをホストしている AWS リージョン
関数 URL を公開して、Lambda を Webhook としてトリガーできるようにします。
コマンド:
aws lambda create-function-url-config \ --function-name ${FUNCTION_NAME} \ --auth-type NONE \ --region eu-west-1aws lambda create-function-url-config \ --function-name ${FUNCTION_NAME} \ --auth-type NONE \ --region eu-west-11 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- OpenShift クラスターをホストしている AWS リージョン
関数 URL のパブリック呼び出しを許可します。
コマンド:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- OpenShift クラスターをホストしている AWS リージョン
Lambda の環境変数を設定します。
各 OpenShift クラスターで、公開された Data Grid URL エンドポイントを取得します。
oc -n ${NAMESPACE} get route infinispan-external -o jsonpath='{.status.ingress[].host}'oc -n ${NAMESPACE} get route infinispan-external -o jsonpath='{.status.ingress[].host}'1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
${NAMESPACE}を、Data Grid サーバーが含まれる namespace に置き換えます。
必要な環境変数をアップロードします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- デプロイメントで使用される AWS Global Accelerator の名前
- 2
- OpenShift クラスターと Lambda 関数がホストされている AWS リージョン
- 3
- Data Grid Operator を使用して HA 用に Data Grid をデプロイする で定義されている 1 つの Data Grid サイトの名前
- 4
- CLUSER_1_NAME サイトに関連付けられた Data Grid エンドポイント URL
- 5
- 2 番目の Data Grid サイトの名前
- 6
- CLUSER_2_NAME サイトに関連付けられた Data Grid エンドポイント URL
- 7
- サーバー上で REST リクエストを実行するのに十分な権限を持つ Data Grid ユーザーのユーザー名
- 8
- Data Grid ユーザーに関連付けられたパスワードが含まれる AWS シークレットの名前
- 9
- Lambda 関数へのリクエストの認証に使用されるユーザー名
- 10
- Lambda 関数へのリクエストの認証に使用されるパスワードが含まれる AWS シークレットの名前
Lambda 関数 URL を取得します。
コマンド:
aws lambda get-function-url-config \ --function-name ${FUNCTION_NAME} \ --query "FunctionUrl" \ --region eu-west-1 \ --output textaws lambda get-function-url-config \ --function-name ${FUNCTION_NAME} \ --query "FunctionUrl" \ --region eu-west-1 \1 --output textCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Lambda が作成された AWS リージョン
出力:
https://tjqr2vgc664b6noj6vugprakoq0oausj.lambda-url.eu-west-1.on.aws
https://tjqr2vgc664b6noj6vugprakoq0oausj.lambda-url.eu-west-1.on.awsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 各 OpenShift クラスターで、スプリットブレイン時に Lambda をトリガーする Prometheus アラートルーティングを設定します。
コマンド:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.17.4. 検証 リンクのコピーリンクがクリップボードにコピーされました!
Prometheus アラートが期待どおりに Webhook をトリガーすることをテストするには、次の手順を実行してスプリットブレインをシミュレートします。
各クラスターで以下を実行します。
コマンド:
oc -n openshift-operators scale --replicas=0 deployment/infinispan-operator-controller-manager oc -n openshift-operators rollout status -w deployment/infinispan-operator-controller-manager oc -n ${NAMESPACE} scale --replicas=0 deployment/infinispan-router oc -n ${NAMESPACE} rollout status -w deployment/infinispan-routeroc -n openshift-operators scale --replicas=0 deployment/infinispan-operator-controller-manager1 oc -n openshift-operators rollout status -w deployment/infinispan-operator-controller-manager oc -n ${NAMESPACE} scale --replicas=0 deployment/infinispan-router2 oc -n ${NAMESPACE} rollout status -w deployment/infinispan-routerCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
OpenShift コンソールの Observe
Alerting メニューを調べて、クラスターで SiteOfflineイベントが発生したことを確認します。 - AWS コンソールで Global Accelerator EndpointGroup を調べます。エンドポイントが 1 つだけ存在するはずです。
サイト間の接続を再確立するために、Data Grid Operator と Gossip Router をスケールアップします。
コマンド:
oc -n openshift-operators scale --replicas=1 deployment/infinispan-operator-controller-manager oc -n openshift-operators rollout status -w deployment/infinispan-operator-controller-manager oc -n ${NAMESPACE} scale --replicas=1 deployment/infinispan-router oc -n ${NAMESPACE} rollout status -w deployment/infinispan-routeroc -n openshift-operators scale --replicas=1 deployment/infinispan-operator-controller-manager oc -n openshift-operators rollout status -w deployment/infinispan-operator-controller-manager oc -n ${NAMESPACE} scale --replicas=1 deployment/infinispan-router1 oc -n ${NAMESPACE} rollout status -w deployment/infinispan-routerCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
${NAMESPACE}を、Data Grid サーバーが含まれる namespace に置き換えます。
-
各サイトの
vendor_jgroups_site_view_statusメトリクスを調べます。値が1の場合、サイトがアクセス可能であることを示します。 - 両方のエンドポイントが含まれるように Accelerator EndpointGroup を更新します。詳細は、サイトをオンラインにする の章を参照してください。
3.17.5. 関連資料 リンクのコピーリンクがクリップボードにコピーされました!
- サイトをオンラインにする
- サイトをオフラインにする