Gerade erst hatte ich den Beitrag zu Galera fertig geschrieben musste ich gleich das schuldig gebliebene Puzzleteil liefern. Ein Cluster ist zwar schön und gut allerdings möchte man ihn auch entsprechend nutzen. Dies kann man entweder durch die Applikation und DNS-Namensauflösung erreichen oder gleich richtig machen.
In dem Galera Beitrag hatte ich dazu kurz HAProxy erwähnt bin aber die Konfiguration dazu schuldig geblieben. Das lag daran dass ich mit diesem noch keine großen Berührungspunkte hatte was ich inzwischen nicht mehr behaupten kann. Man muss aber auch dazu sagen dass die Konfiguration von HAProxy fast schon trivial ist.
Ich habe mir also einen neuen LXC Container mit einem CentOS 7.4 Template angelegt und darauf das haproxy Paket installiert.
yum -y install haproxy
Anschließend müssen wir dafür sorgen dass haproxy auch auf dem passenden Port lauscht und eingehende Verbindungen an unsere 3 Galera-Nodes verteilt. Hierfür fügen wir den folgenden Code unter /etc/haproxy/haproxy.cfg ein
# Load Balancing for Galera Cluster
listen galera 10.10.0.10:3306
balance roundrobin
mode tcp
option tcpka
server node1 10.10.0.1:3306 check weight 1
server node2 10.10.0.2:3306 check weight 1
server node2 10.10.0.3:3306 check weight 1
Jetzt muss haproxy nur noch gestartet werden und das wars auch schon. Der Cluster ist jetzt unter der IP des HAProxy erreichbar welcher eingehende Verbindungen im Round Robin an die 3 Nodes verteilt. Sollte noch keine Verbindung möglich sein liegt dies wahrscheinlich an 2 Dingen. Zum ersten prüft ob überhaupt externe Verbindungen zum MariaDB Server erlaubt sind. Dies wird in der my.cnf oder einer über include eingebundenen Konfiguration über bind-address konfiguriert. Ist der Eintrag nicht vorhanden sind nur Verbindungen von Localhost erlaubt. 0.0.0.0 sorgt dafür das der MariaDB Server auf allen IP Adressen lauscht. Der zweite Punkt der geprüft werden sollte ist der Benutzer mit dem ihr euch verbindet. Diesem muss erlaubt sein Verbindungen mit Quellip des HAProxy Verbindungen öffnen zu können. Sollte dies nicht so sein so ändert dies nicht über ein UPDATE mysql.user SET… Da Galera nur innodb Tabellen synchronisiert und die mysql.* Tabellen vom Typ MyISAM sind müsste dies auf allen Nodes gemacht werden. Außerdem ist das eh der falsche Weg auch wenn man es oft im Netz so ließt. Richtig macht man dies mit folgendem Statement welches auch über unseren Cluster synchronisiert wird.
RENAME USER 'foo'@'localhost' TO 'foo'@'10.10.0.10';
Für die visuellen Menschen gibt es die Möglichkeit eine Statistikseite zu konfigurieren. Hierfür benötigen wir einen zusätzlichen Eintrag in der haproxy.cfg
listen stats # Define a listen section called "stats"
bind :9000 # Listen on localhost:9000
mode http
stats enable # Enable stats page
stats hide-version # Hide HAProxy version
stats realm Haproxy\ Statistics # Title text for popup window
stats uri /stats # Stats URI
stats auth Username:Password # Authentication credentials