Inhaltsverzeichnis
Pacemaker
> crm configure property stonith-enabled=false > crm configure property no-quorum-policy=ignore > crm_attribute --type rsc_defaults --attr-name resource-stickiness --attr-value 100 > crm configure edit
node ttvdbgalera01
node ttvdbgalera02
node ttvdbgalera03
primitive res_mysqlIP ocf:heartbeat:mysqlIP \
params ip="192.168.0.110" nic="eth0" \
op start interval="0" timeout="30" \
op stop interval="0" timeout="30" \
op monitor interval="5s"
property $id="cib-bootstrap-options" \
dc-version="1.0.8-042548a451fce8400660f6031f4da6f0223dd5dd" \
cluster-infrastructure="openais" \
expected-quorum-votes="3" \
stonith-enabled="false" \
no-quorum-policy="ignore" \
last-lrm-refresh="1390404695"
rsc_defaults $id="rsc_defaults-options" \
resource-stickiness="100"
> ip addr
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 00:03:d1:07:11:cb brd ff:ff:ff:ff:ff:ff
inet 192.168.0.244/24 brd 192.168.0.255 scope global eth0
inet 192.168.0.110/32 brd 192.168.0.255 scope global secondary eth0:0
...
Abhängigkeiten der Ressourcen formulieren
> crm configure show
- crm configure show
node knoten1 \ attributes standby="off" node knoten2 \ attributes standby="off" node knoten3 \ attributes standby="off" primitive Bind ocf:heartbeat:named \ params monitor_request="test.domain.de" monitor_response="10.11.12.13" \ op monitor interval="5s" timeout="10s" \ meta target-role="Started" primitive CLIP ocf:heartbeat:IPaddr2 \ params ip="10.11.12.100" nic="eth1" cidr_netmask="24" \ meta target-role="Started" colocation col_ClusterIP_Bind inf: Bind CLIP order ord_ClusterIP_Bind inf: Bind CLIP property $id="cib-bootstrap-options" \ dc-version="1.1.7-9971ebba4494012a93c03b40a2c58ec0eb60f50c" \ cluster-infrastructure="openais" \ expected-quorum-votes="3" \ stonith-enabled="false" \ no-quorum-policy="ignore" \ last-lrm-refresh="1430397317"
Hier wird die Ressource "Bind" in der Form geprüft, dass einfach eine DNS-Abfrage für den FQDN "test.domain.de" ausgeführt, und als Antwort wird die IP "10.11.12.13" erwartet.
Wenn dies gegeben ist, dann gild die Ressource "Bind" als "lebendig". Und es wird die IP-Adresse "10.11.12.100" auf dem Netzwerkgerät "eth1" hochgefahren.
selbst gebautes OCF-Skript
Wenn man die Konfiguration von Pacemaker nicht im Griff hat, kann man sich auch ein eigenes OCF-Skript schreiben, in dem die Abhängigkeiten der Ressourcen auf Skript-Ebene formuliert werden.
In diesem Beispiel werden die Ressourcen IP-Adresse und MySQL-DB in Abhängigkeit zueinander gesetzt. Es darf die IP nur dann hochgefahren werden, wenn die DB läuft.
Prototyp:
> vi /usr/lib/ocf/resource.d/heartbeat/mysqlIP
- /usr/lib/ocf/resource.d/heartbeat/mysqlIP
#!/bin/bash VERSION="v2014012200" #------------------------------------------------------------------------------# ### Parameterauswertung if [ -z "${2}" ] ; then PARAMETER_1="" PARAMETER_2="${1}" else PARAMETER_1="${1}" PARAMETER_2="${2}" fi #------------------------------------------------------------------------------# ### Variablen export OCF_ROOT=/usr/lib/ocf/ ZUGANGSDATEN="$(awk '/^user|^password/{print $1,$NF}' /root/.my.cnf)" BENUTZER="$(echo "${ZUGANGSDATEN}" | awk '/^user /{print $NF}')" PASSWORT="$(echo "${ZUGANGSDATEN}" | awk '/^password /{print $NF}')" DATUMZEIT="$(date +'%Y%m%d%H%M%S')" TESTDB="Test${DATUMZEIT}" #------------------------------------------------------------------------------# ### Funktion MySQLABFRAGE() { unset DBSTATUS #mysqlshow -t -u"${BENUTZER}" -p"${PASSWORT}" echo "CREATE DATABASE ${TESTDB};" | mysql -u"${BENUTZER}" -p"${PASSWORT}" > /dev/null 2>&1 #mysqlshow -t -u"${BENUTZER}" -p"${PASSWORT}" mysqlshow -t -u"${BENUTZER}" -p"${PASSWORT}" ${TESTDB} > /dev/null 2>&1 && export DBSTATUS=gestartet || export DBSTATUS=gestoppt echo "DROP DATABASE ${TESTDB};" | mysql -u"${BENUTZER}" -p"${PASSWORT}" > /dev/null 2>&1 #mysqlshow -t -u"${BENUTZER}" -p"${PASSWORT}" } #------------------------------------------------------------------------------# ### Abarbeitung case "${PARAMETER_2}" in [Ss][Tt][Aa][Rr][Tt]) MySQLABFRAGE STATUSSTATUS="Nein" STATUSMONITOR="Nein" ;; [Ss][Tt][Aa][Tt][Uu][Ss]) MySQLABFRAGE STATUSSTATUS="Ja" STATUSMONITOR="Nein" ;; [Mm][Oo][Nn][Ii][Tt][Oo][Rr]) MySQLABFRAGE STATUSSTATUS="Nein" STATUSMONITOR="Ja" ;; *) DBSTATUS="gestartet" STATUSSTATUS="Nein" STATUSMONITOR="Nein" ;; esac if [ "${STATUSSTATUS}" == "Ja" -a "${DBSTATUS}" == "gestartet" ] ; then echo "running" elif [ "${STATUSSTATUS}" == "Ja" -a "${DBSTATUS}" == "gestoppt" ] ; then echo "stopped" fi if [ "${DBSTATUS}" == "gestartet" ] ; then #echo /usr/lib/ocf/resource.d/heartbeat/IPaddr2 ${PARAMETER_1} ${PARAMETER_2} /usr/lib/ocf/resource.d/heartbeat/IPaddr2 ${PARAMETER_1} ${PARAMETER_2} | sed 's/IPaddr2/mysqlIP/g' else unset DBSTATUS if [ "${STATUSMONITOR}" == "Ja" ] ; then exit 7; else exit 3; fi fi unset DBSTATUS #------------------------------------------------------------------------------#
Dieses OCF-Skript (mysqlIP) kann das IPaddr2 eins-zu-eins ersetzen.
Es überprüft erst die Erreichbarkeit des DBMS und wenn es nicht antwortet, wird die Maschine angehalten.
> vi /usr/lib/ocf/resource.d/heartbeat/mysqlIP
- /usr/lib/ocf/resource.d/heartbeat/mysqlIP
#!/bin/bash VERSION="v2014012300" #------------------------------------------------------------------------------# ### Variablen export OCF_ROOT=/usr/lib/ocf/ ZUGANGSDATEN="$(awk '/^user|^password/{print $1,$NF}' /root/.my.cnf)" BENUTZER="$(echo "${ZUGANGSDATEN}" | awk '/^user /{print $NF}')" PASSWORT="$(echo "${ZUGANGSDATEN}" | awk '/^password /{print $NF}')" DATUMZEIT="$(date +'%Y%m%d%H%M%S')" TESTDB="Test${DATUMZEIT}" #------------------------------------------------------------------------------# ### MySQL-Kontrolle unset DBSTATUS echo "CREATE DATABASE ${TESTDB};" | mysql -u"${BENUTZER}" -p"${PASSWORT}" > /dev/null 2>&1 mysqlshow -t -u"${BENUTZER}" -p"${PASSWORT}" ${TESTDB} > /dev/null 2>&1 && export DBSTATUS=gestartet || export DBSTATUS=gestoppt echo "DROP DATABASE ${TESTDB};" | mysql -u"${BENUTZER}" -p"${PASSWORT}" > /dev/null 2>&1 if [ "${DBSTATUS}" == "gestoppt" ] ; then KONFIGURATION="$(crm configure show | sed 's#[ \t]$# #;s#.*#&|#;s#[\][|]##g' | tr -s '\n' ' ' | tr -s '|' '\n' | grep -F mysqlIP | tr -s ' ' '\n' | grep -E 'ip=|nic=')" IPA="$(echo "${KONFIGURATION}" | awk '/ip=/{sub("="," ");print $NF}' | tr -d '"')" NIC="$(echo "${KONFIGURATION}" | awk '/nic=/{sub("="," ");print $NF}' | tr -d '"')" IP_ADDR_AUSGABE="$(ip addr | grep "${IPA}")" if [ -n "${IP_ADDR_AUSGABE}" ] ; then unset DBSTATUS IPNETZ="$(echo "${IP_ADDR_AUSGABE}" | awk '{print $2}')" halt -p fi fi #------------------------------------------------------------------------------# ### IP-Management . /usr/lib/ocf/resource.d/heartbeat/.ocf-shellfuncs #echo /usr/lib/ocf/resource.d/heartbeat/IPaddr2 ${@} /usr/lib/ocf/resource.d/heartbeat/IPaddr2 ${@} | sed 's/IPaddr2/mysqlIP/g' #------------------------------------------------------------------------------#
bei Problemen mit Pacemaker
hilft oft das:
> crm configure show > Pacemaker.xml > service corosync stop > rm -fr /var/lib/heartbeat/crm/ /var/lib/heartbeat/pengine/ > aptitude reinstall pacemaker > service corosync start > crm configure load update Pacemaker.xml
Monitoring
# crm_mon
============ Last updated: Wed Jul 18 17:19:38 2012 Stack: openais Current DC: knoten01 - partition with quorum Version: 1.0.8-042548a451fce8400660f6031f4da6f0223dd5dd 2 Nodes configured, 2 expected votes 1 Resources configured. ============
Online: [ knoten01 knoten02 ]
Ipadresse (ocf::heartbeat:IPaddr2): Started knoten01
Schwenk
zum schwenken muss man den aktiveb Knoten in den StandBy-Mode schicken:
# crm crm(live)# crm(live)# configure edit
node knoten01 attributes standby="on"
node knoten02
primitive Ipadresse ocf:heartbeat:IPaddr2 \
params ip="192.168.0.110" nic="eth0" cidr_netmask="24" iflabel="0"
property $id="cib-bootstrap-options" \
dc-version="1.0.8-042548a451fce8400660f6031f4da6f0223dd5dd" \
cluster-infrastructure="openais" \
stonith-enabled="false" \
expected-quorum-votes="2"
Debugging PACEMAKER Skripte
> export OCF_ROOT=/usr/lib/ocf/
