7.10. 安全なトランザクションリカバリーの EAP Operator

特定の種類のトランザクションの場合、EAP オペレーターは、アプリケーションクラスターを削除する前にデータの一貫性を確立します。これは、レプリカを縮小し、削除するために clean として Pod をマークする前に、すべてのトランザクションが完了していることを検証することで行います。

注記

一部のシナリオはサポートされていません。サポートされていないシナリオの詳細は、サポートされないトランザクションリカバリーのシナリオ を参照してください。

これは、データが整合した状態でディプロイメントを安全に削除するのであれば、最初に Pod の数を 0 に縮小し、すべての pod が削除されるまで待ってからはじめて wildflyserver インスタンスを削除するということを意味します。

警告

wildflyserver 定義の全体を削除する場合 (oc delete wildflyserver <deployment_name>)、トランザクション回復プロセスは開始されず、未完了のトランザクションに関係なく Pod は終了します。この操作により、後で開始するデータの変更がブロックされる可能性があります。この wildflyserver を使用したトランザクションエンタープライズ bean リモート呼び出しに関連する他の JBoss EAP インスタンスのデータ変更もブロックされる可能性があります。

縮小プロセスが開始しても、Pod の状態 (oc get pod <pod_name>) は依然として Running とマークされています。これは、ターゲット対象のリモートエンタープライズ bean 呼び出しを含む、すべての未完了トランザクションを完了する必要があるためです。

縮小プロセスの状態を監視する場合は、wildflyserver インスタンスのステータスを確認します。詳細は、Monitoring the Scaledown Process を参照してください。縮小を行う際の Pod ステータスの詳細は、Pod Status During scaleDown を参照してください。

7.10.1. 安定したネットワークホスト名の StatefulSets

wildflyserver を管理する EAP オペレーターは、JBoss EAP Pod を管理する基礎となるオブジェクトとして StatefulSet を作成します。

StatefulSet は、ステートフルなアプリケーションを管理するワークロード API オブジェクトです。これは一連の Pod のデプロイメントおよびスケーリングを管理し、これらの Pod の順序と一意性を保証します。

StatefulSet は、クラスターの Pod が事前に定義された順序で命名されるようにします。また、これは Pod が同じ順序で終了することを保証します。たとえば、pod-1 にヒューリスティックな結果のトランザクションがあるとします。つまり、その状態は SCALING_DOWN_RECOVERY_DIRTY です。pod-0 が SCALING_DOWN_CLEAN の状態であっても、pod-1 の前に終了することはありません。pod-1 が clean で、終了するまで、pod-0 は SCALING_DOWN_CLEAN 状態に留まります。ただし、pod-0 が SCALING_DOWN_CLEAN 状態であっても、新しいリクエストを受け取らず、実際にはアイドル状態になります。

注記

StatefulSet のレプリカサイズを下げたり、Pod 自体を削除したりしても、これらの変更は元に戻りません。

7.10.2. Scaledown プロセスの監視

縮小プロセスの状態を監視する場合は、wildflyserver インスタンスのステータスを確認する必要があります。縮小時の各種 Pod ステータスの詳細は、Pod Status During scaleDown を参照してください。

手順

  • 縮小プロセスの状態を確認する方法:

    oc describe wildflyserver <name>
    • WildFlyServer.Status.Scalingdown Pods および WildFlyServer.Status.Replicas フィールドは、アクティブな Pod とアクティブでない Pod の全体的な状態を示します
    • Scalingdown Pods フィールドは、未終了のトランザクションがすべて完了したときに終了する必要のある Pod 数を示します。
    • WildFlyServer.Status.Replicas フィールドには、実行中の Pod の現在の数が表示されます。
    • WildFlyServer.Spec.Replicas フィールドには、ACTIVE 状態の Pod の数が表示されます。
    • 縮小プロセスに Pod がない場合は、WildFlyServer.Status.ReplicasWildFlyServer.Spec.Replicas フィールドの Pod の数は同じです。

7.10.2.1. 縮小中の Pod ステータス

以下の表では、縮小時の各種 Pod ステータスを説明しています。

表7.1 Pod ステータスの説明

Pod ステータス説明

ACTIVE

Pod はアクティブの状態で、要求を処理しています。

SCALING_DOWN_RECOVERY_INVESTIGATION

Pod はまもなく縮小されます。縮小プロセスが、JBoss EAP のトランザクションの状態について調査中です。

SCALING_DOWN_RECOVERY_DIRTY

JBoss EAP には不完全なトランザクションが含まれています。Pod は、消去されるまで終了しません。トランザクションリカバリープロセスは JBoss EAP で定期的に実行され、トランザクションが完了するまで待機します。

SCALING_DOWN_CLEAN

