第 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. 准备部署

  1. 使用 oc login 命令登录 您的 OpenShift 实例。
  2. 创建一个新项目。

    $ oc new-project eap-tx-demo
  3. 将 view 角色添加到 default 服务帐户,用于运行底层容器集。这使得服务帐户能够查看 eap-tx-demo 命名空间中的所有资源,这是管理集群所必需的。

    $ oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default
  4. 若要使自动化事务恢复发挥作用,JBoss EAP 应用必须使用 ReadWriteMany 持久卷

    调配 eap73-tx-recovery-s2i 应用模板预期的持久卷,以存放 ${APPLICATION_NAME}-eap-claim 持久卷 声明 的数据。

    本例使用通过以下定义的 NFS 方法置备的持久性卷对象:

    $ cat txpv.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: txpv
    spec:
      capacity:
        storage: 1Gi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      nfs:
        path: /mnt/mountpoint
        server: 192.168.100.175
  5. 为您的环境更新上述定义中 的路径 和服务器 字段,并使用以下命令置备持久性卷:

    $ oc create -f txpv.yaml
    persistentvolume "txpv" created
    $ oc get pv
    NAME      CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
    txpv      1Gi        RWX           Retain         Available                                      26s
    重要

    在使用 NFS 方法为 eap73-tx-recovery-s2i 应用模板调配持久卷对象时,请确保已导出具有足够权限的挂载点。在从中导出挂载点的主机上执行以下操作:

    # chmod -R 777 /mnt/mountpoint
    # cat /etc/exports
    /mnt/mountpoint *(rw,sync,anonuid=185,anongid=185)
    # exportfs -va
    exporting *:/mnt/mountpoint
    # setsebool -P virt_use_nfs 1

    根据您的环境替换上面的 /mnt/mountpoint 路径。

7.1.2. Deployment

  1. 使用 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

    示例: eap73-openjdk11-tx-recovery-s2i 应用模板(JDK 11)

    $ oc new-app --template=eap73-openjdk11-tx-recovery-s2i \
    --name=eap-app

  2. 等待构建完成。您可以使用 oc logs -f bc/eap-app 命令来查看构建的状态。
  3. 使用 JAVA_OPTS_APPEND 和 JBOSS_MODULES_ SYSTEM_PKGS_APPEND 环境变量定义修改 eap-app 部署配置。

    $ 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)
    $ 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" updated

    此设置将通知 Byteman 跟踪和监控工具以以下方式修改 XA 事务处理:

    • 第一次事务总是被允许成功。
    • 当 XA 资源执行第二个事务的阶段 2 时,特定 pod 的 JVM 进程将停止。

7.1.3. 使用 JTA 清理恢复应用程序

  1. 列出当前命名空间中正在运行的 pod:

    $ 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          2m
  2. 签发新的 XA 事务。

    1. 打开浏览器并导航到 启动应用
    2. Key 字段中输入 Mercedes,在 Value 字段中输入 Benz。单击 提交 按钮。
    3. 等待片刻,然后单击 Refresh Table 链接。
    4. 注意包含 Mercedes 条目的表行如何通过 JMS 更新。如果尚未更新,请多次单击 Refresh Table 链接。或者,您可以检查 eap-app-2-r00gm pod 的日志,以验证事务是否已正确处理:

      $ 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.
  3. 使用浏览器( http://eap-app-eap-tx-demo.openshift.example.com/jboss-jta-crash-rec )发出第二个 XA 事务。

    1. Key 字段中输入 Sign,再将 Rover 放入 Value 字段。单击 提交 按钮。
    2. 等待片刻,然后单击 Refresh Table 链接。
    3. 注意在未 更新通过 …​ 后缀的情况下添加 lint Rover 条目的方式。
  4. 缩减群集。

    $ oc scale --replicas=0 dc/eap-app
    deploymentconfig "eap-app" scaled
    1. 注意 eap-app-2-r00gm 容器集如何调度终止。

      $ oc get pods
      NAME                        READY     STATUS        RESTARTS   AGE
      eap-app-1-build             0/1       Completed     0          4m
      eap-app-2-r00gm             1/1       Terminating   0          2m
      eap-app-amq-1-mws7x         1/1       Running       0          3m
      eap-app-migration-1-lvfdt   1/1       Running       0          3m
  5. 观察迁移 pod 的日志,并注意如何执行事务恢复。等待恢复完成:

    $ oc logs -f eap-app-migration-1-lvfdt
    Finished Migration Check cycle, pausing for 30 seconds before resuming
    ...
    Finished, recovery terminated successfully
    Migration terminated with status 0 (T)
    Releasing lock: (/opt/eap/standalone/partitioned_data/split-1)
    Finished Migration Check cycle, pausing for 30 seconds before resuming
    ...
  6. 纵向扩展群集。

    $ oc scale --replicas=1 dc/eap-app
    deploymentconfig "eap-app" scaled
  7. 使用浏览器返回 http://eap-app-eap-tx-demo.openshift.example.com/jboss-jta-crash-rec
  8. 注意表中含有两个事务的条目。它类似于以下输出:

    表 7.1. 示例:数据库表内容

    数据库表内容 

    Mercedes

    通过 JMS 更新 Benz.

    Logress

    Rover 通过 JMS 更新.

    上表中的内容表明,虽然集群在第二个 XA 事务有机会完成前缩减,但迁移 pod 执行了事务恢复,事务已成功完成。