Mai 2014 Archive

Es geht weiter mit Dockervorträgen von mia \o/

Tag der Arbeit: Mal eben einen Galera Cluster upgraden

Gegeben ein Galera Cluster für welches im Repository neue Pakete vorhanden sind.

> yum info galera
Installed Packages
Name        : galera
Arch        : x86_64
Version     : 25.3.2
Release     : 1.rhel6
Size        : 29 M
Repo        : installed
From repo   : mariadb

Available Packages
Name        : galera
Arch        : x86_64
Version     : 25.3.5
Release     : 1.rhel6
Size        : 7.6 M
Repo        : mariadb

> yum info MariaDB-Galera-server
Installed Packages
Name        : MariaDB-Galera-server
Arch        : x86_64
Version     : 5.5.36
Release     : 1.el6
Size        : 102 M
Repo        : installed
From repo   : mariadb

Available Packages
Name        : MariaDB-Galera-server
Arch        : x86_64
Version     : 5.5.37
Release     : 1.el6
Size        : 25 M
Repo        : mariadb

Rolling Upgrade

Einer der tollen Features von Galera ist die Möglichkeit des Rolling Upgrades. Hierbei werden einzelne Knoten mit der neuen Version versehen. Der Cluster als ganzes und damit auch der Service bleibt online.

Ansible was?!

Folgend verwende ich ansible. Das dient mir aber nur als ssh Ersatz. Der Aufruf fragt alle Knoten des Clusters nach der MySQL Version, der Clustergröße und dem Satus des Knotens ab. Ist aber nur ein Zuckerl.

$ ansible -i cluster.ini galera -a 'mysql -u root -e 
  "select version();SELECT * from INFORMATION_SCHEMA.GLOBAL_STATUS 
  WHERE VARIABLE_NAME  IN (\"wsrep_cluster_size\",\"wsrep_local_state_comment\")"'
galera01 | success | rc=0 >>
version()
5.5.36-MariaDB-wsrep
VARIABLE_NAME VARIABLE_VALUE
WSREP_LOCAL_STATE_COMMENT Synced
WSREP_CLUSTER_SIZE  3

galera02 | success | rc=0 >>
version()
5.5.36-MariaDB-wsrep-log
VARIABLE_NAME VARIABLE_VALUE
WSREP_LOCAL_STATE_COMMENT Synced
WSREP_CLUSTER_SIZE  3

galera03 | success | rc=0 >>
version()
5.5.36-MariaDB-wsrep
VARIABLE_NAME VARIABLE_VALUE
WSREP_LOCAL_STATE_COMMENT Synced
WSREP_CLUSTER_SIZE  3

Alternativ hätte man die Abfrage auch auf jedem Knoten direkt ausführen können. Zumindest haben wir einen laufenden Cluster mit der Version 5.5.36-MariaDB-wsrep. (Die Anzeige der Galeraversion selbst ignorieren wir der Einfachheit halber.)

Jetzt nehmen wir uns Knoten für Knoten vor und installieren die neuen Pakete.

$ ansible -i cluster.ini galera -l galera01 -a 'yum update -y  MariaDB-Galera-server galera'
galera01 | success | rc=0 >>
[snip]   
Installed:
  galera.x86_64 0:25.3.5-1.rhel6                                                

Updated:
  MariaDB-Galera-server.x86_64 0:5.5.37-1.el6                                   

Replaced:
  galera.x86_64 0:25.3.2-1.rhel6                                                

Complete!

Testen ob dieser Upgrade erfolgreich war:

$ ansible -i cluster.ini galera -a 'mysql -u root -e 
  "select version();SELECT * from INFORMATION_SCHEMA.GLOBAL_STATUS 
  WHERE VARIABLE_NAME IN (\"wsrep_cluster_size\",\"wsrep_local_state_comment\")"'
galera01 | success | rc=0 >>
version()
5.5.37-MariaDB-wsrep
VARIABLE_NAME VARIABLE_VALUE
WSREP_LOCAL_STATE_COMMENT Synced
WSREP_CLUSTER_SIZE  3

galera03 | success | rc=0 >>
version()
5.5.36-MariaDB-wsrep
VARIABLE_NAME VARIABLE_VALUE
WSREP_LOCAL_STATE_COMMENT Synced
WSREP_CLUSTER_SIZE  3

galera02 | success | rc=0 >>
version()
5.5.36-MariaDB-wsrep-log
VARIABLE_NAME VARIABLE_VALUE
WSREP_LOCAL_STATE_COMMENT Synced
WSREP_CLUSTER_SIZE  3

Machen das noch für die beiden verbleibenden Nodes […] und fertig:

$ ansible -i cluster.ini galera -a 'mysql -u root -e 
  "select version();SELECT * from INFORMATION_SCHEMA.GLOBAL_STATUS 
  WHERE VARIABLE_NAME IN (\"wsrep_cluster_size\",\"wsrep_local_state_comment\")"'
galera01 | success | rc=0 >>
version()
5.5.37-MariaDB-wsrep
VARIABLE_NAME VARIABLE_VALUE
WSREP_LOCAL_STATE_COMMENT Synced
WSREP_CLUSTER_SIZE  3

galera03 | success | rc=0 >>
version()
5.5.37-MariaDB-wsrep
VARIABLE_NAME VARIABLE_VALUE
WSREP_LOCAL_STATE_COMMENT Synced
WSREP_CLUSTER_SIZE  3

galera02 | success | rc=0 >>
version()
5.5.37-MariaDB-wsrep-log
VARIABLE_NAME VARIABLE_VALUE
WSREP_LOCAL_STATE_COMMENT Synced
WSREP_CLUSTER_SIZE  3

So einfach kann ein Rolling Upgrade sein \o/

Epilog

Wer nicht seine HA Lösung für den Service testen will und/oder die unnötigen Timeouts meiden. Kann gerne z.B. beim HAProxy den jeweiligen Server, vor dem Upgrade, aus der Verteilung raus nehmen und danach wieder rein :)

echo "disable server galera_server/galera03" | nc -U /var/run/haproxy.sock
Upgrade Steps galera03
echo "enable server galera_server/galera03" | nc -U /var/run/haproxy.sock

Epilog2

Geht auch mit PXC ;)

Viel Spaß

Erkan

Update: s/enable/disable/