![[OpenShift Container Platform]](ngocp.gif)
![[Kubernetes]](ngkube.gif)
![[IBM MQ Advanced]](ngadv.gif)
示例:使用 IBM MQ Operator 部署简单的本地 HA CRR 配置
本示例使用简单的本地 HA 跨区域复制 (CRR) 配置,通过 IBM® MQ Operator 将队列管理器部署到 OpenShift® Container Platform。
开始之前
要完成此示例,必须首先完成以下步骤:
- 在命令行上登录正在使用的 OpenShift Container Platform (OCP) 群集。
- 为此示例创建两个 OCP 项目/命名空间。 示例将提及伦敦和罗马网站。 这些指的是伦敦和罗马在一个群集中的两个命名空间,或者是每个站点在每个群集中的一个命名空间。
- 确保在群集中安装了 IBM MQ Operator 3.5.0 或更高版本,并在命名空间中可用。
- 确保已安装 OpenSSL 命令行工具。
- 通过创建拉取机密任务来完成准备使用 Kubernetes。
- 阅读 " 使用 IBM MQ 操作符部署简单队列管理器" ,以便熟悉 IBM MQ 操作符的使用。
关于本任务
本地 HA CRR 配置定义了两个本地 HA 组,它们共同组成一个高可用性队列管理器。 这些组通常部署在不同地点的两个 OCP 集群中,但本示例允许您根据需要将这两个组部署到同一个集群中。 有关本地 HA CRR 的概述,请参阅本地 HA 跨区域复制。
为简单起见,本例使用单个证书来保护所有队列管理器复制流量,该证书名为 nhacrr-qm-replication。
要了解如何在 Native HA CRR 中使用证书,以及如何使用不同证书确保组和实例流量的安全,请参阅示例:使用 Native HA CRR 的多个 TLS 证书。
本例提供自定义资源 YAML,用于定义两个提供跨区域复制的本地 HA 组。
过程
- 创建用于队列管理器复制流量的证书。
使用以下命令创建私钥,并用它为内部证书颁发机构颁发自签名证书。 然后为队列管理器创建私钥和证书,并与内部证书颁发机构签署:
openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -out nhacrr-ca.key openssl req -x509 -new -nodes -key "nhacrr-ca.key" -sha512 -days 30 -subj "/CN=nhacrr-selfsigned-ca" -out nhacrr-ca.crt openssl req -new -nodes -out nhacrr-qm-replication.csr -newkey rsa:4096 -keyout nhacrr-qm-replication.key -subj "/CN=nhacrr-qm-replication" openssl x509 -req -in nhacrr-qm-replication.csr -CA nhacrr-ca.crt -CAkey nhacrr-ca.key -CAcreateserial -out nhacrr-qm-replication.crt -days 7 -sha512有关这些命令的更多信息,请参阅使用 OpenSSL 创建自签名 PKI。
- 创建两个 Kubernetes 保密文件,其中包含队列管理器密钥和证书。 在罗马和伦敦站点上创建名为 nhacrr-qm-replication 的秘密,用于存储队列管理器实例的密钥和证书。
使用以下命令创建秘密。 在运行该命令前,先切换到每个命名空间(先是罗马,然后是伦敦)。
kubectl create secret generic nhacrr-qm-replication --type="kubernetes.io/tls" --from-file=tls.key=nhacrr-qm-replication.key --from-file=tls.crt=nhacrr-qm-replication.crt --from-file=nhacrr-ca.crt - 按照使用 OpenSSL 创建自签名 PKI 中的描述,为队列管理器流量创建一对证书。 在罗马和伦敦站点上创建密文(即图中名为 mq-channel 和 client-app 的证书)。
- 为罗马和伦敦创建一个包含 MQSC 命令和 INI 文件的配置地图。 创建 ConfigMap 资源,其中包含 MQSC 命令,用于创建新的持久消息队列和 SVRCONN 通道,并添加允许访问通道的通道验证记录。 在 Rome 网站上,在 OCP 网络控制台输入以下 YAML,选择 ConfigMaps ,然后创建 ConfigMap, 或使用 oc apply 命令。 在伦敦站点重复上述步骤:
apiVersion: v1 kind: ConfigMap metadata: name: nhacrr-configmap data: nhacrr.mqsc: | DEFINE CHANNEL('MTLS.SVRCONN') CHLTYPE(SVRCONN) SSLCAUTH(REQUIRED) SSLCIPH('ANY_TLS13_OR_HIGHER') REPLACE SET CHLAUTH('MTLS.SVRCONN') TYPE(SSLPEERMAP) SSLPEER('CN=*') USERSRC(NOACCESS) ACTION(REPLACE) SET CHLAUTH('MTLS.SVRCONN') TYPE(SSLPEERMAP) SSLPEER('CN=example-app1') USERSRC(MAP) MCAUSER('app1') ACTION(REPLACE) SET AUTHREC PRINCIPAL('app1') OBJTYPE(QMGR) AUTHADD(CONNECT,INQ) DEFINE QLOCAL('EXAMPLE.QUEUE') DEFPSIST(YES) REPLACE SET AUTHREC PROFILE('EXAMPLE.QUEUE') PRINCIPAL('app1') OBJTYPE(QUEUE) AUTHADD(BROWSE,PUT,GET,INQ) nhacrr.ini: | Service: Name=AuthorizationService EntryPoints=14 SecurityPolicy=UserExternalMQSC 定义了一个名为 MTLS.SVRCONN 的通道和一个名为 EXAMPLE.QUEUE 的队列。 通道被配置为只允许提交 CN 为 example-app1 的证书(如步骤 3 中创建的证书)的客户端访问。
- 部署本地 HA 恢复组。 在 Rome 网站上创建一个新的恢复组。 确保处于 rome 命名空间,然后在 OCP 网络控制台输入以下 YAML,创建 QueueManager, 或使用 oc apply 命令。 检查是否指定了正确的许可证,并通过将
false更改为true来接受许可证。注意: 必须在实时组和恢复组中使用相同的队列管理器名称。 默认情况下,如果不指定.spec.queuemanager.name,则默认为.metadata.name。 您可以使用以下方法之一实现名称匹配:- 在每个群集中为队列管理器资源命名相同的名称(即
.metadata.name匹配),并且不要覆盖名称 - 在
.metadata.name中单独命名队列管理器,并用.spec.queuemanager.name覆盖该名称,以便两个站点的名称一致。
在本例中,使用
.metadata.name将队列管理器名称设置为exampleqm。apiVersion: mq.ibm.com/v1beta1 kind: QueueManager metadata: name: exampleqm labels: role: Recovery spec: license: accept: false license: L-NUUP-23NH8Y use: Production queueManager: name: EXAMPLEQM availability: type: NativeHA tls: secretName: nhacrr-qm-replication nativeHAGroups: local: name: "rome" role: "Recovery" mqsc: - configMap: name: nhacrr-configmap items: - nhacrr.mqsc ini: - configMap: name: nhacrr-configmap items: - nhacrr.ini storage: queueManager: type: persistent-claim version: 9.4.2.0-r1 pki: keys: - name: default secret: secretName: example-qm-tls items: - tls.key - tls.crt - ca.crt - 在每个群集中为队列管理器资源命名相同的名称(即
- 验证恢复组是否已正确部署:
- 发出
oc get qmgr exampleqm命令显示队列管理器资源,等待队列管理器运行。 您将看到以下信息:NAME PHASE exampleqm Running - 队列管理器运行后,使用
oc get pods命令检查 pod 的状态。 一个 pod 应处于就绪状态:NAME READY STATUS RESTARTS AGE exampleqm-ibm-mq-0 1/1 Running 0 2m45s exampleqm-ibm-mq-1 0/1 Running 0 2m45s exampleqm-ibm-mq-2 0/1 Running 0 2m45s - 使用
oc exec -t <leader-pod> -- dspmq -o nativeha -g查看恢复组的状态,其中<leader-pod>是就绪 1/1 pod 的名称(示例中为 exampleqm-ibm-mq-0 )。QMNAME(EXAMPLEQM) ROLE(Leader) INSTANCE(exampleqm-ibm-mq-0) INSYNC(yes) QUORUM(1/3) GRPLSN() GRPNAME(rome) GRPROLE(Recovery) GRPNAME(rome) GRPROLE(Recovery) GRPADDR(Unknown) GRPVER(9.4.2.0) GRSTATUS(Waiting for connection) RCOVLSN() RCOVTIME() BACKLOG(Unknown) INSYNC(Unknown) SYNCTIME() ALTDATE(2025-04-25) ALTTIME(13.48.15)这一地位的关键部分是
Role(Leader)QUORUM(1/3)- 在实时组和恢复组连接之前,该值保持为 1/3GRSTATUS(Waiting for connection)- 在 Live 群组连接时更新
- 发出
- 部署本地 HA Live 组。 现场小组部署在伦敦现场:要在伦敦站点创建新的实时群组,请确保处于正确的命名空间,然后在 OCP 网络控制台或使用命令行输入以下 YAML。 检查是否指定了正确的许可证,并通过将 false 更改为 true 来接受许可证。
更新 YAML 中指定实时组用于连接恢复组的地址(示例中为"<rome group hostname>:443 ")。 用 Rome 网站上 exampleqm-ibm-mq-nhacrr 路由的 host 属性替换它。 要检索该属性,请确保您在 Rome 网站上,并使用以下命令检索 nhacrr 路由主机名:apiVersion: mq.ibm.com/v1beta1 kind: QueueManager metadata: name: exampleqm labels: role: Live spec: license: accept: false license: L-NUUP-23NH8Y use: Production queueManager: name: EXAMPLEQM availability: type: NativeHA tls: secretName: nhacrr-qm-replication nativeHAGroups: local: name: "london" role: "Live" remotes: - name: "rome" addresses: - "<rome group hostname>:443" mqsc: - configMap: name: nhacrr-configmap items: - nhacrr.mqsc ini: - configMap: name: nhacrr-configmap items: - nhacrr.ini storage: queueManager: type: persistent-claim version: 9.4.2.0-r1 pki: keys: - name: default secret: secretName: example-qm-tls items: - tls.key - tls.crt - ca.crtoc get route exampleqm-ibm-mq-nhacrr --template="{{.spec.host}}"注:部署 CRR 组时创建了两条路由,一条以
qm结尾,另一条以nhacrr结尾。qm路由用于向队列管理器发送信息,nhacrr路由用于组与组之间的通信。 始终将nhacrr路由的主机地址添加为 YAML 中组的远程地址。 - 验证实时组和跨区复制。 重复步骤 6 中的操作,但这次是针对伦敦组。
- 发出
oc get qmgr exampleqm命令显示队列管理器资源,等待队列管理器运行。 您将看到以下信息:NAME PHASE exampleqm Running - 队列管理器运行后,使用
oc get pods命令检查 pod 的状态。 一个 pod 应处于就绪状态:NAME READY STATUS RESTARTS AGE exampleqm-ibm-mq-0 1/1 Running 0 2m45s exampleqm-ibm-mq-1 0/1 Running 0 2m45s exampleqm-ibm-mq-2 0/1 Running 0 2m45s - 使用
oc exec -t <active-pod> -- dspmq -o nativeha -g查看 Live 组的状态,其中<active-pod>是就绪 1/1 pod 的名称(示例中为 exampleqm-ibm-mq-0 )。QMNAME(EXAMPLEQM) ROLE(Active) INSTANCE(exampleqm-ibm-mq-0) INSYNC(yes) QUORUM(3/3) GRPLSN(<0:0:87:58322>) GRPNAME(london) GRPROLE(Live) GRPNAME(london) GRPROLE(Live) GRPADDR(Unknown) GRPVER(9.4.2.0) GRSTATUS(Normal) RCOVLSN(<0:0:87:58322>) RCOVTIME(2025-05-16T14:27:09.051799Z) INITLSN(<0:0:9:4696>) INITTIME(2025-05-12T16:58:13.582274Z) LIVETIME(2025-05-12T16:58:16.319844Z) ALTDATE(2025-05-16) ALTTIME(14.27.10) GRPNAME(rome) GRPROLE(Recovery) GRPADDR(exampleqm-ibm-mq-nhacrr-<namespace>.apps.<cluster>) GRPVER(9.4.2.0) CONNGRP(yes) GRSTATUS(Normal) RCOVLSN(<0:0:87:58322>) RCOVTIME(2025-05-16T14:27:09.051799Z) BACKLOG(0) INSYNC(yes) SYNCTIME(2025-05-16T14:28:38.084565Z) ALTDATE(2025-05-16) ALTTIME(14.28.31)这一地位的关键部分是
Role(Active)QUORUM(3/3)- 直播小组的法定人数已满GRSTATUS(Normal)
- 在 Rome 网站上使用
oc exec -t <leader-pod> -- dspmq -o nativeha -g命令,再次检查恢复组的状态。
请注意,QMNAME(EXAMPLEQM) ROLE(Leader) INSTANCE(exampleqm-ibm-mq-0) INSYNC(yes) QUORUM(3/3) GRPLSN(<0:0:87:58322>) GRPNAME(rome) GRPROLE(Recovery) GRPNAME(rome) GRPROLE(Recovery) GRPADDR(exampleqm-ibm-mq-nhacrr-<namespace>.apps.<cluster>) GRPVER(9.4.3.0) GRSTATUS(Normal) RCOVLSN(<0:0:87:58322>) RCOVTIME(2025-05-16T14:27:09.051799Z) BACKLOG(0) INSYNC(yes) SYNCTIME(2025-05-16T14:30:40.134627Z) ALTDATE(2025-05-16) ALTTIME(14.27.17) GRPNAME(london) GRPROLE(Live) GRPADDR(Unknown) GRPVER(9.4.3.0) CONNGRP(yes) GRSTATUS(Normal) RCOVLSN(<0:0:87:58322>) RCOVTIME(2025-05-16T14:27:09.051799Z) INITLSN(<0:0:9:4696>) INITTIME(2025-05-12T16:58:13.582274Z) LIVETIME(2025-05-12T16:58:16.319844Z) ALTDATE(2025-05-16) ALTTIME(14.30.41)QUORUM(3/3)和GRSTATUS(Normal)字段已更新。
- 发出
- 测试与队列管理器的连接。 要确认队列管理器已配置且可用,请按照 " 测试从笔记本电脑到队列管理器的 TLS 互连 "中的步骤操作,确保队列管理器主机名(在步骤 2 中确定)是伦敦站点路由的主机名。
- 将远程地址添加到本地 HA 恢复组。 当 Rome 成为实时群组时,它需要知道 London 的远程地址,以便作为恢复群组连接到 London。 要添加此功能,请更新罗马站点的
spec.queueManager.availability.nativeHAGroups,在本地协议下方添加以下内容:remotes: - name: "london" addresses: - "<london group hostname>:443"将地址替换为伦敦站点exampleqm-ibm-mq-nhacrr路由的主机属性。 确保您位于伦敦站点,并使用以下命令获取 nhacrr 路由的主机名:
更新完成后,等待 pod 重新启动、运行,并等待一个 pod 成为准备就绪的 1/1 pod。oc get route exampleqm-ibm-mq-nhacrr --template="{{.spec.host}}" - 将 Rome 网站主机名添加到 ccdt.json 文件。 切换后,罗马成为实时站点,客户需要连接到罗马的群组。 将 Rome 的主机名添加到 ccdt.json 文件可方便重新连接。
确保你在 Rome 网站上,并使用以下命令获取
qm路由的主机名:oc get route exampleqm-ibm-mq-qm --template="{{.spec.host}}"注意: 有两条路由,在这种情况下,应使用报文流量的路由。 您应将qm路由的主机地址添加到 ccdt.json 文件中。在ccdt.json文件中,在连接列表中添加第二个主机名和端口对,这样连接列表就会变成这样:"connection": [ { "host": "<hostname from London qm route>", "port": 443 }, { "host": "<hostname from Rome qm route>", "port": 443 } ], - 向队列中添加一些持续信息。 ConfigMap 中指定的 mqsc 文件中定义的队列具有
DEFPSIST(YES)属性,因此放入队列的所有报文都将是持久的,并复制到恢复组。 使用以下命令将信息放入队列:/opt/mqm/samp/bin/amqsputc EXAMPLE.QUEUE EXAMPLEQM如果与队列管理器的连接成功,则输出以下响应:target queue is EXAMPLE.QUEUE输入一些文字,然后每次都按回车键 ,即可将多条信息放入队列。 按两次回车键完成。
- 执行从伦敦的实时组到罗马的恢复组的托管切换,以证明本地 HA - CRR 设置是正确的。 请按照 " 在本地 HA CRR 配置上完成计划的切换 "中的说明进行操作。 在更新 "实时 "组和 "恢复 "组的角色时,您可能会发现在 YAML 中更新
metadata.labels.role以反映您的更改非常有用,但这对于切换来说并非必要。 完成切换后,您可以在罗马检索新实时群组中的信息。有关故障切换和切换的更多信息,请参阅本地 HA CRR 切换和故障切换。
- 运行以下命令,检索切换前发送的信息:
/opt/mqm/samp/bin/amqsgetc EXAMPLE.QUEUE EXAMPLEQM您在步骤 11 中添加的信息可用,并将输出。 几秒钟后,命令退出。
后续操作
维护完成后,可以通过重复步骤 12 和 13 中的过程切换回原来的实时组。
您还可以按照在本机 HA CRR 配置上完成计划外故障转移中的说明尝试计划外故障转移。
要进一步了解如何使用不同证书保护 CRR 配置的不同部分,请参阅示例:使用 Native HA CRR 的多个 TLS 证书。