如何将 IBM MQ 配置为 HA 集群?

How to configure IBM MQ as a HA cluster?

我想创建一个高可用性集群。但是我无法从 IBM 文档中找到任何创建步骤。

我按照 this 指南创建了集群。

两个 QM 都部署了 docker-compose:

version: '3.7'
services:
  london:
    build:
      context: ./config/london
    environment:
      LICENSE: "accept"
      MQ_QMGR_NAME: "QM1"
      MQ_ENABLE_METRICS: "true"
    ports:
      - 9443:9443 # web view
      - 9157:9157 # metrics

  newyork:
    build:
      context: ./config/newyork
    environment:
      LICENSE: "accept"
      MQ_QMGR_NAME: "QM2"
      MQ_ENABLE_METRICS: "true"
    ports:
      - 9553:9443 # web view
      - 9158:9157 # metrics
    depends_on:
      - london

两个图像的 Dockerfile:

FROM ibmcom/mq

COPY init.mqsc /etc/mqm/20-init.mqsc

这里是 london MQ 实例的配置:

* cluster config
ALTER QMGR +
      REPOS(INVENTORY) +
      PSCLUS(ENABLED)

DEFINE LISTENER(LONDON_LS) +
       TRPTYPE(TCP) +
       CONTROL(QMGR)

DEFINE CHANNEL(INVENTORY.LONDON) +
       CHLTYPE(CLUSRCVR) +
       TRPTYPE(TCP) +
       CONNAME('london(1414)') +
       CLUSTER(INVENTORY) +
       DESCR('TCP Cluster-receiver channel for queue manager LONDON')

DEFINE CHANNEL(INVENTORY.NEWYORK) +
       CHLTYPE(CLUSSDR) +
       TRPTYPE(TCP) +
       CONNAME('newyork(1414)') +
       CLUSTER(INVENTORY) +
       DESCR('TCP Cluster-sender channel from LONDON to repository at NEWYORK')

SET CHLAUTH('INVENTORY.LONDON') +
    TYPE(QMGRMAP) +
    QMNAME(QM2) +
    USERSRC(CHANNEL) +
    ADDRESS('*')

这里是 newyork 实例:

* cluster config
ALTER QMGR +
      REPOS(INVENTORY) +
      PSCLUS(ENABLED)

DEFINE LISTENER(NEWYORK_LS) +
       TRPTYPE(TCP) +
       CONTROL(QMGR)

DEFINE CHANNEL(INVENTORY.NEWYORK) +
       CHLTYPE(CLUSRCVR) +
       TRPTYPE(TCP) +
       CONNAME('newyork(1414)') +
       CLUSTER(INVENTORY) +
       DESCR('TCP Cluster-receiver channel for queue manager NEWYORK')

DEFINE CHANNEL(INVENTORY.LONDON) +
       CHLTYPE(CLUSSDR) +
       TRPTYPE(TCP) +
       CONNAME('london(1414)') +
       CLUSTER(INVENTORY) +
       DESCR('TCP Cluster-sender channel from NEWYORK to repository at LONDON')

SET CHLAUTH('INVENTORY.NEWYORK') +
    TYPE (QMGRMAP) +
    QMNAME(QM1) +
    USERSRC(CHANNEL) +
    ADDRESS('*')

我想要一个主题,我的应用程序可以从中 write/read 而不管它们连接到 QM。 这甚至可能吗?如果可以的话,您能否将 MQSC 命令或 link 共享到示例设置中。

MQ 集群是关于队列管理器之间的负载平衡连接。

  • 例如,您可以在 LONDON 和 NEWYORK 上定义一个集群队列,这可以在两个 (hot/hot) 上都被 PUT(ENABLED) 并且集群成员发送到该队列的消息通常是两个实例之间的循环。
  • 如果您希望它成为 hot/warm,那么您将 PUT(DISABLE) 两个实例之一,例如 LONDON,然后您将指示您的应用程序连接并从 NEWYORK 读取,如果 NEWYORK 出现故障,您可以 PUT(ENABLED) LONDON 上的队列,从那一点开始的消息将转到 LONDON,您可以将您的应用程序定向到 LONDON(请注意,位于 NEWYORK 队列上的任何消息仅在 NEWYORK 恢复时可用. MQ 不会将消息复制到两个队列管理器。

与 pub/sub 略有不同,因为集群中的所有队列管理器都知道集群主题,如果集群中任何 QM 上的任何订阅者订阅该主题,代理订阅将由订阅者 QM,如果在任何队列管理器上对该主题进行任何发布,副本将被定向到每个本地订阅者以及任何具有代理订阅的 QM,然后订阅者 QM 会将消息传递给它本地的任何订阅者(因此即使在同一个 QM 上有多个订阅者,也只有一个代理子)。

  • 如果您有非长期订阅者,他们可以在任何 QM 上订阅主题,并接收在订阅创建之后发布的消息,但之前不会。
  • 如果您需要在订阅者未连接时接收消息,您将需要一个持久订阅,并且该订阅将绑定到创建它的特定队列管理器。

您可能想看看 RDQM,它确实提供节点之间的复制,但与容器不兼容。