7.10. 用于 Safe 事务恢复的 EAP Operator


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

注意

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

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

警告

如果您决定删除整个 wildflyserver 定义(oc delete wildflyserver <deployment_name>),则不会启动事务恢复过程,无论未完成的交易都会终止 pod。此操作结果的未完成工作可能会阻止您稍后启动的数据更改。涉及与此 wildflyserver 交易企业 Bean 远程调用的其他 JBoss EAP 实例的数据更改也可能被阻止。

当扩展过程开始 pod 状态(oc get pod <pod_name>)仍然标记为 Running,因为 pod 必须完成所有未完成事务,包括针对它的远程企业 beans 调用。

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

7.10.1. Stable Network Host Names 的 StatefulSets

管理 wildflyserver 的 EAP 操作器将创建 StatefulSet 作为管理 JBoss EAP pod 的底层对象。

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

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 实例的状态。如需有关扩展过程中不同 pod 状态的更多信息,请参阅 Pod 在缩减期间的状态

流程

  • 观察缩减过程的状态:

    oc describe wildflyserver <name>
    Copy to Clipboard Toggle word wrap
    • WildFlyServer.Status.Scalingdown PodWildFlyServer.Status.Replicas 字段显示活跃和非主动 Pod 的整体状态。
    • Scalingdown Pods 字段显示所有未完成事务完成后将终止的 pod 数量。
    • WildFlyServer.Status.Replicas 字段显示当前运行的容器集数量。
    • WildFlyServer.Spec.Replicas 字段显示处于 ACTIVE 状态的 pod 数量。
    • 如果没有缩放过程中的 pod,则 WildFlyServer.Status.Replicas 和 WildFlyServer.Spec.Replicas 字段中的 pod 数量是相等的。

7.10.2.1. 横向扩展期间的 Pod 状态

下表描述了扩展过程中的不同 pod 状态:

Expand
表 7.1. Pod 状态描述
Pod 状态描述

ACTIVE

pod 处于活跃状态,并处理请求。

SCALING_DOWN_RECOVERY_INVESTIGATION

pod 即将缩减。纵向缩减流程正在调查 JBoss EAP 中的事务状态。

SCALING_DOWN_RECOVERY_DIRTY

JBoss EAP 包含一些不完整的交易。在清理完 pod 前,pod 不会被终止。事务恢复过程在 JBoss EAP 定期运行,它会等待事务完成

SCALING_DOWN_CLEAN

pod 通过缩减事务处理来处理,标记为 干净,可从集群中删除。

7.10.3. 使用 Heuristic Outcomes 在事务期间缩减

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

先决条件

  • pod 的状态停留在 SCALING_DOWN_RECOVERY_DIRTY

流程

  1. 使用 CLI 访问您的 JBoss EAP 实例。
  2. 解决事务对象存储中的所有启发式事务记录。如需更多信息,请参阅 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
      Copy to Clipboard Toggle word wrap
  4. pod 的状态变为 SCALING_DOWN_CLEAN,pod 将被终止。

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

重要

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

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

前提条件

流程

  • 通过 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'
    Copy to Clipboard Toggle word wrap

验证

  • 您可以通过检查 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>
    Copy to Clipboard Toggle word wrap
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部