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 Pods 和 WildFlyServer.Status.Replicas 字段显示了主动和非活跃 pod 的整体状态。
- Scalingdown Pods 字段显示所有未完成事务完成后要被终止的 pod 数量。
- WildFlyServer.Status.Replicas 字段显示当前运行的 pod 数量。
- WildFlyServer.Spec.Replicas 字段显示处于 ACTIVE 状态的 pod 数量。
- 如果没有 pod 缩减,则处理 WildFlyServer.Status.Replicas 和 WildFlyServer.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 由事务缩减处理处理,并标记为要从集群中删除的 |
7.10.3. 使用 Heuristic Outcomes 在交易期间缩减
当事务的结果未知时,无法进行自动事务恢复。然后,您必须手动恢复您的事务。
先决条件
-
您的 pod 的状态一直处于
SCALING_DOWN_RECOVERY_DIRTY
中。
流程
- 使用 CLI 访问您的 JBoss EAP 实例。
- 解决事务对象存储中的所有 Heuristics 事务记录。如需更多信息,请参阅 JBoss EAP 管理事务中的恢复 Heuristic Outcomes。
从企业 bean 客户端恢复文件夹中删除所有记录。
从 pod enterprise bean 客户端恢复目录中删除所有文件:
$JBOSS_HOME/standalone/data/ejb-xa-recovery oc exec <podname> rm -rf $JBOSS_HOME/standalone/data/ejb-xa-recovery
-
您的 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 配置指南中的创建数据源。