Kleines Update, große Wirkung – MariaDB-Galera-Server 5.5.34 auf 5.5.35

Heute wollte ich meinen kleinen MariaDB Galera Cluster updaten. Genutzt werden die Pakete aus dem offiziellen MariaDB-Repository, die Versionsnummern ließen zunächst nichts Aufregendes vermuten.

Die folgenden Pakete werden aktualisiert (Upgrade):
  galera mariadb-galera-server mariadb-galera-server-5.5
3 aktualisiert, 0 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
Inst mariadb-galera-server [5.5.34+maria-1~saucy] (5.5.35+maria-1~saucy mirror2.hs-esslingen.de [all]) []
Inst galera [23.2.7-wheezy] (25.3.2-wheezy mirror2.hs-esslingen.de [amd64]) []
Inst mariadb-galera-server-5.5 [5.5.34+maria-1~saucy] (5.5.35+maria-1~saucy mirror2.hs-esslingen.de [amd64])
Conf galera (25.3.2-wheezy mirror2.hs-esslingen.de [amd64])
Conf mariadb-galera-server-5.5 (5.5.35+maria-1~saucy mirror2.hs-esslingen.de [amd64])
Conf mariadb-galera-server (5.5.35+maria-1~saucy mirror2.hs-esslingen.de [all])

Also mal eben ein apt-get upgrade ausgeführt. Und… MariaDB ließ sich nicht mehr starten. Da dies beim Upgrade-Prozess ausgelöst worden war, konnte dieser ebenfalls nicht beendet werden.

mariadb-galera-server-5.5 (5.5.35+maria-1~saucy) wird eingerichtet ...
 * Stopping MariaDB database server mysqld                                                  [ OK ]
 * Starting MariaDB database server mysqld                                                  [fail]
invoke-rc.d: initscript mysql, action "start" failed.
dpkg: Fehler beim Bearbeiten von mariadb-galera-server-5.5 (--configure):
 Unterprozess installiertes post-installation-Skript gab den Fehlerwert 1 zurück
Es wurde kein Apport-Bericht verfasst, da das Limit MaxReports bereits erreicht ist.
                                                                                    dpkg: Abhängigkeitsprobleme verhindern Konfiguration von mariadb-galera-server:
 mariadb-galera-server hängt ab von mariadb-galera-server-5.5 (= 5.5.35+maria-1~saucy); aber:
  Paket mariadb-galera-server-5.5 ist noch nicht konfiguriert.

dpkg: Fehler beim Bearbeiten von mariadb-galera-server (--configure):
 Abhängigkeitsprobleme - verbleibt unkonfiguriert
Es wurde kein Apport-Bericht verfasst, da das Limit MaxReports bereits erreicht ist.
                                                                                    Fehler traten auf beim Bearbeiten von:
 mariadb-galera-server-5.5
 mariadb-galera-server
E: Sub-process /usr/bin/dpkg returned an error code (1)

Das Logfile des btreffenden Nodes zeigte neben vielen anderen Meldungen unter anderem folgende Warnungen und Fehler:

Feb 17 13:06:44 doesen mysqld: 140217 13:06:44 [Warning] WSREP: no nodes coming from prim view, prim not possible
[...]
Feb 17 13:07:14 doesen mysqld: 140217 13:07:14 [Note] WSREP: view((empty))
Feb 17 13:07:14 doesen mysqld: 140217 13:07:14 [ERROR] WSREP: failed to open gcomm backend connection: 110: failed to reach primary view: 110 (Connection timed out)
Feb 17 13:07:14 doesen mysqld: #011 at gcomm/src/pc.cpp:connect():141
Feb 17 13:07:14 doesen mysqld: 140217 13:07:14 [ERROR] WSREP: gcs/src/gcs_core.c:gcs_core_open():196: Failed to open backend connection: -110 (Connection timed out)
Feb 17 13:07:14 doesen mysqld: 140217 13:07:14 [ERROR] WSREP: gcs/src/gcs.c:gcs_open():1291: Failed to open channel 'gncluster' at 'gcomm://192.168.10.62': -110 (Connection timed out)
Feb 17 13:07:14 doesen mysqld: 140217 13:07:14 [ERROR] WSREP: gcs connect failed: Connection timed out
Feb 17 13:07:14 doesen mysqld: 140217 13:07:14 [ERROR] WSREP: wsrep::connect() failed: 7
Feb 17 13:07:14 doesen mysqld: 140217 13:07:14 [ERROR] Aborting
Feb 17 13:07:14 doesen mysqld:
Feb 17 13:07:14 doesen mysqld: 140217 13:07:14 [Note] WSREP: Service disconnected.
Feb 17 13:07:15 doesen mysqld: 140217 13:07:15 [Note] WSREP: Some threads may fail to exit.
Feb 17 13:07:15 doesen mysqld: 140217 13:07:15 [Note] /usr/sbin/mysqld: Shutdown complete
Feb 17 13:07:15 doesen mysqld:
Feb 17 13:07:15 doesen mysqld_safe: mysqld from pid file /var/run/mysqld/mysqld.pid ended

Zuvor hatte ich versucht, den updateten Node nur mit einem expliziten anderen verbinden zu lassen (daher hier gcomm://192.168.10.62), aber kein Erfolg. Die Verbindung auf Port 4567 klappte, alle anderen Nodes waren verfügbar. Die Fehlermeldung von wegen „Connection timed out“ usw. (siehe oben) förderten bei Google auch nur zutage, dass sich der Node nicht mit den anderen verbinden kann, aus verschiedenen Gründen. Die Tipps, etwa einen Node zum Primary Node küren, Firewall abschalten usw. führten jedoch nicht zum Erfolg.

Ohne Verbindung zu anderen Nodes ließ sich MariaDB starten, d.h. ein service mysql start --wsrep-cluster-address=gcomm:// hatte funktioniet, aber in dem Fall wurde auch nichts repliziert, bzw. der Cluster hätte neu aufgebaut werden müssen, was hier nicht zielführend war.

Erst der Blick ins Logfile der anderen Nodes führte zur Lösung, denn darin war folgendes zu finden:

mysqld: 140217 13:15:40 [Warning] WSREP: unserialize error invalid flags 2: 71 (Protocol error)

Nun fand Google dabei den entscheidenden Hinweis bei Serverfault.
Die Lösung: Beim vermeintlich kleinen Update von MariaDB-Galera-Server 5.5.34 auf MariaDB-Galera-Server 5.5.35 bzw. genau genommen dem Update von Galera [23.2.7-wheezy] auf 25.3.2-wheezy wird die neuere Galera Version installiert. Die MariaDB-Release-Notes schreiben dazu „This version of MariaDB Galera Cluster supports wsrep API v25 which means MariaDB Galera Cluster can be used with either a 25.2.x or 25.3.x Galera wsrep provider. A 25.3.x wsrep provider is included in the MariaDB repositories.“

Das klingt nun weniger spektakulär als es sich ausgewirkt hat. Die Lösung bestand nun darin, auf dem updateten Node den Eintrag
wsrep_provider_options = 'socket.checksum = 1;'
in die my.cnf bzw. conf.d/galera.cnf oder ähnliche einzusetzen. Damit wird der Algorithmus für die Prüfsumme der Netzwerk-Pakete wieder auf plain CRC32 (von Galera 2.x verwendet) gesetzt, während die Default-Einstellung für Galera 3.x CRC32-C (hardwarebeschleunigt) ist. Weitere Hinweise zu den Konfigurationsparametern finden sich im Codership-Wiki. Zum Galera Cluster Update allgemein gibt es im folgenden Blog-Eintrag einige Tipps.

Danach konnte sich der updatete Node wieder mit den anderen Nodes im Cluster verbinden, die Replikation war wieder aktiv. Die anderen Nodes liefen während des Ausfalls unbeeindruckt weiter, insofern hatte der Cluster damit auch seine grundsätzliche Funktionalität beweisen können.

Die nächsten Schritte bestanden nun darin, vor dem Upgrade den o.g. Parameter in die Config-Datei zu platzieren, damit die neuen MariaDB-Server- und Galera-Versionen installiert werden konnten. Damit das neue CRC-Protokoll durchgängig verwendet werden kann, musste der Cluster danach einmal kurz komplett herunter gefahren und – nun entweder mit der Einstellung ’socket.checksum = 2;‘ für Galera 3.x oder unter Verzicht dieser Option – neu aufgebaut werden.

Schreibe einen Kommentar

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

Tags: