Galera

Digital Volunteer Network

Created with Sketch.

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 NameIP Adresse
GaleraNode01192.168.0.100
GaleraNode02192.168.0.101
GaleraNode03192.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';

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.