Benutzer-Werkzeuge

Webseiten-Werkzeuge


pacemaker

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
pacemaker [2015-05-12 12:37:46] – [selbst gebautes OCF-Skript] manfredpacemaker [2016-04-12 22:50:01] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 +====== 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
 +<file>
 +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"
 +</file>
 +
 +  > 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
 +<file bash 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"
 +</file>
 +
 +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
 +<file bash /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
 +
 +#------------------------------------------------------------------------------#
 +</file>
 +
 +----
 +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
 +<file bash /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'
 +
 +#------------------------------------------------------------------------------#
 +</file>
 +
 +=== 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/