7.10. 用于安全事务恢复的 EAP Operator

对于特定类型的事务,EAP 操作器会在终止应用程序集群前确保数据一致性,方法是验证所有事务在缩减副本前完成,并将 pod 标记为 clean 用于终止。

注意

一些环境不被支持。有关不支持的场景的更多信息,请参阅不支持的事务恢复方案

这意味着,如果要安全地删除部署时没有数据不一致,您必须首先将 pod 数量缩减为 0,等待所有 pod 终止,然后只删除 wildflyserver 实例。

警告

如果您决定删除整个 wildflyserver 定义(oc delete wildflyserver <deployment_name&gt;),则没有启动事务恢复过程,无论未完成的事务如何终止 pod。从此操作导致的未完成工作可能会阻止您随后启动的数据更改。其他涉及事务性企业所涉及的 JBoss EAP 实例的数据变化也会被利用这个 wildflyserver 进行远程调用。

当 scaledown 进程启动 pod 状态(oc get pod <pod_name>)仍标记为 Running,因为 pod 必须完成所有未完成的事务,包括针对该目标的远程企业级 Bean 调用。

如果要监控 scaledown 进程的状态,请观察 wildflyserver 实例的状态。如需更多信息,请参阅监控扩展进程。有关缩减期间 pod 状态的信息,请参阅在扩展过程中 Pod 状态

7.10.1. Stable Network Host Names 的 StatefulSets

管理 wildflyserver 的 EAP operator 将创建一个 StatefulSet 作为管理 JBoss EAP pod 的底层对象。

StatefulSet 是管理有状态应用程序的工作负载 API 对象。它管理一组 pod 的部署和扩展,并为这些 pod 的排序和唯一性提供保证。

StatefulSet 确保集群中的 pod 以预定义的顺序命名。它还确保 pod 终止遵循相同的顺序。例如,pod-1 有一个交易的结果,因此处于 SCALING_DOWN_RECOVERY_DIRTY 状态。即使 pod-0 处于 SCALING_DOWN_CLEAN 状态,它也不会在 pod-1 前终止。在 pod-1 干净 且被终止前,pod-0 会一直处于 SCALING_DOWN_CLEAN 状态。但是,即使 pod-0 处于 SCALING_DOWN_CLEAN 状态,它也不会收到任何新请求,且闲置实际。

注意

减少 StatefulSet 的副本大小或删除 pod 本身无效,并会恢复此类更改。

7.10.2. 监控扩展过程

如果要监控 scaledown 进程的状态,您必须观察 wildflyserver 实例的状态。有关 scaledown 期间不同 pod 状态的更多信息,请参阅在扩展过程中 Pod 状态

流程

  • 观察 scaledown 进程的状态:

    oc describe wildflyserver <name>
    • WildFlyServer.Status.Scaling PodsWildFlyServer.Status.Replicas 字段显示了主动和非活跃 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 状态

下表描述了 scaledown 期间的不同 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. 使用 Heuristic Outcomes 在交易期间缩减

当事务的结果未知时,无法进行自动事务恢复。然后,您必须手动恢复您的事务。

先决条件

  • 您的 pod 的状态一直处于 SCALING_DOWN_RECOVERY_DIRTY 中。

流程

  1. 使用 CLI 访问您的 JBoss EAP 实例。
  2. 解决事务对象存储中的所有 Heuristics 事务记录。如需更多信息,请参阅 JBoss EAP 管理事务中的恢复 Heuristic Outcomes
  3. 从企业 bean 客户端恢复文件夹中删除所有记录。

    1. 从 pod enterprise 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. 配置 transactions 子系统,以使用 JDBC 存储进行事务日志

如果系统不提供文件系统来存储 事务日志,请使用 JBoss EAP S2I 镜像来配置 JDBC 对象存储。

重要

当 JBoss EAP 部署为可引导 JAR 时,S2I 环境变量不可用。在这种情况下,您必须创建一个 Galleon 层或配置 CLI 脚本来进行必要的配置更改。

JDBC 对象存储可使用环境变量 TX_DATABASE_PREFIX_MAPPING 设置。此变量具有与 DB_SERVICE_PREFIX_MAPPING 相同的结构。

前提条件

  • 您已根据环境变量的值创建了数据源。
  • 您保证了一致的数据读写权限在数据库与 JDBC 对象存储通信 的事务管理器 之间存在。如需更多信息,请参阅配置 JDBC 数据源

流程

  • 通过 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 EAP 配置指南中的创建数据源