第7章 上級者向けチュートリアル
7.1. ワークフローの例: クラスターをスケールダウンするときの自動化トランザクションリカバリー機能 リンクのコピーリンクがクリップボードにコピーされました!
この機能はテクノロジープレビューとしてのみ提供されます。テクノロジープレビューの機能は本番環境での使用はサポートされず、今後大きな変更がある場合があります。テクノロジープレビュー機能のサポート範囲については、Red Hat カスタマーポータルの「テクノロジプレビュー機能のサポート範囲」を参照してください。
このチュートリアルでは、クラスターをスケールダウンするときに JBoss EAP for OpenShift イメージの自動化トランザクションリカバリー機能を実行します。ここでは、jta-crash-rec-eap7 クイックスタートサンプルと eap72-tx-recovery-s2i アプリケーションテンプレートは、クラスターのスケールダウンによって OpenShift Pod が終了されたときに XA トランザクションの問題が、どのように専用のマイグレーション Pod によってリカバリーされるかを示すために使用されます。
jta-crash-rec-eap7 クイックスタートは、JBoss EAP に含まれる H2 データベースを使用します。これは、例でのみ使用される、ライトウェイトなリレーショナルデータソースのサンプルです。堅牢でもスケーラブルでもなく、サポートされないため、本番環境では使用しないでください。
7.1.1. デプロイメントの準備 リンクのコピーリンクがクリップボードにコピーされました!
-
oc loginコマンドを使用して、OpenShift インスタンスにログインします。 新しいプロジェクトを作成します。
oc new-project eap-tx-demo
$ oc new-project eap-tx-demoCopy to Clipboard Copied! Toggle word wrap Toggle overflow 基盤の Pod の実行に使用される
defaultサービスアカウントに view ロールを追加します。これにより、サービスアカウントがeap-tx-demonamespace のすべてのリソースを確認できるようになります。 これは、クラスターの管理に必要です。oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default
$ oc policy add-role-to-user view system:serviceaccount:$(oc project -q):defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow 自動化トランザクションリカバリーが機能するには、JBoss EAP アプリケーションは
ReadWriteMany永続ボリュームを使用する必要があります。${APPLICATION_NAME}-eap-claim永続ボリュームクレームのデータを保持するため eap72-tx-recovery-s2i アプリケーションテンプレートによって想定される永続ボリュームのプロビジョニングを行います。この例は、以下の定義で NFS メソッドを使用してプロビジョニングされる永続ボリュームオブジェクトを使用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記の定義の
pathおよびserverフィールドを環境に合わせて更新し、以下のコマンドを使用して永続ボリュームのプロビジョニングを行います。oc create -f txpv.yaml
$ oc create -f txpv.yaml persistentvolume "txpv" createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc get pv
$ oc get pv NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM STORAGECLASS REASON AGE txpv 1Gi RWX Retain Available 26sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要NFS メソッドを使用して
eap72-tx-recovery-s2iアプリケーションテンプレートの永続ボリュームオブジェクトのプロビジョニングを行う場合、適切なパーミッションがある状態でマウントポイントをエクスポートするようにしてください。マウントポイントのエクスポート元となるホストで以下を実行します。chmod -R 777 /mnt/mountpoint
# chmod -R 777 /mnt/mountpointCopy to Clipboard Copied! Toggle word wrap Toggle overflow cat /etc/exports /mnt/mountpoint *(rw,sync,anonuid=185,anongid=185)
# cat /etc/exports /mnt/mountpoint *(rw,sync,anonuid=185,anongid=185)Copy to Clipboard Copied! Toggle word wrap Toggle overflow exportfs -va
# exportfs -va exporting *:/mnt/mountpointCopy to Clipboard Copied! Toggle word wrap Toggle overflow setsebool -P virt_use_nfs 1
# setsebool -P virt_use_nfs 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記の
/mnt/mountpointパスは、環境に合わせて変更してください。
7.1.2. デプロイメント リンクのコピーリンクがクリップボードにコピーされました!
-
eap72-tx-recovery-s2i アプリケーションテンプレートを使用して、
クイックスタートをデプロイします。以下を指定します。jta-crash-rec-eap7
例: eap72-tx-recovery-s2i アプリケーションテンプレート
+
以上の例では、JDK 11 イメージストリームは JDK 8 イメージストリームで使用される eap72-tx-recovery-s2i の代わりに、eap72-openjdk11-tx-recovery-s2i アプリケーションテンプレートを使用します。
-
ビルドが完了するまで待ちます。
oc logs -f bc/eap-appコマンドを使用すると、ビルドの状態を確認できます。 JAVA_OPTS_APPENDおよびJBOSS_MODULES_SYSTEM_PKGS_APPEND環境変数の定義でeap-appデプロイメント設定を編集します。oc get dc
$ oc get dc NAME REVISION DESIRED CURRENT TRIGGERED BY eap-app 1 1 1 config,image(eap-app:latest) eap-app-migration 1 1 1 config,image(eap-app:latest)Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc set env dc/eap-app \ -e JBOSS_MODULES_SYSTEM_PKGS_APPEND="org.jboss.byteman" \ -e JAVA_OPTS_APPEND="-javaagent:/tmp/src/extensions/byteman/byteman.jar=script:/tmp/src/src/main/scripts/xa.btm"
$ oc set env dc/eap-app \ -e JBOSS_MODULES_SYSTEM_PKGS_APPEND="org.jboss.byteman" \ -e JAVA_OPTS_APPEND="-javaagent:/tmp/src/extensions/byteman/byteman.jar=script:/tmp/src/src/main/scripts/xa.btm" deploymentconfig "eap-app" updatedCopy to Clipboard Copied! Toggle word wrap Toggle overflow この設定は、以下のように XA トランザクションの処理を変更するよう、Byteman のトレースおよび監視ツールに通知します。
- 最初のトランザクションは成功するように常に許可されます。
- XA トラザクションが 2 つ目のトランザクションのフェーズ 2 を実行するとき、特定の Pod の JVM プロセスが停止されます。
7.1.3. JTA クラッシュリカバリーアプリケーションの使用 リンクのコピーリンクがクリップボードにコピーされました!
現在の namespace で実行中の Pod をリストします。
oc get pods | grep Running
$ oc get pods | grep Running NAME READY STATUS RESTARTS AGE eap-app-2-r00gm 1/1 Running 0 1m eap-app-migration-1-lvfdt 1/1 Running 0 2mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 新しい XA トラザクションを発行します。
- ブラウザーを開き、http://eap-app-eap-tx-demo.openshift.example.com/jboss-jta-crash-rec にアクセスして、アプリケーションを起動します。
-
Mercedesを Key フィールド、Benzを Value フィールドに入力します。Submit ボタンをクリックします。 - しばらく待ち、Refresh Table リンクをクリックします。
Mercedesエントリーが含まれるテーブル行がどのようにupdated via JMS.で更新されるか注意してください。 まだ更新されない場合は、Refresh Table リンクを数回クリックしてください。この代わりに、eap-app-2-r00gmPod のログを調べ、トランザクションが適切に処理されたことを確認することもできます。oc logs eap-app-2-r00gm | grep 'updated'
$ oc logs eap-app-2-r00gm | grep 'updated' INFO [org.jboss.as.quickstarts.xa.DbUpdaterMDB] (Thread-0 (ActiveMQ-client-global-threads-1566836606)) JTA Crash Record Quickstart: key value pair updated via JMS.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ブラウザーを使用し、http://eap-app-eap-tx-demo.openshift.example.com/jboss-jta-crash-rec で 2 つ目の XA トラザクションを発行します。
-
Landを Key フィールドに、Roverを Value フィールドに入力します。Submit ボタンをクリックします。 - しばらく待ち、Refresh Table リンクをクリックします。
-
Land Roverエントリーがupdated via …接尾辞なしでどのように追加されたかに注目してください。
-
クラスターをスケールダウンします。
oc scale --replicas=0 dc/eap-app
$ oc scale --replicas=0 dc/eap-app deploymentconfig "eap-app" scaledCopy to Clipboard Copied! Toggle word wrap Toggle overflow eap-app-2-r00gmPod の終了がどのようにスケジュールされたかを確認します。oc get pods
$ oc get pods NAME READY STATUS RESTARTS AGE eap-app-1-build 0/1 Completed 0 4m eap-app-2-r00gm 1/1 Terminating 0 2m eap-app-migration-1-lvfdt 1/1 Running 0 3mCopy to Clipboard Copied! Toggle word wrap Toggle overflow
マイグレーション Pod のログを確認し、トランザクションリカバリーがどのように実行されるかを確認します。リカバリーの終了まで待機します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow クラスターを元にスケールアップします。
oc scale --replicas=1 dc/eap-app
$ oc scale --replicas=1 dc/eap-app deploymentconfig "eap-app" scaledCopy to Clipboard Copied! Toggle word wrap Toggle overflow - ブラウザーを使用して再度 http://eap-app-eap-tx-demo.openshift.example.com/jboss-jta-crash-rec にアクセスします。
テーブルに両方のトランザクションのエントリーが含まれることに注意してください。以下の出力と似たものになります。
Expand 表7.1 例: データベーステーブルの内容 データベーステーブルの内容 Key
Value
Mercedes
Benz updated via JMS.
Land
Rover updated via JMS.
上記のテーブルの内容は、2 つ目の XA トラザクションが終了する前にクラスターがスケールダウンしたものの、マイグレーション Pod がトランザクションリカバリーを実行し、トランザクションが正常に完了したことを示しています。