第 7 章 高级教程
7.1. 工作流示例:在扩展集群时自动恢复功能 复制链接链接已复制到粘贴板!
此功能仅作为技术预览提供。不支持在生产环境中使用,它可能会受到未来的显著更改。如需有关技术预览功能支持范围的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。
本教程仅适用于 OpenShift 3,也适用于不使用 EAP 操作器来恢复事务。
本教程演示了在缩减集群时 JBoss EAP OpenShift 镜像的自动事务恢复功能。本教程使用 jta-crash-rec-eap 快速启动示例和 eap73-tx-recovery-s2i 应用模板显示 OpenShift pod 上发布的 XA 事务如何在集群缩减内终止时,由专用迁移容器集恢复。JDK 11 镜像的等效应用模板为 eap73-openjdk11-tx-recovery-s2i。
本教程使用 amq-broker-72-openshift:1.1 镜像流来提供符合 JMS 的消息代理。设置初始代理 Pod 后,您可以使用 OpenShift Container Platform 功能快速部署快速入门。
作为使用快速启动的先决条件,您必须从 AMQ Long Term Support(LTS)镜像创建一个镜像流,并将镜像流命名为 amq-broker-72-openshift:1.1。您可以通过从 红帽生态系统目录 下载 amq7/amq-broker-lts-rhel7:7.4 容器镜像来访问 LTS 镜像。有关安装 AMQ Broker 的更多信息 ,请参阅部署基本代理。
jta-crash-rec-eap7 快速启动使用 JBoss EAP 随附的 H2 数据库。它是轻型关系示例数据源,仅用于示例。它不可靠或扩展,不受支持,不应在生产环境中使用。
7.1.1. 准备部署 复制链接链接已复制到粘贴板!
-
使用
oc login 命令登录您的 OpenShift 实例。 创建一个新项目。
oc new-project eap-tx-demo
$ oc new-project eap-tx-demoCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将 view 角色添加到
default服务帐户,用于运行底层容器集。这使得服务帐户能够查看eap-tx-demo命名空间中的所有资源,这是管理集群所必需的。oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default
$ oc policy add-role-to-user view system:serviceaccount:$(oc project -q):defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow 若要使自动化事务恢复发挥作用,JBoss EAP 应用必须使用
ReadWriteMany持久卷。调配
eap73-tx-recovery-s2i应用模板预期的持久卷,以存放${APPLICATION_NAME}-eap-claim 持久卷 声明的数据。本例使用通过以下定义的 NFS 方法置备的持久性卷对象:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为您的环境更新上述定义中
的路径和服务器字段,并使用以下命令置备持久性卷:oc create -f txpv.yaml
$ oc create -f txpv.yaml persistentvolume "txpv" createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc get pv
$ oc get pv NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM STORAGECLASS REASON AGE txpv 1Gi RWX Retain Available 26sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要在使用 NFS 方法为
eap73-tx-recovery-s2i应用模板调配持久卷对象时,请确保已导出具有足够权限的挂载点。在从中导出挂载点的主机上执行以下操作:chmod -R 777 /mnt/mountpoint
# chmod -R 777 /mnt/mountpointCopy to Clipboard Copied! Toggle word wrap Toggle overflow cat /etc/exports /mnt/mountpoint *(rw,sync,anonuid=185,anongid=185)
# cat /etc/exports /mnt/mountpoint *(rw,sync,anonuid=185,anongid=185)Copy to Clipboard Copied! Toggle word wrap Toggle overflow exportfs -va
# exportfs -va exporting *:/mnt/mountpointCopy to Clipboard Copied! Toggle word wrap Toggle overflow setsebool -P virt_use_nfs 1
# setsebool -P virt_use_nfs 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据您的环境替换上面的
/mnt/mountpoint路径。
7.1.2. Deployment 复制链接链接已复制到粘贴板!
使用
eap73快速启动。指定以下内容:-tx-recovery-s2i 应用模板部署 jta-crash-rec-eap7示例:
eap73-tx-recovery-s2i应用模板(JDK 8)oc new-app --template=eap73-tx-recovery-s2i \ --name=eap-app
$ oc new-app --template=eap73-tx-recovery-s2i \ --name=eap-appCopy to Clipboard Copied! Toggle word wrap Toggle overflow 示例:
eap73-openjdk11-tx-recovery-s2i应用模板(JDK 11)oc new-app --template=eap73-openjdk11-tx-recovery-s2i \ --name=eap-app
$ oc new-app --template=eap73-openjdk11-tx-recovery-s2i \ --name=eap-appCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
等待构建完成。您可以使用
oc logs -f bc/eap-app命令来查看构建的状态。 使用
JAVA_OPTS_APPEND 和环境变量定义修改JBOSS_MODULES_SYSTEM_PKGS_APPENDeap-app部署配置。oc get dc
$ oc get dc NAME REVISION DESIRED CURRENT TRIGGERED BY eap-app 1 1 1 config,image(eap-app:latest) eap-app-amq 1 1 1 config,image(amq-broker-72-openshift:1.1) eap-app-migration 1 1 1 config,image(eap-app:latest)Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc set env dc/eap-app \ -e JBOSS_MODULES_SYSTEM_PKGS_APPEND="org.jboss.byteman" \ -e JAVA_OPTS_APPEND="-javaagent:/tmp/src/extensions/byteman/byteman.jar=script:/tmp/src/src/main/scripts/xa.btm"
$ oc set env dc/eap-app \ -e JBOSS_MODULES_SYSTEM_PKGS_APPEND="org.jboss.byteman" \ -e JAVA_OPTS_APPEND="-javaagent:/tmp/src/extensions/byteman/byteman.jar=script:/tmp/src/src/main/scripts/xa.btm" deploymentconfig "eap-app" updatedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此设置将通知 Byteman 跟踪和监控工具以以下方式修改 XA 事务处理:
- 第一次事务总是被允许成功。
- 当 XA 资源执行第二个事务的阶段 2 时,特定 pod 的 JVM 进程将停止。
7.1.3. 使用 JTA 清理恢复应用程序 复制链接链接已复制到粘贴板!
列出当前命名空间中正在运行的 pod:
oc get pods | grep Running
$ oc get pods | grep Running NAME READY STATUS RESTARTS AGE eap-app-2-r00gm 1/1 Running 0 1m eap-app-amq-1-mws7x 1/1 Running 0 2m eap-app-migration-1-lvfdt 1/1 Running 0 2mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 签发新的 XA 事务。
- 打开浏览器并导航到 启动应用 。
-
在 Key 字段中输入
Mercedes,在 Value 字段中输入Benz。单击 提交 按钮。 - 等待片刻,然后单击 Refresh Table 链接。
注意包含
Mercedes条目的表行如何通过JMS 更新。如果尚未更新,请多次单击 Refresh Table 链接。或者,您可以检查eap-app-2-r00gmpod 的日志,以验证事务是否已正确处理:oc logs eap-app-2-r00gm | grep 'updated'
$ oc logs eap-app-2-r00gm | grep 'updated' INFO [org.jboss.as.quickstarts.xa.DbUpdaterMDB] (Thread-0 (ActiveMQ-client-global-threads-1566836606)) JTA Crash Record Quickstart: key value pair updated via JMS.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
使用浏览器( http://eap-app-eap-tx-demo.openshift.example.com/jboss-jta-crash-rec )发出第二个 XA 事务。
-
在
Key字段中输入 Sign,再将Rover放入 Value 字段。单击 提交 按钮。 - 等待片刻,然后单击 Refresh Table 链接。
-
注意在未
更新通过条目的方式。… 后缀的情况下添加 lintRover
-
在
缩减群集。
oc scale --replicas=0 dc/eap-app
$ oc scale --replicas=0 dc/eap-app deploymentconfig "eap-app" scaledCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意
eap-app-2-r00gm容器集如何调度终止。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
观察迁移 pod 的日志,并注意如何执行事务恢复。等待恢复完成:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 纵向扩展群集。
oc scale --replicas=1 dc/eap-app
$ oc scale --replicas=1 dc/eap-app deploymentconfig "eap-app" scaledCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 使用浏览器返回 http://eap-app-eap-tx-demo.openshift.example.com/jboss-jta-crash-rec
注意表中含有两个事务的条目。它类似于以下输出:
Expand 表 7.1. 示例:数据库表内容 数据库表内容 键
值
Mercedes
通过 JMS 更新 Benz.
Logress
Rover 通过 JMS 更新.
上表中的内容表明,虽然集群在第二个 XA 事务有机会完成前缩减,但迁移 pod 执行了事务恢复,事务已成功完成。