8.15.2.3. 流程
以下流程只详细描述了数据源的手动交易恢复过程。
- 使用数据库供应商工具列出内部分支的 XID(事务分支标识符)。需要列出 由 pod 上运行或已缩减的 pod 上运行的任何部署使用的所有数据源 的 XID。有关使用的数据库产品,请参阅供应商文档。
对于每个这样的 XID,确定哪个 pod 创建了事务,并检查该 pod 是否仍然在运行。
- 如果正在运行,则让该分支单独保留。
如果 pod 没有运行,假设它已从集群中移除,您必须应用此处所述的手动解析流程。查看失败 pod 使用的事务日志存储,以查看是否有对应的事务日志:
- 如果有日志,则使用供应商工具手动提交 XID。
- 如果没有日志,请假定它是一个孤立分支,并使用供应商工具回滚 XID。
此过程的其余部分详细说明了如何执行这些步骤。
8.15.2.3.1. 解决 In-doubt 分支
首先,查找部署使用的所有资源。
建议您使用 JBoss EAP 管理 CLI 执行此操作。尽管这些资源应该在 JBoss EAP standalone-openshift.xml
配置文件中定义,但也可以使用其他方式供应用服务器内的事务子系统使用。例如,这可以通过部署中的文件来实现,或者在运行时使用管理 CLI 动态完成。
- 在失败的 pod 群集中运行 JBoss EAP 实例的 pod 上打开一个终端。如果没有这样的 pod,请向上扩展为一个 pod。
-
使用
/opt/eap/bin/add-user.sh
脚本创建管理用户。 -
使用
/opt/eap/bin/jboss-cli.sh
脚本登录管理 CLI。 列出服务器上配置的数据源。这些可能包含doubt 事务分支。
/subsystem=datasources:read-resource { "outcome" => "success", "result" => { "data-source" => { "ExampleDS" => undefined, ... }, ... }
拥有列表后,查找每个数据源的连接 URL。例如:
/subsystem=datasources/data-source=ExampleDS:read-attribute(name=connection-url) { "outcome" => "success", "result" => "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE", "response-headers" => {"process-state" => "restart-required"} }
连接到每个数据源并列出任何 in-doubt 事务分支。
注意存储 in-doubt 分支的表名称会因数据源供应商而异。
JBoss EAP 具有默认的 SQL 查询工具(H2),可用于检查每个数据库。例如:
java -cp /opt/eap/modules/system/layers/base/com/h2database/h2/main/h2-1.3.173.jar \ -url "jdbc:postgresql://localhost:5432/postgres" \ -user sa \ -password sa \ -sql "select gid from pg_prepared_xacts;"
或者,您可以使用资源的原生工具。例如,对于名为
sampledb
的 PostGreSQL 数据源,您可以使用 OpenShift 客户端工具远程登录到 pod 并查询 in-doubt 事务表:$ oc rsh postgresql-2-vwf9n # rsh to the named pod sh-4.2$ psql sampledb psql (9.5.7) Type "help" for help. sampledb=# select gid from pg_prepared_xacts; 131077_AAAAAAAAAAAAAP//rBEAB440GK1aJ72oAAAAGHAtanRhLWNyYXNoLXJlYy0zLXAyY2N3_AAAAAAAAAAAAAP//rBEAB440GK1aJ72oAAAAGgAAAAEAAAAA