MariaDB – GaleraCluster & Pacemaker (Ubuntu 22.04)

Hallo Freunde der Sonne,

in diesem Beitrag, geht es darum, einen MariaDB-Cluster mit Galera-Unterstützung und Pacemaker aufzubauen.
Im Beispiel findet die Installation in LXC/LXD-Containern statt.

MariaDB – GaleraCluster & Pacemaker (Ubuntu 22.04)

Quellen

Grundaufbau

Erstellt werden soll ein Aktiv-Aktiv-Cluster aus zwei MariaDB-Server mit Ubuntu 22.04 LTS Linux als Unterbau.
Zur Synchronisation wird die Galera-Erweiterung verwendet, für die Cluster-IP wird Pacemaker eingesetzt.
Die Überwachung des Clusters basiert auf der Erreichbarkeit der IP des jeweiligen Gegenübers (ja ist verbesserungswürdig).

Installation MariaDB & Galera

Die nun geschilderten Arbeiten müssen auf beiden Servern ausgeführt werden,
selbstverständlich mit wechselndem Servernamen und IP.

Zuerst wird das Galera-Repo von MariaDB eingebunden, ich habe die Version 10.9 verwendet.

wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
chmod ugo+x mariadb_repo_setup
./mariadb_repo_setup

Danach wird die Installation des eigentlichen Datenbankservers initialisiert.

apt install mariadb-server mariadb-backup
systemctl enable mariadb
systemctl start mariadb

Danach sollte die Standardkonfiguration des Datenbankservers vorgenommen werden.

mysql_secure_installation

Nun passen wir die Konfigurationsdateien an.
Für den Server nano /etc/mysql/mariadb.conf.d/50-server.cnf

[mysqld]
...
bind-address = 0.0.0.0
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

Danach konfigurieren wir den Cluster mittels nano /etc/mysql/mariadb.conf.d/60-galera.cnf

[galera]
# Mandatory settings
wsrep_on = ON
wsrep_cluster_name = "clustername"
wsrep_cluster_address = gcomm://10.1.128.67,10.1.128.158
binlog_format = row
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2
wsrep_provider = /usr/lib/galera/libgalera_smm.so


# Allow server to accept connections on all interfaces.
bind-address = 0.0.0.0

# Optional settings
#wsrep_slave_threads = 1
#innodb_flush_log_at_trx_commit = 0

wsrep_node_address="10.1.128.67"
wsrep_node_name="server1"

Nachdem beide Server vorkonfiguriert wurden und der Datenbankdienst neugestartet wurde, kann der Galera-Cluster gebaut werden.

systemctl restart mariadb

Cluster-Initialisierung:

galera_new_cluster

Über folgende Abfragen kann die Node-Anzahl im Cluster festgestellt werden:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Danach kann durch das verteilte Anlegen und Löschen die korrekte Cluster-Funktion überprüft werden.

Installation Pacemaker-Cluster

Auch hier müssen die Arbeiten wieder auf beiden Servern durchgeführt werden.

Da sich die Beispielumgebung in einem Container befindet, der nach jedem Neustart die Netzwerkkonfiguration neu erstellt bekommt,
sollte die Cluster-Reaktivierung unter /etc/crontab verzögert bereitgestellt werden:

@reboot root sleep 10 && pcs node unstandby 10.1.128.67

Vorher könnte man den Cluster aber erst einmal einrichten, hierzu installieren wir die nötigen Komponenten:

apt-get install pacemaker pcs
systemctl enable pcsd
systemctl enable corosync

Finden & Setzen des Cluster-Sync-Users:

grep hacluster /etc/passwd
passwd hacluster

Starten und konfigurieren des Clusters mit der IP: 10.1.128.10

systemctl start pcsd
pcs host auth mariadb1 mariadb2
pcs cluster setup galera-cluster --start mariadb1 mariadb2 --force
pcs status
pcs resource create VirtualIP ocf:heartbeat:IPaddr2 ip=10.1.128.10 cidr_netmask=32 op monitor interval=5s
crm_verify -L -V
pcs property set stonith-enabled=false
pcs property set no-quorum-policy=ignore
systemctl start pcsd
systemctl start corosync
pcs status
pcs status resources

Zur Kontrolle kann man die Logs abfragen:

pcs status # Status des Pacemaker
systemctl status pcsd --no-pager # Dienststatus
journalctl -xe -u pcsd --no-pager # Pacemaker-Logs
journalctl -xeu corosync.service # Corosync-Logs 
crm_verify -L -V # Status der virtuellen IP
pcs status resources # Status der virtuellen IP in Pacemaker

Im Idealfalle testet man durch Neustarts und Reaktivierung der Nodes die korrekte Funktion,
in den Containern die ich installiert hatte – lief es erst Rund, nachdem jedes Node einmal den Gegenüber entfernt und hinzugefügt hatte.

pcs cluster destroy node 10.1.128.67
pcs cluster destroy
pcs cluster node add 10.1.128.67 --start --enable
crm_node -R pcmk-1
reboot
pcs cluster node remove 10.1.128.67
pcs cluster node add 10.1.128.67 --start --enable
reboot
pcs cluster node add 10.1.128.67 --start --enable
pcs cluster recover
pcs cluster unstandby 10.1.128.67
reboot
pcs cluster unstandby 10.1.128.67 # --> /etc/crontab

Über den StandBy-Befehl, kann ein Cluster auch einfach zwischen seinen Nodes umschalten (geht natürlich auch über Stop, ist aber freundlicher).

pcs cluster standby 10.1.128.67
pcs cluster unstandby 10.1.128.67