High-Availability Galera-Cluster mit HAProxy und Keepalived¶
| Stand: 04/2025 |
|---|
| Verwendete Software - Ubuntu 24.04 LTS - HAProxy 2.8.5 - Keepalived v2.2.8 |
| Weitere Dokumentationen: - Galera-Cluster mit MariaDB |
Wichtig!
Diese Dokumenation setzt einen korrekt eingerichteten und stabil laufenden MariaDB Galera-Cluster voraus. Eine detaillierte Anleitung zur Installation und Grundkonfiguration des Clusters finden Sie unter: Galera-Cluster mit MariaDB
Vorwort¶
Ziel dieser Dokumentation ist die Einrichtung eines hochverfügbaren Galera-Datenbankclusters unter Ubuntu 24.04, der durch den Einsatz von HAProxy und Keepalived eine unterbrechungsfreie Erreichbarkeit der Datenbank über eine virtuelle IP-Adresse (VIP) gewährleistet.
Der Zugriff auf den Cluster erfolgt dabei ausschließlich über diese virtuelle IP, die im Hintergrund stets auf den aktuell aktiven Node zeigt. Keepalived übernimmt die Verwaltung dieser Floating-IP mittels VRRP (Virtual Router Redundancy Protocol) und sorgt dafür, dass bei Ausfall eines Nodes automatisch ein anderer die IP übernimmt. HAProxy fungiert als intelligenter Loadbalancer und verteilt eingehende SQL-Anfragen transparent auf die Galera-Knoten. Dabei prüft er kontinuierlich die Erreichbarkeit der Datenbank-Instanzen und leitet Anfragen nur an verfügbare Nodes weiter.
Diese Architektur stellt sicher, dass Datenbankverbindungen für Clients stets verfügbar bleiben, selbst wenn einzelne Cluster-Knoten ausfallen. Damit wird ein wichtiger Grundstein für ausfallsichere und skalierbare Systeme im Produktionsbetrieb gelegt.
graph LR
A["Client"]
B["VIP (192.0.2.100)"]
C["HAProxy"]
D1["Galera Node01"]
D2["Galera Node02"]
D3["Galera Node03"]
A --> B --> C --> D1 & D2 & D3
Es sind Grundkenntnisse im Umgang mit Linux erforderlich, da die Vorgehensweise, wie sie hier beschrieben ist, in manchen Teilen abweichen kann. Kein System ist wie das Andere. Die Dokumentation wurde sorgfältig von mir geprüft. Dennoch kann ich keinerlei Haftung für Schäden an Ihrem System oder eine Gewährleistung übernehmen. Bitte verwenden Sie diese Dokumentation auf eigene Gefahr.
Was muss ich in der Konfiguration anpassen?¶
Einige Parameter müssen auf Ihre Umgebung angepasst werden. Im Verlauf dieser Dokumentation müssen Sie nur die Parameter anpassen, die in der nachfolgenden Tabelle aufgelistet sind. Sie können also ganz einfach durch die Funktion "Suchen und Ersetzen" (STRG + H), die Konfigurationsdateien auf Ihre Umgebung anpassen. Das Gleiche gilt für auszuführende Kommandos.
Folgende Parameter werden verwendet:
| Wert | Hinweis | |
|---|---|---|
| HAProxy: | ||
| IPv4-Adresse | 192.0.2.100 | Ersetzen Sie diesen Wert durch Ihre HAProxy-IP-Adresse. |
| Node01: | ||
| Hostname | galera-node01.example.tld | Ersetzen Sie diesen Wert durch den FQDN Ihres Servers. |
| IPv4-Adresse | 192.0.2.101 | Ersetzen Sie diesen Wert durch die IP-Adresse Ihres Servers. |
| Domain | example.tld | Ersetzen Sie diesen Wert durch Ihre Domain. |
| Node02: | ||
| Hostname | galera-node02.example.tld | Ersetzen Sie diesen Wert durch den FQDN Ihres Servers. |
| IPv4-Adresse | 192.0.2.102 | Ersetzen Sie diesen Wert durch die IP-Adresse Ihres Servers. |
| Domain | example.tld | Ersetzen Sie diesen Wert durch Ihre Domain. |
| Node03: | ||
| Hostname | galera-node03.example.tld | Ersetzen Sie diesen Wert durch den FQDN Ihres Servers. |
| IPv4-Adresse | 192.0.2.103 | Ersetzen Sie diesen Wert durch die IP-Adresse Ihres Servers. |
| Domain | example.tld | Ersetzen Sie diesen Wert durch Ihre Domain. |
Konfigurations-Dateien werden immer nach dem gleichen Muster erstellt. Unter jeder Datei, die eine Anpassung erfordert, finden Sie die nötigen Hinweise.
Dateien, die zwar Parameter aber keine eigentliche Konfiguration enthalten, werden nach dem vorgegebenen Syntax erstellt.
Beispiel:
Im folgenden Beispiel ist die Datei /home/beispiel.conf zu erstellen und der Parameter domain anzupassen.
Erstellen Sie eine neue Datei /home/beispiel.conf mit folgendem Inhalt:
nano /home/beispiel.conf
url = www.twlnet.com
content = Dokumentationen
domain = example.com
owner = root
[...]
domain = example.com
[...]
Im folgenden Beispiel ist die Datei
/home/beispiel.map mit einer Liste Ihrer E-Mail-Adressen zu erstellen.
Erstellen Sie eine neue Datei
/home/beispiel.map nach folgendem Syntax:
nano /home/beispiel.map
[email protected]
[email protected]
[email protected]
Wichtig!
Alle nachfolgenden Schritte müssen auf allen Nodes durchgeführt werden!
Server vorbereiten¶
Root-Rechte einräumen¶
Während der gesamten Dokumentation werden Root-Rechte benötigt. Um auf das Voranstellen von sudo zu verzichten, verschaffen Sie sich für die gesamte Sitzung erhöhte Rechte mit:
sudo -i
Update durchführen¶
Bringen Sie die Nodes auf den aktuellen Patchstand:
apt update && apt upgrade
Software herunterladen und installieren¶
Laden Sie haproxy und keepalived aus dem offiziellen Ubuntu-Repository herunter:
apt install haproxy keepalived
Kernel-Parameter hinzufügen¶
Info
Der folgende Kernel-Parameter sorgt dafür, dass HAProxy eine Bindung an eine nicht lokale IP-Adresse herstellen kann.
Also eine IP-Adresse, die (noch) keinem Gerät auf dem lokalen System zugewiesen ist.
Das ist notwendig, da die Floating-IP-Adresse immer nur einem Node zugewiesen wird.
Ergänzen Sie die Datei /etc/sysctl.conf und wenden Sie die Änderungen an:
echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
sysctl -p
HAProxy einrichten¶
MySQL-User erstellen¶
Stellen Sie eine Verbindung zum MySQL-Server her:
mariadb -u root -p
Erstellen Sie die Benutzer
haproxyund passen Sie die IP-Adressen an.
CREATE USER 'haproxy'@'192.0.2.100';
CREATE USER 'haproxy'@'192.0.2.101';
CREATE USER 'haproxy'@'192.0.2.102';
CREATE USER 'haproxy'@'192.0.2.103';
FLUSH PRIVILEGES;
QUIT;
Konfiguration erstellen¶
Benennen Sie zunächst die /etc/haproxy/haproxy.cfg um, damit Sie eine Sicherheitskopie der Original-Datei haben:
mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
Erstellen Sie eine neue Datei
/etc/haproxy/haproxy.cfg mit folgendem Inhalt:
nano /etc/haproxy/haproxy.cfg
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11
ssl-default-bind-ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
defaults
mode tcp
log global
option tcplog
timeout connect 5000
timeout client 50000
timeout server 50000
frontend galera-cluster_frontend
bind 192.0.2.100:3306
default_backend galera-cluster_backend
backend galera-cluster_backend
balance source
option tcpka
option mysql-check user haproxy
server galera-node01 192.0.2.101:3306 check send-proxy weight 1
server galera-node02 192.0.2.102:3306 check send-proxy weight 1
server galera-node03 192.0.2.103:3306 check send-proxy weight 1
[...]
bind 192.0.2.100:3306
[...]
server galera-node01 192.0.2.101:3306 check send-proxy weight 1
server galera-node02 192.0.2.102:3306 check send-proxy weight 1
server galera-node03 192.0.2.103:3306 check send-proxy weight 1
MariaDB konfigurieren¶
Fügen Sie der Datei /etc/mysql/conf.d/galera.cnf folgendes hinzu:
nano /etc/mysql/conf.d/galera.cnf
[mysqld]
[...]
## HAProxy ##
proxy-protocol-networks = localhost, 192.0.2.101, 192.0.2.102, 192.0.2.103
[...]
[...]
proxy-protocol-networks = localhost, 192.0.2.101, 192.0.2.102, 192.0.2.103
[...]
Keepalived einrichten¶
Keepalived-Script-Benutzer erstellen¶
Erstellen Sie einen Benuter keepalived_script:
useradd -g users -M keepalived_script
Sudoers-Datei erstellen¶
Erstellen Sie eine neue Datei /etc/sudoers.d/keepalived mit folgendem Inhalt:
nano /etc/sudoers.d/keepalived
keepalived_script ALL=(root) NOPASSWD: /usr/bin/killall
Schränken Sie die Rechte auf diese Datei ein:
chmod 440 /etc/sudoers.d/keepalived
Konfiguration erstellen¶
Wichtig!
Achten Sie darauf, dass in Sie in der Konfiguration der korrekte Interface-Name (hier eth0) verwenden wird.
ip addr show
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
[...]
inet 192.0.2.101/24 metric 100 brd 192.0.2.255 scope global dynamic ens18
[...]
Erstellen Sie eine neue Datei /etc/keepalived/keepalived.conf mit folgendem Inhalt:
nano /etc/keepalived/keepalived.conf
global_defs {
enable_script_security
}
vrrp_script chk_haproxy {
script "/usr/bin/sudo /usr/bin/killall -0 haproxy"
interval 2
weight 2
}
vrrp_instance VI_1 {
interface eth0
state BACKUP
virtual_router_id 51
priority 100
authentication {
auth_type PASS
auth_pass SicheresPasswortVerwenden!
}
virtual_ipaddress {
192.0.2.100
}
track_script {
chk_haproxy
}
}
[...]
vrrp_instance VI_1 {
interface eth0
[...]
virtual_ipaddress {
192.0.2.100
}
[...]
authentication {
[...]
auth_pass SicheresRootPasswortVerwenden!
}
[...]
Inbetriebnahme und Test¶
Dienste neustarten¶
Starten Sie die neuen Dienste neu und kontrollieren Sie, ob die Dienste ohne Fehlermedlungen starten:
service mariadb restart
service mariadb status
[...]
service haproxy restart
service haproxy status
[...]
service keepalived restart
service keepalived status
[...]
Abschluss:¶
Wenn alle Dienste fehlerfrei ausgeführt werden, ist der High-Availability-Cluster einsatzbereit.
