![[ MQ 9.4.4 Oct 2025]](ng944.gif)
Monitoraggio, riavvio e chiusura delle istanze di queue manager
È necessario implementare un metodo per garantire che le istanze del gestore di code nella configurazione Native HA siano ancora in esecuzione e riavviarle se necessario.
Se un'istanza di replica in un gruppo Native HA si guasta inaspettatamente, a condizione che la maggior parte delle istanze sia ancora disponibile, non vi è alcuna perdita di disponibilità di un gestore di code. È tuttavia importante rilevare e riavviare l'istanza il più rapidamente possibile. Questo argomento fornisce un esempio di come si possa implementare un controllo di "liveness" usando il demone systemd . Quando si utilizza questo metodo, è necessario utilizzare anche systemd per terminare il gestore di code.
Il seguente script python, mqmonitor.py, è fornito in forma sorgente in /opt/mqm/samp. Lo script può avviare, monitorare, arrestare e riavviare un'istanza di queue manager:
#
# <copyright
# notice="lm-source-program"
# pids="5724-H72"
# years="2026"
# crc="0" >
# Licensed Materials - Property of IBM
#
# 5724-H72
#
# (C) Copyright IBM Corp. 2026 All Rights Reserved.
#
# US Government Users Restricted Rights - Use, duplication or
# disclosure restricted by GSA ADP Schedule Contract with
# IBM Corp.
# </copyright>
#
# A sample python script to start, monitor and stop a named queue manager.
#
import argparse
import subprocess
import time
def qmstart(qmgr, mqm_path):
strmqm = subprocess.run([f"{mqm_path}/bin/strmqm", "-x", qmgr])
# Allow multi-instance standby and Native HA replica instances also count as success
if strmqm.returncode in [0, 30, 94]:
print(f"Started {qmgr}")
else:
print(f"Failed to start {qmgr}, rc: {strmqm.returncode}")
def qmstop(qmgr, mqm_path):
try:
subprocess.run([f"{mqm_path}/bin/endmqm", "-tp", "29", "-w", qmgr], check=True)
print(f"Stopped {qmgr}")
except subprocess.CalledProcessError as e:
print(f"Failed to stop {qmgr}: {e}")
def qmhealthy(qmgr, mqm_path):
try:
output = subprocess.check_output([f"{mqm_path}/bin/dspmq", "-n", "-m", qmgr], universal_newlines=True)
active_states = ["STATUS(RUNNING)", "STATUS(STARTING)", "STATUS(RUNNING AS STANDBY)",
"STATUS(NEGOTIATING)", "STATUS(REPLICA)", "STATUS(RECOVERY GROUP LEADER)"]
if any(x in output for x in active_states):
return True
else:
return False
except subprocess.CalledProcessError:
return False
if __name__ == "__main__":
MQ_INSTALLATION_PATH="/opt/mqm"
parser = argparse.ArgumentParser(description="MQ Monitor Service")
parser.add_argument("--start", action="store_true", help="Start monitoring queue manager")
parser.add_argument("--stop", action="store_true", help="Stop queue manager and end monitoring")
parser.add_argument("qmgr", help="Name of queue manager to monitor")
parser.add_argument("--mqm-path", default=MQ_INSTALLATION_PATH, help="MQ installation path (default " + MQ_INSTALLATION_PATH + ")")
parser.add_argument("--health-interval", type=int, default=10, help="Healthcheck interval in seconds (default 10)")
args = parser.parse_args()
if args.start:
while True:
if not qmhealthy(args.qmgr, args.mqm_path):
qmstart(args.qmgr, args.mqm_path)
time.sleep(args.health_interval)
elif args.stop:
qmstop(args.qmgr, args.mqm_path)
else:
print("Usage: python3 mqmonitor.py --[start|stop] <qmgr> [--mqm-path <path>] [--health-interval <seconds>]")
Lo script python mqmonitor.py può essere combinato con il seguente modello di definizione del servizio di sistema mqmonitor@.service, che è anche incluso in /opt/mqm/samp. La copia o il collegamento simbolico della definizione nella directory /etc/systemd/service consente di avviare il servizio dal sistema. È necessario creare il collegamento simbolico come utente ROOT.
#
# <copyright
# notice="lm-source-program"
# pids="5724-H72"
# years="2026"
# crc="0" >
# Licensed Materials - Property of IBM
#
# 5724-H72
#
# (C) Copyright IBM Corp. 2026 All Rights Reserved.
#
# US Government Users Restricted Rights - Use, duplication or
# disclosure restricted by GSA ADP Schedule Contract with
# IBM Corp.
# </copyright>
#
# Copy or symlink this configuration file to /etc/systemd/service and use
#
# sudo systemctl enable mqmonitor@qmgrname
#
# to configure a queue manager to start at system boot.
#
[Unit]
Description=MQ %I Queue Manager Monitor Service
[Service]
User=mqm
Group=mqm
Type=simple
StandardOutput=journal
StandardError=journal
SyslogIdentifier=mqmonitor
Environment=MQ_INSTALLATION_PATH=/opt/mqm
ExecStart=/usr/bin/python3 ${MQ_INSTALLATION_PATH}/samp/mqmonitor.py --mqm-path ${MQ_INSTALLATION_PATH} --start %I --health-interval 10
ExecStop=/usr/bin/python3 ${MQ_INSTALLATION_PATH}/samp/mqmonitor.py --mqm-path ${MQ_INSTALLATION_PATH} --stop %I
TimeoutStopSec=30
KillMode=mixed
Restart=always
[Install]
WantedBy=multi-user.target
/opt/mqm e non si desidera modificare il modello o lo script di monitoraggio, è possibile collegare simbolicamente il servizio di esempio utilizzando il seguente comando:ln -s /opt/mqm/samp/mqmonitor@.service /etc/systemd/system È necessario creare il collegamento simbolico come utente ROOT.sudo systemctl enable mqmonitor@MYQMGR
sudo systemctl start mqmonitor@MYQMGRQuando viene eseguito sotto il controllo di systemd , lo script python si sveglia ogni dieci secondi ed emette un comando dspmq per verificare che l'istanza del gestore di code sia in uno stato utile. Se lo stato non è accettabile, lo script python tenta di riavviare il gestore delle code.
Chiusura di un gestore di code Native HA
endmqm per il gestore di code comporta il riavvio del gestore di code da parte dello script python. Se invece si desidera arrestare il gestore di code, utilizzare il comando systemctl stop:sudo systemctl stop mqmonitor@MYQMGRUsare systemctl con le opzioni start o restart per avviare il gestore di code.