仕事で、MariaDB+GaleraClusterのバックアップについて検討する事があったので、その備忘。
さて、当たり前の話として、業務で利用している大体のDBってクラスタ化した上で定期的にバックアップを取得していると思う。

バックアップの取り方としては何通りもあると思うが、MariaDB+GaleraClusterの組み合わせで取得する場合、以下の3通りが考えられる。

  1. GaleraClusterの構成ノードを切り離しorLVMのスナップショットを使用し、ファイルをバックアップする
  2. mysqldumpを使用してオンラインバックアップ
  3. Percona XtraBackupを使用してオンラインバックアップ

今回はそのうちの1つ目である構成ノードを切り離すかLVMのスナップショットを取得し、その時点でのバックアップを取得する方式について検証する。
なお、前提としてLBにMaxscaleでwrite/readノードを切り分けているため、wsrep_local_indexが0のものは切り離せないと仮定する。

1.バックアップ

さて、クラスタからノードを切り離してのバックアップだが、これについては至極単純な手法だ。
一旦、対象ノードでMariaDBを停止するか、firewalldなどを起動させてクラスタの他ノードと通信出来ないようにして、その間にデーターベースファイル(デフォルトだと「/var/lib/mysql」配下)をバックアップしてしまえばいい。
LVMを用いているようであれば、スナップショットを取得した上でコピーするのが最も良い…のだけど、LVM上ではない所でDBを作成することもあるので、今回は両方やってみよう。

1-1.LVMを使ってない場合

今回の場合、フロントにMaxscaleを用いている仮定なので、wsrep_local_indexが0のノード(書き込み用のマスターノード)以外を選択する必要がある。
以下のようにmysqlコマンドで指定することで、wsrep_local_indexの値だけを取り出せるので、これでバックアップ前にどのノードを切り出すかを判断しよう。

mysql -ss -u root INFORMATION_SCHEMA -e "SELECT VARIABLE_VALUE FROM GLOBAL_STATUS WHERE VARIABLE_NAME LIKE 'WSREP_LOCAL_INDEX';"
[root@BS-PUB-GALERA-01 ~]# mysql -ss -u root INFORMATION_SCHEMA -e "SELECT VARIABLE_VALUE FROM GLOBAL_STATUS WHERE VARIABLE_NAME LIKE 'WSREP_LOCAL_INDEX';"
2

切り離すノードが決まったら、そのノードでMariaDBを停止するか、firewalldで通信を遮断しよう。
復旧後の事を考えるとfirewalldの方が望ましいが、今回は検証なのでMariaDBを停止してしまう。

service mysql stop

サービスが停止できたら、「/var/lib/mysql」配下をtarなどで圧縮、アーカイブ化して別の所に退避させればよいだろう。
以下のコマンドでは、「/tmp」に日付・時刻付きでtar.gzファイルを作成してバックアップしている。

tar czvf /tmp/$(date +%Y%m%d_%H%M%S)_dbbackup.tar.gz /var/lib/mysql

処理が終わったら、サービスを起動させれば良い。

service mysql start

1-2.LVMを使っている場合

LVMを使っている場合、MariaDBをわざわざ停止する必要はない。
その時点のLVMスナップショットを取得し、それをマウントしファイルバックアップを行えばいいだけだ。

スナップショットの取得、マウント方法についてはこちらを参照してもらいたい。

2.リストア

さて、無事バックアップを取得出来たら、次はリストアを行う。まぁ、リストアといってもDBのファイルをバックアップファイルと置き換えるだけなんだけど。
まず、一旦Galera Clusterの構成ノードで動作しているMariaDBを全て停止する。

service mysql stop

後は、各ノードでリストア前のディレクトリを退避させ、バックアップファイルと置き換えればいい。
なお、この時バックアップファイルとの置き換えは、最悪の場合は最初に起動する1台だけで実施して問題無い(Galera Clusterの場合、動作しているノードから全部のファイルを持ってきて同期させるので)。

mv /var/lib/mysql /var/lib/mysql.$(date +%Y%m%d)
mv バックアップしたディレクトリ /var/lib
chown -R mysql:mysql /var/lib/mysql

置き換えが終わったら、各ノードを起動させる。

service mysql bootstrap # 最初の一台目の場合
service mysql start

これで、無事リストアは完了。