====== 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/