Neustart von Diensten in Debian Clustern verhindern

Wer vielleicht schon einmal einen Pacemaker-Cluster unter Debian aufgesetzt und dabei Ressourcen definiert hat, für die auch LSB Skripten existieren, kommt sicher früher oder später an einen Punkt, wo unter Clusterkontrolle stehende Dienste durch ein Update aktualisiert werden sollen.

Im Regelfall werden Dienste unter Debian durch das Kommando invoke-rc.d vor der Aktualisierung gestoppt und danach wieder gestartet. In einem Cluster ist dies fatal, da der Cluster einen plötzlich gestoppten Dienst als “ausgefallen” betrachtet und darauf reagiert.

Zwar könnte der gesamte Cluster in den Maintainance-Mode geschaltet werden, aber die Erfahrung zeigt, dass dies gravierende Probleme mit sich bringen kann. Nämlich genau dann, wenn z.B. auch corosync aktualisiert wird. Das Ergebnis ist dann ein Knotenschwank und unter Umständen greift dann auch noch STONITH.

Glücklicherweise bin ich aber auf einen Trick gestoßen, der normalerweise bei LXC-Container angewendet wird: ein Policy-Skript.

Wenn invoke-rc.d ein Polich-Skript vorfindet, wird dieses bei jeder Aktion “start”, “stop” und “restart” aufgerufen und ausgewertet. Und in diesem Skript kann man ganz einfach mittels eines “exit 101” als Ergebnis die auszuführende Aktion unterbinden. Die Dienste lassen sich aber selbstverständlich nach wie vor über “/etc/init.d/dienst Aktion” weiterhin steuern, was im Cluster selbst genau so durchgeführt wird.

Beispiel BIND9, der als Dienst unten auch im Policy-Skript gezeigt wird:


primitive resBIND9 lsb:bind9 \
op monitor interval="30s" timeout="20s"

Erstellen Sie ein Polich-Skript mit dem Namen /usr/sbin/policy-rc.d und fügen beispielhaft folgenden Code ein:

#!/bin/bash

# /usr/sbin/policy-rc.d
# See: /usr/share/doc/sysv-rc/README.policy-rc.d.gz

initscript_ID=$1
actions=$2

services=("corosync" "bind9" "bacula-fd" "mysql" "slapd")

for srv in ${services[@]}; do
  if [ "$initscript_ID" = "$srv" ]; then
    # Forbid stop/restart, or any init action for that matter.
    # 101 - action forbidden by policy
    exit 101
  fi
done

exit 0

# vim: syn=sh

Im Anschluss muss diese Datei unbedingt noch ausführbar gemacht werden, sonst erleben Sie beim ersten Versuch eine negative Überraschung!

Nun werden die in services() gelisteten Dienste vom Neustart verschont und können nach einer Aktualisierung sauber über die Clustersoftware gestoppt und wieder gestartet werden.

Viel Spaß