4.23. 为高可用性配置 leader-follower 代理部署


leader-follower 配置在单独的部署中有一个代理。每个部署中的代理必须配置为使用相同的 JDBC 数据库来持久保留消息。与获取 JDBC 锁定的代理实现高可用性,此代理授予对数据库的独占访问权限。获取 JDBC 锁定的代理会成为为客户端请求提供服务的领导代理。未能获取 JDBC 锁定的代理会成为后续。后续者不断尝试获取 JDBC 锁定,如果成功,则立即成为领导机来为客户端提供服务。

Leader-follower 部署提供了一种加快修复时间(MTTR)的时间,以便从节点故障中恢复,而不是 Openshift 为带有一个或多个代理的单一部署中恢复。在 leader-follower 部署中,代理可以在单独的集群中,以防止集群故障。这些集群可以位于不同的数据中心,以便代理服务对数据中心中断具有弹性。

前提条件

您有一个容器镜像,其中包含您要用于 AMQ Broker 的 JDBC 数据库的 JAR 文件。有关创建容器镜像的详情,请参考 Openshift 文档中的创建镜像。https://docs.openshift.com/container-platform/latest/openshift_images/create-images.html在每个代理的配置中,您可以指定 init 容器,将容器镜像中的 JAR 文件复制到运行时可用于代理的位置。

  1. 配置两个 ActiveMQArtemis 自定义资源实例,以创建单独的代理部署。

    在每个自定义资源中,指定一个唯一名称,并确保 clusterpersistenceEnabled 属性设置为 false。将 size 属性设置为 1,以便在每个部署中创建一个代理。例如:

    apiVersion: broker.amq.io/v1beta1
    kind: ActiveMQArtemis
    metadata:
      name: peer-broker-a
    spec:
      deploymentPlan:
        size: 1
        clustered: false
        persistenceEnabled: false
    Copy to Clipboard Toggle word wrap
    apiVersion: broker.amq.io/v1beta1
    kind: ActiveMQArtemis
    metadata:
      name: peer-broker-b
    spec:
      deploymentPlan:
        size: 1
        clustered: false
        persistenceEnabled: false
    Copy to Clipboard Toggle word wrap
    注意

    如果您要在同一 Openshift 集群中配置两个代理部署,请确保在集群的独立节点上置备代理 pod,因此两个代理都不受节点故障的影响。有关控制节点上 pod 放置的更多信息,请参阅 第 4.17 节 “控制 OpenShift Container Platform 节点上的代理 pod 放置”

  2. 为每个代理配置添加一个存活度探测。

    如果没有配置存活度探测,则会启用默认探测来检查代理的健康状况。默认探测检查 AMQ 管理控制台是否可访问。在 leader-follower 配置中,AMQ Management Console 在任何给定时间无法在代理中访问,这会导致存活度探测在该代理上失败。每次存活度探测失败时,它会重启代理,该代理会将代理置于持久重启循环中。因此,后续代理进入 CrashLoopBackOff 状态,如果当前领导失败则不可用。

    要防止默认存活度探测运行,您必须配置一个存活度探测,该探测可以在代理是领导或后续时成功运行。在以下示例中,存活度探测会检查运行代理的命令是否已执行,这通过存在 cli.lock 文件来指示。

    spec:
      ..
      livenessProbe:
        exec:
          command:
          - test
          - -f
          - /home/jboss/amq-broker/lock/cli.lock
      ..
    Copy to Clipboard Toggle word wrap

    有关配置存活度探测的更多信息,请参阅 第 4.15.2 节 “配置存活度和就绪度探测”

  3. 在每个代理配置中,使用 brokerProperties 属性启用 JDBC 数据库持久性。例如:

    spec:
      ..
      brokerProperties:
      - storeConfiguration=DATABASE
      - storeConfiguration.jdbcDriverClassName=<class name>
      - storeConfiguration.jdbcConnectionUrl=jdbc:<Database URL>
      - HAPolicyConfiguration=SHARED_STORE_PRIMARY
      - storeConfiguration.jdbcLockRenewPeriodMillis=2000
      - storeConfiguration.jdbcLockExpirationMillis=6000
    Copy to Clipboard Toggle word wrap

    有关启用 JDBC 数据库持久性的更多信息,请参阅 第 4.5.2 节 “配置数据库持久性”

  4. 在每个代理配置中,配置代理以加载连接到 JDBC 数据库所需的 JAR 文件。

    • 使用 resourceTemplates 属性自定义每个代理的 StatefulSet 资源。在自定义中,使用 patch 属性指定一个 init 容器,该容器将 JAR 文件从您准备的自定义容器镜像复制到代理 Pod。
    • 使用 env 属性创建 ARTEMIS_EXTRA_LIBS 环境变量,以扩展代理的 Java 类路径,使其包含将 JDBC 数据库复制到的目录。通过扩展 Java 类路径,代理可以在运行时从 pod 上的指定目录中加载 JAR 文件。

      spec:
        ..
        env:
        - name: ARTEMIS_EXTRA_LIBS
          value: '/amq/init/config/extra-libs'
        resourceTemplates:
        - selector:
            kind: StatefulSet
          patch:
            kind: StatefulSet
            spec:
              template:
                spec:
                  initContainers:
                  - name: jdbc-driver-init
                    image: <custom container image with JAR>
                    volumeMounts:
                    - name: amq-cfg-dir
                      mountPath: /amq/init/config
                    command:
                    - "bash"
                    - "-c"
                    - "mkdir -p /amq/init/config/extra-libs && cp <__JAR file_> /amq/init/config/extra-libs"
      Copy to Clipboard Toggle word wrap

      有关自定义 Operator 创建的 Openshift 资源的更多信息,请参阅 第 4.21 节 “自定义 Operator 创建的 Openshift 资源”

  5. 保存每个自定义资源。

    Example

    以下示例显示了使用 Oracle 数据库的 leader-follower 代理部署的完整配置。

    apiVersion: broker.amq.io/v1beta1
    kind: ActiveMQArtemis
    metadata:
      name: peer-broker-a
    spec:
      deploymentPlan:
        size: 1
        clustered: false
        persistenceEnabled: false
        livenessProbe:
          exec:
            command:
            - test
            - -f
            - /home/jboss/amq-broker/lock/cli.lock
      env:
        - name: ARTEMIS_EXTRA_LIBS
          value: '/amq/init/config/extra-libs'
      brokerProperties:
        - criticalAnalyser=false
        - storeConfiguration=DATABASE
        - storeConfiguration.jdbcDriverClassName=oracle.jdbc.OracleDriver
        - storeConfiguration.jdbcConnectionUrl=jdbc:<Database URL>
        - storeConfiguration.jdbcLockRenewPeriodMillis=2000
        - storeConfiguration.jdbcLockExpirationMillis=6000
        - HAPolicyConfiguration=SHARED_STORE_PRIMARY
      acceptors:
      - name: ext-acceptor
        protocols: CORE
        port: 61626
        expose: true
        sslEnabled: true
        sslSecret: ext-acceptor-ssl-secret
      console:
        expose: true
      resourceTemplates:
      - selector:
          kind: StatefulSet
        patch:
          kind: StatefulSet
          spec:
            template:
              spec:
                initContainers:
                - name: oracle-database-jdbc-driver-init
                  image: <custom container image with JAR>
                  volumeMounts:
                  - name: amq-cfg-dir
                    mountPath: /amq/init/config
                  command:
                  - "bash"
                  - "-c"
                  - "mkdir -p /amq/init/config/extra-libs && cp <JAR file> /amq/init/config/extra-libs"
    Copy to Clipboard Toggle word wrap
    apiVersion: broker.amq.io/v1beta1
    kind: ActiveMQArtemis
    metadata:
      name: peer-broker-b
    spec:
      deploymentPlan:
        size: 1
        clustered: false
        persistenceEnabled: false
        livenessProbe:
          exec:
            command:
            - test
            - -f
            - /home/jboss/amq-broker/lock/cli.lock
      env:
        - name: ARTEMIS_EXTRA_LIBS
          value: '/amq/init/config/extra-libs'
      brokerProperties:
        - criticalAnalyser=false
        - storeConfiguration=DATABASE
        - storeConfiguration.jdbcDriverClassName=oracle.jdbc.OracleDriver
        - storeConfiguration.jdbcConnectionUrl=jdbc:<Database URL>
        - storeConfiguration.jdbcLockRenewPeriodMillis=2000
        - storeConfiguration.jdbcLockExpirationMillis=6000
        - HAPolicyConfiguration=SHARED_STORE_PRIMARY
      acceptors:
      - name: ext-acceptor
        protocols: CORE
        port: 61626
        expose: true
        sslEnabled: true
        sslSecret: ext-acceptor-ssl-secret
      console:
        expose: true
      resourceTemplates:
      - selector:
          kind: StatefulSet
        patch:
          kind: StatefulSet
          spec:
            template:
              spec:
                initContainers:
                - name: oracle-database-jdbc-driver-init
                  image: <custom container image with JAR>
                  volumeMounts:
                  - name: amq-cfg-dir
                    mountPath: /amq/init/config
                  command:
                  - "bash"
                  - "-c"
                  - "mkdir -p /amq/init/config/extra-libs && cp <JAR file> /amq/init/config/extra-libs"
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat