====== Pacemaker ======
* [[http://exdc.net/2012/11/02/galera-cluster-mit-ubuntu-12-04-64bit-und-mysql-5-5-teil-3-ip-failover/]]
* [[http://blog.simon-meggle.de/tutorials/]]
> 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: 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
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
#!/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
#!/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/