Benutzer-Werkzeuge

Webseiten-Werkzeuge


pacemaker

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/
/home/http/wiki/data/pages/pacemaker.txt · Zuletzt geändert: von 127.0.0.1