Pod はトランザクションの縮小処理によって処理され、クラスターからの削除対象として clean とマークされます。

7.10.3. ヒューリスティックな結果のあるトランザクションの際の縮小

トランザクションの結果が不明な場合は、自動トランザクションリカバリーは行えません。その場合、トランザクションを手動でリカバリーする必要があります。

前提条件

  • Pod のステータスが SCALING_DOWN_RECOVERY_DIRTY から抜け出せない。

手順

  1. CLI を使用して JBoss EAP インスタンスにアクセスします。
  2. トランザクションオブジェクトストアのすべてのヒューリスティックトランザクションレコードを解決します。詳細は、JBoss EAP でのトランザクションヒューリスティックな結果のリカバリー を参照してください。
  3. エンタープライズ bean クライアントリカバリーフォルダーからすべてのレコードを削除します。

    1. すべてのファイルを Pod エンタープライズ bean クライアントリカバリーディレクトリーから削除します。

      $JBOSS_HOME/standalone/data/ejb-xa-recovery
      oc exec <podname> rm -rf $JBOSS_HOME/standalone/data/ejb-xa-recovery
  4. Pod のステータスが SCALING_DOWN_CLEAN に変わり、Pod が終了します。

7.10.4. トランザクションログに JDBC ストレージを使用するトランザクションサブシステムの設定

システムが トランザクションログ を保存するファイルシステムを提供しない場合は、JBoss EAP S2I イメージを使用して JDBC オブジェクトストアを設定します。

重要

JBoss EAP が起動可能な JAR としてデプロイされた場合、S2I 環境変数を使用することはできません。この場合、Galleon レイヤーを作成するか、 CLI スクリプトを設定して、必要な設定変更を行う必要があります。

JDBC オブジェクトストアは、環境変数 TX_DATABASE_PREFIX_MAPPING で設定できます。この変数の構造は DB_SERVICE_PREFIX_MAPPING と同じです。

前提条件

  • 環境変数の値に基づいてデータソースを作成している。
  • データベースと、JDBC オブジェクトストアで通信する トランザクションマネージャー の間で、一貫性のあるデータ読み取りと書き込みパーミッションを確保している。詳細は、configuring JDBC data sources を参照してください。

手順

  • S2I 環境変数を使用して JDBC オブジェクトストアをセットアップおよび設定します。

    # Narayana JDBC objectstore configuration via s2i env variables
    - name: TX_DATABASE_PREFIX_MAPPING
      value: 'PostgresJdbcObjectStore-postgresql=PG_OBJECTSTORE'
    - name: POSTGRESJDBCOBJECTSTORE_POSTGRESQL_SERVICE_HOST
      value: 'postgresql'
    - name: POSTGRESJDBCOBJECTSTORE_POSTGRESQL_SERVICE_PORT
      value: '5432'
    - name: PG_OBJECTSTORE_JNDI
      value: 'java:jboss/datasources/PostgresJdbc'
    - name: PG_OBJECTSTORE_DRIVER
      value: 'postgresql'
    - name: PG_OBJECTSTORE_DATABASE
      value: 'sampledb'
    - name: PG_OBJECTSTORE_USERNAME
      value: 'admin'
    - name: PG_OBJECTSTORE_PASSWORD
      value: 'admin'

検証

  • データソース設定およびトランザクションサブシステム設定の両方を確認するには、standalone-openshift.xml 設定ファイル oc rsh <podname> cat /opt/eap/standalone/configuration/standalone-openshift.xml を確認します。

    想定される出力:

    <datasource jta="false" jndi-name="java:jboss/datasources/PostgresJdbcObjectStore" pool-name="postgresjdbcobjectstore_postgresqlObjectStorePool"
        enabled="true" use-java-context="true" statistics-enabled="${wildfly.datasources.statistics-enabled:${wildfly.statistics-enabled:false}}">
        <connection-url>jdbc:postgresql://postgresql:5432/sampledb</connection-url>
        <driver>postgresql</driver>
        <security>
            <user-name>admin</user-name>
            <password>admin</password>
        </security>
    </datasource>
    
    <!-- under subsystem urn:jboss:domain:transactions -->
    <jdbc-store datasource-jndi-name="java:jboss/datasources/PostgresJdbcObjectStore">
         <!-- the pod name was named transactions-xa-0 -->
        <action table-prefix="ostransactionsxa0"/>
        <communication table-prefix="ostransactionsxa0"/>
        <state table-prefix="ostransactionsxa0"/>
    </jdbc-store>

関連情報

  • 管理コンソールまたは管理 CLI のいずれかを使用したデータソースの作成に関する詳細は、JBoss EAPConfiguration GuideCreating Datasources を参照してください。