keepalived
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| keepalived [2019-01-30 09:22:58] – [Cluster-IP-Management mit KeepaliveD auf einem MySQL-Cluster] manfred | keepalived [2025-07-16 09:23:43] (aktuell) – manfred | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== KeepaliveD ====== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | In diesem Beispiel soll KeepaliveD einen MySQL-/ | ||
| + | Diese Konfiguration wurde auf einem '' | ||
| + | |||
| + | |||
| + | ===== Installation KeepaliveD ===== | ||
| + | |||
| + | > apt install keepalived | ||
| + | |||
| + | |||
| + | ==== Konfiguration ==== | ||
| + | |||
| + | Im nächsten Schritt wird der automatische Start beim Booten aktiviert. | ||
| + | > update-rc.d keepalived defaults | ||
| + | |||
| + | |||
| + | ==== sysctl.conf ==== | ||
| + | |||
| + | Virtuelle IP erlauben | ||
| + | |||
| + | Um zu erlauben, dass IPs auch auf nicht lokale Schnittstellen zugewiesen werden dürfen, ist ein Eintrag in der / | ||
| + | > echo " | ||
| + | > sysctl -p | ||
| + | |||
| + | |||
| + | ==== keepalived.conf ==== | ||
| + | |||
| + | Die zentrale Konfiguration von KeepaliveD unter Linux erfolgt über die Datei ''/ | ||
| + | |||
| + | |||
| + | === Erreichbarkeit / Service prüfen === | ||
| + | |||
| + | Zur Konfiguration sollte man sich zunächst Gedanken machen, wie man Nichterreichbarkeit definiert. | ||
| + | Die einfachste Methode ist hierbei der Ping. \\ | ||
| + | Allerdings kann ein Server durchaus per Ping erreichbar sein, auch wenn der Dienst (MySQL, Apache, Samba, Mail, DNS, Proxy, etc.) nicht reagiert. | ||
| + | |||
| + | Daher hat sich das Prüfen des entsprechenden Dienstes etabliert. | ||
| + | Die Signalnummer 0 von '' | ||
| + | Der erste Teil der Konfigurationsdatei besteht daher aus dem folgenden Block. | ||
| + | < | ||
| + | vrrp_script chk_dienst { | ||
| + | #script " | ||
| + | script " | ||
| + | interval 2 # Alle 2 Sekunden prüfen | ||
| + | weight 2 # 2 Punkte hinzufügen wenn OK | ||
| + | fall 2 | ||
| + | rise 2 | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Eine Zuweisung von Master/ | ||
| + | Hierbei gilt '' | ||
| + | Aus diesem Grund setzen wir '' | ||
| + | |||
| + | Diese Abfrage lässt sich natürlich beliebig anpassen. | ||
| + | So könnte man beispielsweise ein eigenes Bash-Skript für komplexere Abfragen konstruieren. | ||
| + | Wichtig ist hierbei nur der Rückgabewert: | ||
| + | 0 = true - Erreichbar | ||
| + | 1 = false - Nicht erreichbar | ||
| + | |||
| + | |||
| + | === Cluster-IP + Backup-IP === | ||
| + | |||
| + | //Am Beispiel des Zentralisierungs-Clusters.// | ||
| + | |||
| + | <file bash / | ||
| + | #!/bin/bash | ||
| + | # Monitoring information for Check_MK | ||
| + | echo $1 $2 is in $3 state > / | ||
| + | </ | ||
| + | |||
| + | <file bash / | ||
| + | #!/bin/bash | ||
| + | # Monitoring information for Check_MK | ||
| + | echo $1 $2 is in $3 state > / | ||
| + | </ | ||
| + | |||
| + | <file bash / | ||
| + | # http:// | ||
| + | global_defs { | ||
| + | no_email_faults | ||
| + | vrrp_no_swap | ||
| + | } | ||
| + | |||
| + | # Master | ||
| + | vrrp_script chk_dienst_ma { | ||
| + | script "/ | ||
| + | interval 2 | ||
| + | weight 2 | ||
| + | fall 2 | ||
| + | rise 2 | ||
| + | } | ||
| + | |||
| + | vrrp_instance MAIP_3306 { | ||
| + | interface bond0.24 | ||
| + | state BACKUP | ||
| + | virtual_router_id 101 | ||
| + | priority 98 | ||
| + | advert_int 1 | ||
| + | |||
| + | track_script { | ||
| + | chk_dienst_ma | ||
| + | } | ||
| + | |||
| + | authentication { | ||
| + | auth_type PASS | ||
| + | auth_pass geheimes-passwort | ||
| + | } | ||
| + | |||
| + | virtual_ipaddress { | ||
| + | 10.10.2.20 | ||
| + | } | ||
| + | |||
| + | unicast_src_ip 10.10.2.21 | ||
| + | unicast_peer { | ||
| + | # | ||
| + | 10.10.2.22 | ||
| + | 10.10.2.23 | ||
| + | } | ||
| + | notify "/ | ||
| + | } | ||
| + | # | ||
| + | # Backup | ||
| + | vrrp_script chk_dienst_bu { | ||
| + | script "/ | ||
| + | interval 2 | ||
| + | weight 2 | ||
| + | fall 2 | ||
| + | rise 2 | ||
| + | } | ||
| + | |||
| + | vrrp_instance BUIP_3306 { | ||
| + | interface bond0.24 | ||
| + | state BACKUP | ||
| + | virtual_router_id 102 | ||
| + | priority 2 | ||
| + | advert_int 2 | ||
| + | |||
| + | track_script { | ||
| + | chk_dienst_bu | ||
| + | } | ||
| + | |||
| + | authentication { | ||
| + | auth_type PASS | ||
| + | auth_pass geheimes-passwort | ||
| + | } | ||
| + | |||
| + | virtual_ipaddress { | ||
| + | 10.10.2.24 | ||
| + | } | ||
| + | |||
| + | unicast_src_ip 10.10.2.21 | ||
| + | unicast_peer { | ||
| + | # | ||
| + | 10.10.2.22 | ||
| + | 10.10.2.23 | ||
| + | } | ||
| + | notify "/ | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <file bash / | ||
| + | # http:// | ||
| + | global_defs { | ||
| + | no_email_faults | ||
| + | vrrp_no_swap | ||
| + | } | ||
| + | |||
| + | # Master | ||
| + | vrrp_script chk_dienst_ma { | ||
| + | script "/ | ||
| + | interval 2 | ||
| + | weight 2 | ||
| + | fall 2 | ||
| + | rise 2 | ||
| + | } | ||
| + | |||
| + | vrrp_instance MAIP_3306 { | ||
| + | interface bond0.24 | ||
| + | state BACKUP | ||
| + | virtual_router_id 101 | ||
| + | priority 97 | ||
| + | advert_int 1 | ||
| + | |||
| + | track_script { | ||
| + | chk_dienst_ma | ||
| + | } | ||
| + | |||
| + | authentication { | ||
| + | auth_type PASS | ||
| + | auth_pass geheimes-passwort | ||
| + | } | ||
| + | |||
| + | virtual_ipaddress { | ||
| + | 10.10.2.20 | ||
| + | } | ||
| + | |||
| + | unicast_src_ip 10.10.2.22 | ||
| + | unicast_peer { | ||
| + | 10.10.2.21 | ||
| + | #10.10.2.22 | ||
| + | 10.10.2.23 | ||
| + | } | ||
| + | notify "/ | ||
| + | } | ||
| + | # | ||
| + | # Backup | ||
| + | vrrp_script chk_dienst_bu { | ||
| + | script "/ | ||
| + | interval 2 | ||
| + | weight 2 | ||
| + | fall 2 | ||
| + | rise 2 | ||
| + | } | ||
| + | |||
| + | vrrp_instance BUIP_3306 { | ||
| + | interface bond0.24 | ||
| + | state BACKUP | ||
| + | virtual_router_id 102 | ||
| + | priority 3 | ||
| + | advert_int 2 | ||
| + | |||
| + | track_script { | ||
| + | chk_dienst_bu | ||
| + | } | ||
| + | |||
| + | authentication { | ||
| + | auth_type PASS | ||
| + | auth_pass geheimes-passwort | ||
| + | } | ||
| + | |||
| + | virtual_ipaddress { | ||
| + | 10.10.2.24 | ||
| + | } | ||
| + | |||
| + | unicast_src_ip 10.10.2.22 | ||
| + | unicast_peer { | ||
| + | 10.10.2.21 | ||
| + | #10.10.2.22 | ||
| + | 10.10.2.23 | ||
| + | } | ||
| + | notify "/ | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <file bash / | ||
| + | # http:// | ||
| + | global_defs { | ||
| + | no_email_faults | ||
| + | vrrp_no_swap | ||
| + | } | ||
| + | |||
| + | # Master | ||
| + | vrrp_script chk_dienst_ma { | ||
| + | script "/ | ||
| + | interval 2 | ||
| + | weight 2 | ||
| + | fall 2 | ||
| + | rise 2 | ||
| + | } | ||
| + | |||
| + | vrrp_instance MAIP_3306 { | ||
| + | interface bond0.24 | ||
| + | state BACKUP | ||
| + | virtual_router_id 101 | ||
| + | priority 96 | ||
| + | advert_int 1 | ||
| + | |||
| + | track_script { | ||
| + | chk_dienst_ma | ||
| + | } | ||
| + | |||
| + | authentication { | ||
| + | auth_type PASS | ||
| + | auth_pass geheimes-passwort | ||
| + | } | ||
| + | |||
| + | virtual_ipaddress { | ||
| + | 10.10.2.20 | ||
| + | } | ||
| + | |||
| + | unicast_src_ip 10.130.2.23 | ||
| + | unicast_peer { | ||
| + | 10.10.2.21 | ||
| + | 10.10.2.22 | ||
| + | #10.10.2.23 | ||
| + | } | ||
| + | notify "/ | ||
| + | } | ||
| + | # | ||
| + | # Backup | ||
| + | vrrp_script chk_dienst_bu { | ||
| + | script "/ | ||
| + | interval 2 | ||
| + | weight 2 | ||
| + | fall 2 | ||
| + | rise 2 | ||
| + | } | ||
| + | |||
| + | vrrp_instance BUIP_3306 { | ||
| + | interface bond0.24 | ||
| + | state BACKUP | ||
| + | virtual_router_id 102 | ||
| + | priority 4 | ||
| + | advert_int 2 | ||
| + | |||
| + | track_script { | ||
| + | chk_dienst_bu | ||
| + | } | ||
| + | |||
| + | authentication { | ||
| + | auth_type PASS | ||
| + | auth_pass geheimes-passwort | ||
| + | } | ||
| + | |||
| + | virtual_ipaddress { | ||
| + | 10.10.2.24 | ||
| + | } | ||
| + | |||
| + | unicast_src_ip 10.10.2.23 | ||
| + | unicast_peer { | ||
| + | 10.10.2.21 | ||
| + | 10.10.2.22 | ||
| + | #10.10.2.23 | ||
| + | } | ||
| + | notify "/ | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Cluster-IP-Management mit KeepaliveD auf einem MySQL-Cluster ==== | ||
| + | |||
| + | Zum Beispiel (für Galera/ | ||
| + | <file c / | ||
| + | #!/bin/bash | ||
| + | |||
| + | # | ||
| + | # DB-Check | ||
| + | # | ||
| + | # / | ||
| + | # | ||
| + | |||
| + | unset node_response | ||
| + | mysql_host=" | ||
| + | mysql_port=" | ||
| + | mysql_user=" | ||
| + | mysql_pass=" | ||
| + | |||
| + | OPTION="/ | ||
| + | touch ${OPTION} | ||
| + | chmod 0600 ${OPTION} | ||
| + | echo " | ||
| + | [client] | ||
| + | host = localhost | ||
| + | port = ${mysql_port} | ||
| + | user = ${mysql_user} | ||
| + | password = " | ||
| + | " > ${OPTION} | ||
| + | |||
| + | node_response=$(echo "SHOW GLOBAL VARIABLES LIKE ' | ||
| + | wsrep_state=$(echo "SHOW STATUS LIKE ' | ||
| + | rm -f ${OPTION} | ||
| + | |||
| + | echo " | ||
| + | if [ " | ||
| + | then | ||
| + | if [ " | ||
| + | then | ||
| + | # echo " | ||
| + | exit 0; | ||
| + | else | ||
| + | # echo " | ||
| + | exit 1; | ||
| + | fi | ||
| + | else | ||
| + | # echo " | ||
| + | exit 1; | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | Zum Beispiel (für GTID mit Kanal): | ||
| + | <file bash / | ||
| + | #!/bin/bash | ||
| + | |||
| + | # | ||
| + | # | ||
| + | # DB-Bakup-IP-Check | ||
| + | # | ||
| + | # / | ||
| + | # | ||
| + | # | ||
| + | |||
| + | VERSION=" | ||
| + | |||
| + | |||
| + | if [ " | ||
| + | echo "${0} [Hostname] [Port] [User]" | ||
| + | echo "${0} [Hostname] [Port] [User] [Passwort]" | ||
| + | echo "${0} \$(hostname -s) 3306 dbuser geheimespasswort" | ||
| + | exit 10 | ||
| + | else | ||
| + | mysql_host=" | ||
| + | fi | ||
| + | |||
| + | # | ||
| + | |||
| + | # | ||
| + | |||
| + | ROOT_FILE="/ | ||
| + | ROOT_U=" | ||
| + | ROOT_P=" | ||
| + | |||
| + | STECKER="/ | ||
| + | |||
| + | # | ||
| + | |||
| + | # | ||
| + | ### erst muss die Master-IP hoch gefahren sein | ||
| + | |||
| + | ### nur für Backup-IP aktivieren | ||
| + | #sleep 3 | ||
| + | |||
| + | # | ||
| + | ### wenn dieses DBMS nicht läuft, dann darf die IP hier nicht aktiviert werden | ||
| + | |||
| + | AUSGABE=" | ||
| + | |||
| + | ### immer aktiviert | ||
| + | if [ " | ||
| + | echo "DB is not Running" | ||
| + | rm_defaults-file | ||
| + | exit 1 | ||
| + | else | ||
| + | CHANNEL_NAMEN=" | ||
| + | fi | ||
| + | |||
| + | # | ||
| + | ### Kontrolliert, | ||
| + | |||
| + | node_response=" | ||
| + | |||
| + | if [ " | ||
| + | echo " | ||
| + | rm_defaults-file | ||
| + | exit 1; | ||
| + | fi | ||
| + | |||
| + | # | ||
| + | ### jeder Kanal muss separat überprüft werden | ||
| + | ### Fehler sind hier nur relevant, wenn kein Kanal vernünftig läuft | ||
| + | |||
| + | STATUS_GUT=" | ||
| + | do | ||
| + | # | ||
| + | ### Den Status aus diesem Kanal auslesen | ||
| + | |||
| + | SLAVE_STATUS=" | ||
| + | |||
| + | MASTER_HOST=" | ||
| + | if [ " | ||
| + | MASTER_PORT=" | ||
| + | SLAVE_IO_RUNNING=" | ||
| + | SLAVE_SQL_RUNNING=" | ||
| + | SECONDS_BEHIND_MASTER=" | ||
| + | |||
| + | # | ||
| + | ### Kontrolle ob auf den richtigen Port verbunden wird | ||
| + | |||
| + | unset MPORT | ||
| + | if [ " | ||
| + | echo " | ||
| + | MPORT=" | ||
| + | fi | ||
| + | |||
| + | # | ||
| + | ### Kontrolliert, | ||
| + | |||
| + | unset RUNNING | ||
| + | IO_RUNNING=" | ||
| + | if [ " | ||
| + | SQL_RUNNING=" | ||
| + | if [ " | ||
| + | echo " | ||
| + | RUNNING=" | ||
| + | fi | ||
| + | fi | ||
| + | |||
| + | # | ||
| + | #-# Diese Bedingung muss auf dem Backup-Slave nicht zwingend erfüllt sein | ||
| + | ### Kontrolliert, | ||
| + | |||
| + | unset SEKUNDEN | ||
| + | if [ " | ||
| + | echo " | ||
| + | elif [ " | ||
| + | echo " | ||
| + | SEKUNDEN=" | ||
| + | fi | ||
| + | |||
| + | echo " | ||
| + | # | ||
| + | fi | ||
| + | # | ||
| + | done | fgrep "Port Running" | ||
| + | |||
| + | rm_defaults-file | ||
| + | |||
| + | if [ " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | |||
| + | === Auf jeden Datenbank-Knoten muß eine individuelle KeepaliveD-CFG abgelegt werden === | ||
| + | |||
| + | 1. Knoten: | ||
| + | <file c / | ||
| + | vrrp_script chk_dienst { | ||
| + | #script "/ | ||
| + | #script " | ||
| + | script "/ | ||
| + | interval 2 # Alle 2 Sekunden prüfen | ||
| + | weight 2 # 2 Punkte hinzufügen wenn OK | ||
| + | fall 2 | ||
| + | rise 2 | ||
| + | } | ||
| + | |||
| + | vrrp_instance meine_mysql_db { | ||
| + | interface eth0 # Zu überwachendes Interface | ||
| + | state BACKUP | ||
| + | priority 100 | ||
| + | virtual_router_id 123 # ID der Route | ||
| + | virtual_ipaddress { | ||
| + | 10.10.10.10 | ||
| + | } | ||
| + | track_script { | ||
| + | chk_dienst | ||
| + | } | ||
| + | |||
| + | unicast_src_ip 10.10.10.97 | ||
| + | unicast_peer { | ||
| + | 10.10.10.98 | ||
| + | 10.10.10.99 | ||
| + | } | ||
| + | authentication { | ||
| + | auth_type PASS | ||
| + | auth_pass geheim_1234 | ||
| + | } | ||
| + | |||
| + | # for ANY state transition. | ||
| + | # " | ||
| + | # notify_* script(s) and is executed | ||
| + | # with 3 arguments provided by keepalived | ||
| + | # (ie dont include parameters in the notify line). | ||
| + | # arguments | ||
| + | # $1 = " | ||
| + | # $2 = name of group or instance | ||
| + | # $3 = target state of transition | ||
| + | # | ||
| + | notify / | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 2. Knoten: | ||
| + | <file c / | ||
| + | vrrp_script chk_dienst { | ||
| + | #script "/ | ||
| + | #script " | ||
| + | script "/ | ||
| + | interval 2 # Alle 2 Sekunden prüfen | ||
| + | weight 2 # 2 Punkte hinzufügen wenn OK | ||
| + | fall 2 | ||
| + | rise 2 | ||
| + | } | ||
| + | |||
| + | vrrp_instance meine_mysql_db { | ||
| + | interface eth0 # Zu überwachendes Interface | ||
| + | state BACKUP | ||
| + | priority 100 | ||
| + | virtual_router_id 123 # ID der Route | ||
| + | virtual_ipaddress { | ||
| + | 10.10.10.10 | ||
| + | } | ||
| + | track_script { | ||
| + | chk_dienst | ||
| + | } | ||
| + | |||
| + | unicast_src_ip 10.10.10.98 | ||
| + | unicast_peer { | ||
| + | 10.10.10.97 | ||
| + | 10.10.10.99 | ||
| + | } | ||
| + | authentication { | ||
| + | auth_type PASS | ||
| + | auth_pass geheim_1234 | ||
| + | } | ||
| + | |||
| + | # for ANY state transition. | ||
| + | # " | ||
| + | # notify_* script(s) and is executed | ||
| + | # with 3 arguments provided by keepalived | ||
| + | # (ie dont include parameters in the notify line). | ||
| + | # arguments | ||
| + | # $1 = " | ||
| + | # $2 = name of group or instance | ||
| + | # $3 = target state of transition | ||
| + | # | ||
| + | notify / | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 3. Knoten: | ||
| + | <file c / | ||
| + | vrrp_script chk_dienst { | ||
| + | #script "/ | ||
| + | #script " | ||
| + | script "/ | ||
| + | interval 2 # Alle 2 Sekunden prüfen | ||
| + | weight 2 # 2 Punkte hinzufügen wenn OK | ||
| + | fall 2 | ||
| + | rise 2 | ||
| + | } | ||
| + | |||
| + | vrrp_instance meine_mysql_db { | ||
| + | interface eth0 # Zu überwachendes Interface | ||
| + | state BACKUP | ||
| + | priority 100 | ||
| + | virtual_router_id 123 # ID der Route | ||
| + | virtual_ipaddress { | ||
| + | 10.10.10.10 | ||
| + | } | ||
| + | track_script { | ||
| + | chk_dienst | ||
| + | } | ||
| + | |||
| + | unicast_src_ip 10.10.10.99 | ||
| + | unicast_peer { | ||
| + | 10.10.10.97 | ||
| + | 10.10.10.98 | ||
| + | } | ||
| + | authentication { | ||
| + | auth_type PASS | ||
| + | auth_pass geheim_1234 | ||
| + | } | ||
| + | |||
| + | # for ANY state transition. | ||
| + | # " | ||
| + | # notify_* script(s) and is executed | ||
| + | # with 3 arguments provided by keepalived | ||
| + | # (ie dont include parameters in the notify line). | ||
| + | # arguments | ||
| + | # $1 = " | ||
| + | # $2 = name of group or instance | ||
| + | # $3 = target state of transition | ||
| + | # | ||
| + | notify / | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <file bash / | ||
| + | #!/bin/bash | ||
| + | |||
| + | # / | ||
| + | |||
| + | echo $1 $2 is in $3 state > / | ||
| + | </ | ||
| + | |||
| + | > cat / | ||
| + | INSTANCE meine_mysql_db is in MASTER state | ||
| + | |||
| + | > chmod 0640 / | ||
| + | |||
| + | //** Keepalived starten **// | ||
| + | |||
| + | Die Konfiguration ist nun abgeschlossen. | ||
| + | Um Keepalived zu starten und damit auch die virtuelle IP im Netzwerk verfügbar zu machen, | ||
| + | genügt es den Dienst neu zu starten. | ||
| + | > service keepalived restart | ||
| + | > service keepalived status | ||
| + | |||
