Was ist Galera?
Die Multi-Master-Clustering-Lösung für Datenbanken setzt auf eine hochperformante, synchrone Replikation, um alle Knoten eines Datenbank-Verbunds in Echtzeit mit den gleichen Daten zu versorgen. Unter anderem für MariaDB verfügbar, sorgt Galera Cluster so für minimalen Datenverlust und eine hohe Ausfallsicherheit.
Ein minimaler Galera Cluster besteht aus drei Knoten (die Entwickler empfehlen generell eine ungerade Anzahl). Fällt ein Knoten bei der Transaktion von Daten aus, beispielsweise aufgrund von Netzwerkproblemen oder einem defekten System, bilden die beiden anderen Knoten weiterhin die erforderliche Mehrheit, um die Transaktion dennoch erfolgreich durchführen zu können.
Galera Cluster erstellen
Vorraussetzungen
- Drei Ubuntu 20.x Server
- Netzwerkkonnektivität zwischen den Servern
Die folgenden Namen und IP Adressen werden verwendet:
Server Name | IP Adresse |
GaleraNode01 | 192.168.0.100 |
GaleraNode02 | 192.168.0.101 |
GaleraNode03 | 192.168.0.102 |
Software Installation
Zuerst werden die Repositories aktualisiert damit anschließend auf allen drei Server die neusten Software Pakete installiert werden können.
apt update && apt install rsync mariadb-server mariadb-client -y
Ist die Notwendige Software installiert, sollte zuerst die Grundkonfiguration des SQL Server geschehen. Hierzu wird eine Routine bereitgestellt um die Standard Sicherheitseinstellungen anzupassen. Auch hier werden alle drei Server angepasst.
SQL Setup
mysql_secure_installation
Set root password? Yes
[ROOT PASSWORD]
Remove anonymous users? Yes
Disallow root login remotely? Yes
Remove test database and access to it? Yes
Reload privilege tables now? Yes
Damit läuft erfolgreich der SQL Server welcher für die weitere Konfiguration des Galeras Clusters beendet werden muss.
systemctl stop mariadb
Galera Setup
Damit das Cluster gestartet werden kann, muss hier die Reihenfolge der Nodes beachtet werden, sonst kommt es zu Fehlermeldungen. Zuerst wird der GaleraNode 01 konfiguriert. Dazu wird im SQL Datenverzeichnis eine Konfigurationsdatei angelegt. Das Galera Cluster wird in diesem Guide mit GaleraDBCluster benannt.
nano /etc/mysql/conf.d/galera.cnf
[galera]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="GaleraDBCluster"
wsrep_cluster_address="gcomm://"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="192.168.0.100"
wsrep_node_name="GaleraNode01"
Nun wird noch die Berechtigung auf dem Temporären Order angepasst für die Log-Dateien des SQL Servers.
chmod 777 -R /tmp/
Jetzt ist das Cluster bereit gestartet zu werden.
galera_new_cluster
Aufgrund dass der erste Node des Clusters aktiv läuft können sich die zwei anderen Nodes Verbinden. Wie bereits bei dem vorherigen Node wird jeweils eine Konfigurationsdatei im SQL Datenverzeichnis angelegt und individuell angepasst. Hier ist zu beachten dass unter wsrep_node_address & wsrep_node_name die entsprechenenden Daten eingetragen werden. Zustätzlich wird jetzt die IP Adresse des GaleraNodes01 unter wsrep_cluster_address eingetragen.
GaleraNode02:
nano /etc/mysql/conf.d/galera.cnf
[galera]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="GaleraDBCluster"
wsrep_cluster_address="gcomm://192.168.0.100"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="192.168.0.120"
wsrep_node_name="GaleraNode02"
GaleraNode03
nano /etc/mysql/conf.d/galera.cnf
[galera]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="GaleraDBCluster"
wsrep_cluster_address="gcomm://192.168.0.100"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="192.168.0.130"
wsrep_node_name="GaleraNode03"
Auch diese beiden Server benötigen die Berechtigung auf das Temporäre Verzeichnis.
chmod 777 -R /tmp/
Jetzt können die beiden Server gestartet werden und verbinden sich mit dem GaleraNode01.
systemctl start mysql
Zum überprüfen kann mann aus der Datenbank von einem der Server auslesen wie viele Nodes im Cluster verbunden sind.
mysql
MariaDB [(none)]> show status like 'wsrep_cluster_size';
Hier erscheint nun die Ausgabe 3 unter der Value Spalte.
Damit allerdings alle Nodes untereinander kommunizieren können müssen jetzt noch die IP Adressen in den Konfigurationsdateien der drei Server wie folgt ergänzt werden.
nano /etc/mysql/conf.d/galera.cnf
wsrep_cluster_address="gcomm://192.168.0.100, 192.168.0.110,192.168.0.130"
Anschließend reicht ein Neustart des Dienstes pro Server.
systemctl restart mysql
Galera Cluster Troubleshooting
Wenn ein Nodes nicht mehr mit dem Cluster verbunden ist, wird dies ersichtlich auf den anderen Nodes welche sich auf dem SQL Service verbinden können und die Cluster größer ausgeben lassen können. Der betroffene SQL Service hat keinen aktiven SQL Dienst mehr am laufen, um den Status des Dienstes anzuzeigen wird
systemctl status mysql
ausgeführt. Durch ein unerwartestes Entfernen eines Nodes zum Beispiel durch einen Stromausfall oder Netzwerkkonnektivität kann es passieren dass die Nodes nicht mehr Synchron ist. Daher gibt es die grastate.dat welche anzeigt ob der Node gestart werden kann oder nicht.
nano /var/lib/mysql/grastate.dat
# GALERA saved state
version: 2.1
uuid: [00000000-0000-0000-0000-000000000000
]
seqno: -1
safe_to_bootstrap: 0
Wenn an allen Nodes die seqno = -1 ist und der Wert des safe_to_bootstrap = 0 ist, ist das gesamte Cluster gecrashed. Daher muss der Status jedes Nodes kontolliert werden um den Node zu finden, der die letzte Änderung vorgenommen hat.
galera_recovery
OUTPUT: WSREP: Found saved state: cbd332a9- f617-11e2-b77d-3ee9fa637069:36742
Der Output des Status ist die UUID und die seqno –> UUID:SEQNO
Der Node mit der höchsten SEQNO is der Node mit der letzten Änderung und muss daher der Node werden der zuerst wieder gestartet wird.
mysql_safe —wsrep_cluster_address=gcomm://
Nun startet der Node das Cluster was wenige Minuten dauern kann und als aktives commando bleibt im Terminalfenster. Wenn keine Fehlermeldung erscheint ist der Node aktiv. Bevor die anderen Nodes gestartet werden können, muss die Konfiguration temporär geändert werden um die Verbindung aufbauen zu können.
nano /etc/mysql/conf.d/galera.cnf
wsrep_cluster_address="gcomm://[IP von dem ersten Node]"
Nun können die Nodes gestartet werden
systemctl start mysql
Wenn die Nodes nun laufen kann über die SQL DB kontrolliert werden ob die Clustergröße korrekt ist. Wenn das Cluster wieder entsprechend verbunden ist müssen die Konfigurationen der Nodes wieder um die IP Addressen der anderen Nodes ergänzt werden.
nano /etc/mysql/conf.d/galera.cnf
wsrep_cluster_address="gcomm://[IP_Node01,IP_Node02,IP_Node03, etc]"
Anschließend reicht ein Neustart des Dienstes.
systemctl restart mysql
Auch der erste Node kann nun Neugestartet werden, ggf. über ein neue Terminalverbindung.
systemctl restart mysql
Galera SQL Befehle
Zeigt die Anzahl der Nodes im Cluster an
show status like 'wsrep_cluster_size';
Zeigt den Status des Nodes an. Wenn hier was anderes als „Primary“ angezeigt wird befindet sich der Node in einem nicht operativen Status.
show status like 'wsrep_cluster_status';
Zeigt die Netzwerkkonektivität an.
show status like 'wsrep_connected';
Zeigt den Status des Clusters an
show status like 'wsrep_local_state_comment';
Zeigt die eingehenden Verbindungen zu dem Node an
show status like 'wsrep_incoming_addresses';