In diesem Artikel beschreibe ich wie man einen Proxy für den Galera-Cluster hinzufügt. Neben HAProxy habe ich auch noch den ProxySQL als tauglich befunden mich aber dann doch für den HAProxy entschieden, weil er gleich einen eingebauten Monitor mitbringt.
Den HAProxy installieren
Zuerst installieren wir die benötigten Software-Pakete:
apt-get install haproxy mariadb-client
Den MariaDB-Client benötigen wir später zum Testen.
Den HAProxy konfigurieren
Jetzt passen wir die Konfigurationsdatei /etc/haproxy/haproxy.cfg des HAProxy’s an und ergänzen folgende Einträge:
# Load Balancing for Galera Cluster listen galera 192.168.1.10:3306 balance roundrobin mode tcp option tcplog option tcpka option mysql-check user haproxy server node1 192.168.1.1:3306 check weight 1 server node2 192.168.1.2:3306 check weight 1 server node2 192.168.1.3:3306 check weight 1 listen stats bind 0.0.0.0:8080 mode http stats enable stats uri / stats realm Strictly\ Private stats auth user:passwd
Danach wird der HAProxy neu gestartet:
service haproxy restart
Damit der HAPRoxy regelmäßig prüfen kann, ob alle Galera-Cluster Knoten noch funktionieren und antworten benötigt er einen MariaDB-User, der auf jedem Knoten anzulegen ist.
/usr/local/mysql/bin/mysql -e "INSERT INTO mysql.user (Host,User) values ('192.168.1.10','haproxy'); FLUSH PRIVILEGES;"
Wieso muss man das auf jedem Knoten ausführen? Wie haben doch einen Cluster gebaut. Galera synchronisiert nur Tabellen vom Typ InnoDB. Die Systemtabellen von MariaDB liegen aber im Format MYISAM vor, so dass diese nicht synchronisiert werden.
Die Statistiken kann man auf dem Proxy-Knoten mit einem Browser abrufen unter der URL http://<Proxy-Knoten>:8080/. Dabei wird dann der in der Konfigurationsdatei angegeben User und das Passwort abgefragt.
Den HAProxy testen
Um das Ganze dann mal auszuprobieren legen wir jetzt eine Datenbank an und richten einen User ein. Dazu startet man mysql und setzt dann folgende SQL Befehle ab:
CREATE DATABASE `meine_Datenbank`; CREATE USER 'username' IDENTIFIED BY 'passwort'; GRANT ALL privileges ON `meine_Datenbank`.* TO 'user'@'%'; FLUSH PRIVILEGES; SHOW GRANTS FOR 'user';
Danach kann man von jedem Rechner im heimischen Netzwerk mit dem User auf die Datenbank zugreifen.