MariaDB mit Galera Cluster

Von Lonie

Viele werden schonmal einen MySQL oder MariaDB Server aufgesetzt und betrieben haben. Stellt man an diesen etwas höhere Anforderungen bezüglich Erreichbarkeit kommt man mit den MySQL Bordmitteln recht schnell an die Grenzen – Stichwort Master-Slave Replizierung. Diese bietet zwar die Möglichkeit den Stand eines Master an mehrere Slaves zu verteilen allerdings kann man von diesen zum einen nur lesen und zum anderen existiert ein Zeitversatz zwischen schreiben auf den Master und vorhandensein der Daten auf dem Slave.

Hier setzt Galera an. Vorweg, es existieren hier ein paar Einschränkungen wie dass alle Tabellen einen Primary Key besitzen müssen und nur innoDB Tabellen repliziert werden. Die gesamte Liste ließt man am besten direkt bei MariaDB nach.

Fangen wir an. Zuerst benötigen wir ein paar MariaDB Installationen. In meiner Testumgebung erstelle ich flux 3 LXC Container mit CentOS 7.4.

  • node1 => 10.10.0.1
  • node2 => 10.10.0.2
  • node3 => 10.10.0.3

Für die passende Mariadb Installation füge ich das Repository direkt vom Hersteller hinzu und installiere anschließend die benötigten Pakete auf jedem Node. Hier müsstest ihr prüfen ob das Repository eurer Distribution aktuell genug ist.

/etc/yum.repo.d/mariadb.repo <<EOF
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2.9/centos7-amd64/
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF

yum -y install mariadb-server mariadb-client galera rsync

Jetzt können wir die Knoten für die Nutzung von Galera vorbereiten. Dafür

 /etc/my.cnf.d/galera.cnf 

[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
#add your node ips here
wsrep_cluster_address="gcomm://10.10.0.1,10.10.0.2,10.10.0.3"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
#Cluster name
wsrep_cluster_name="jarvis"
# Allow server to accept connections on all interfaces.
bind-address=0.0.0.0
# this server ip, change for each server
wsrep_node_address="10.10.0.1"
# this server name, change for each server
wsrep_node_name="node1"
wsrep_sst_method=rsync
Die folgenden Zeilen müssen an eure Umgebung angepasst werden. 
Hier kommen die Adressen eurer Nodes sowie die IP und der Name des
aktuellen Nodes hinein. Das ganze wiederholt ihr für jeden Node in eurem Setup.
wsrep_cluster_address="gcomm://10.10.0.1,10.10.0.2,10.10.0.3"
wsrep_node_address="10.10.0.1"
wsrep_node_name="node1"

Um jetzt zu starten muss ein Node den Anfang machen. Ab MariaDB Version 10.4 könnt ihr hierfür galera_new_cluster nutzen. Dies startet den mysqld mit der Option–wsrep-new-cluster welches den Masterknoten initialisiert. Offiziell habt ihr ab sofort einen MariaDB Galera-Cluser mit einem Knoten. Die anderen Knoten können regulär über systemctl start mariadb gestartet werden und holen sich den passenden Stand vom bereits laufenden Knoten ab. Die Knotenzahl eures Clusters seht ihr mit folgendem MySQL-Query

MariaDB [(none)]>  SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+
1 row in set (0.00 sec)

Ab sofort könnt ihr in alle 3 Hosts schreiben, lesen und auch DDL Queries abfeuern. Die Daten werden auf allen Knoten konsistent sein. Um den neuen Vorteil auch nutzen zu können solltet ihr noch einen passenden Proxy, wie HA-Proxy, davor setzten welcher Schreib- und Lesezugriffe auf die Nodes verteilt.

[Gesamt:0    Durchschnitt: 0/5]