keepalived + MySQL-MHA + xtrabackupで自動フェイルオーバーと手動フェイルバック(その3 xtrabackup編)

アドウェイズエンジニアのイシマルです。

最近は、Railsのテストコードをrspecで書いてます。
テストコードって実装の何倍も大変ですね。

でも、これをちゃんと書いておけば、あとでグーーーンと楽ができる!?
って思いながら、書いています(仕様が大幅に修正になったりしたら、テストコードも大量に直さないといけないので、余計大変な気もしますが^^;)。

では、本題のxtrabackup編を紹介します。

サーバ構成、サーバ要件は、前回・前々回の

keepalived + MySQL-MHA + xtrabackupで自動フェイルオーバーと手動ファイルバック(その1 keepalived編)
keepalived + MySQL-MHA + xtrabackupで自動フェイルオーバーと手動フェイル(その2 MySQL-MHA編)

を参照してください。

■今回の要旨

* MHAで自動フェイルオーバーした後、どうフェイルバックするか?

■フェイルバックの手順
  • バックアップから落ちたサーバのDBを復元
  • slave start
  • mha-managerの起動

この流れで復元します。

■サーバの状態遷移

初期状態から物理サーバ1がダウンした際の復旧の場合の状態遷移のイメージです。

blog3_1

■xtrabackup

xtrabackupは、Percona社のMySQLのバックアップツールで、以下のようなことができます。

便利ですね。

■インストールと設定

●xtrabackup

* xtrabackupのインストール
# cd /usr/local/src/

# wget http://www.percona.com/downloads/percona-release/percona-release-0.0-1.$(uname -m).rpm
# rpm -ivh percona-release-0.0-1.$(uname -m).rpm
# yum -y install xtrabackup

# mkdir -p /var/lib/mysql_mha/backup
# chown mysql:mysql /var/lib/mysql_mha/backup

■フェイルバックの手順

1.フルバックアップ+差分バックアップを復元するサーバにコピーする。

2.復元するサーバのmysqlが起動している場合は、止める。
# /etc/init.d/mysql stop

3.mysqlディレクトリを新しく作る
# mv /var/lib/mysql /var/lib/mysql.old
# mkdir -p /var/lib/mysql

4.リストアを実行する
* slaveからフルバックアップ
# innobackupex \
   --defaults-file=/etc/my.cnf \
   --socket=/var/lib/mysql/mysql.sock \
   --port=3306 \
   --defaults-group=mysqld \
   --slave-info \
   --safe-slave-backup \
   --user=root \
   --password=password \
   /var/lib/mysql_mha/backup/ \
   --tmpdir=/tmp --scpopt="-Cp -c arcfour"

* slaveから差分バックアップ
# innobackupex \
   --incremental /var/lib/mysql_mha/backup/  \
   --incremental-basedir=/var/lib/mysql_mha/backup/yyyy-mm-dd_hh-ii-ss \
   --defaults-file=/etc/my.cnf \
   --socket=/var/lib/mysql/mysql.sock \
   --port=3306 \
   --defaults-group=mysqld \
   --slave-info \
   --safe-slave-backup \
   --user=root \
   --password=password 

* slaveからリストア

トランザクションログを適用後に、--copy-backをつけてinnobackupexを実行する。

差分バックアップの起点を適用する。
# innobackupex \
  --apply-log \
  --redo-only \
  /var/lib/mysql_mha/backup/yyyy-mm-dd_hh-ii-ss(full backup)

・差分を順に適用する
# innobackupex \
  --apply-log \
  --redo-only \
  /var/lib/mysql_mha/backup/yyyy-mm-dd_hh-ii-ss(full backup)
  --incremental-dir=一つ目の差分バックアップ...

・リストアを実行
# innobackupex \
  --copy-back \
  /var/lib/mysql_mha/backup/yyyy-mm-dd_hh-ii-ss(full backup)

5.権限を変更し、必要なフォルダを.oldから戻す
# chown -R mysql:mysql /var/lib/mysql
# cp -pR /var/lib/mysql.old/.ssh /var/lib/mysql/

6.mysqlを起動する
# /etc/init.d/mysql start

7.mysqlを起動し、レプリケーションを再開する。
* slaveの再開

/var/lib/mysql_mha/backup/yyyy-mm-dd_hh-ii-ss(full backup)/xtrabackup_slave_infoを元に、slaveを再開します。

* xtrabackup-slave-infoの中身
CHANGE MASTER TO MASTER_LOG_FILE='db_server1-bin.000004', MASTER_LOG_POS=703

* slave start
mysql> CHANGE MASTER TO
          MASTER_HOST='192.168.0.102',
          MASTER_USER='repl',
          MASTER_PASSWORD='replpassword',
          MASTER_LOG_FILE='db_server1-bin.000004',
          MASTER_LOG_POS=703;

mysql> START SLAVE;

9.mha-managerを起動する。

keepalived + MySQL-MHA + xtrabackupで自動フェイルオーバーと手動フェイルバックは以上となります。

また機会があれば、手動フェイルバックしているところを、コマンド一発でフェイルバックできるようにもしてみたいところですね。