この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
MySQLをフェイルオーバーさせたい
フェイルオーバーとは、マスターサーバーに障害が発生した際に、スレーブサーバーが処理やデータを引き継いでサービス全体を止めない機能のことを言います。データベースをフェイルオーバーするためにはデータを引き継ぐことが重要です。この点、前回試したDRBDによる同期レプリケーションの仕組みが生きてきます。今回は、Amazon Linuxをベースに、セットアップ済みのDRBDとHeartbeatを用いて、MySQLをフェイルオーバーさせてみたいと思います。
下準備
マスターとスレーブにMySQLを入れておいて下さい。
$ sudo yum install mysql mysql-devel mysql-server
環境の確認
マスターとスレーブでDRBDとHeartbeatがセットアップ済みかつ起動済みか確認をします。
マスター
$ sudo service drbd status
drbd driver loaded OK; device status:
version: 8.3.11 (api:88/proto:86-96)
srcversion: 2D876214BAAD53B31ADC1D6
m:res cs ro ds p mounted fstype
0:drbd_res0 Connected Primary/Secondary UpToDate/UpToDate C /data xfs
$ sudo service heartbeat status
heartbeat OK [pid 18456 et al] is running on ip-10-150-179-XXX [ip-10-150-179-XXX]...
ちゃんと動いていますね。
MySQLのデータ領域をDRBD管理下に置く
DRBDが管理しているデバイスは/dataにマウントされています(以前そのように構築)。ここでは、MySQLのデータ領域のパスをシンボリックリンクでDRBDに向かせます。
$ ls /var/lib/mysql/
ib_logfile0 ib_logfile1 ibdata1 mysql performance_schema test
$ sudo mv /var/lib/mysql /data
$ sudo ln -snf /data/mysql /var/lib/mysql
$ ll /var/lib/mysql
lrwxrwxrwx 1 root root 11 7月 26 16:38 2012 /var/lib/mysql -> /data/mysql
MySQLにテストデータを入れる
フェールオーバー後にマスターで作成したデータベースがスレーブから見えるか確認するためにテストデータベース(drbd_test)を作成します。
$ sudo service mysqld start
Starting mysqld: [ OK ]
$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.5.24 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database drbd_test;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| drbd_test |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> \q
Bye
スレーブ側の設定
スレーブ側にも同じようにMySQLをセットアップして、データ領域のシンボリックリンクをDRBDのディスクに向けます。データ領域はマスターから同期されますので、スレーブ側の初期のデータ領域は削除してしまいます。
$ sudo rm /var/lib/mysql -Rf
$ sudo ln -snf /data/mysql /var/lib/mysql
$ ll /var/lib/mysql
lrwxrwxrwx 1 root root 11 Jul 26 16:50 /var/lib/mysql -> /data/mysql
$ sudo service mysqld status
mysqld is stopped
MySQLがフェイルオーバーするか確認する
マスター側で障害を起こしてMySQLがフェイルオーバーするか確認します。
$ sudo service drbd status
drbd driver loaded OK; device status:
version: 8.3.11 (api:88/proto:86-96)
srcversion: 2D876214BAAD53B31ADC1D6
m:res cs ro ds p mounted fstype
0:drbd_res0 Connected Primary/Secondary UpToDate/UpToDate C /data xfs
$ sudo service heartbeat stop
Stopping High-Availability services: Done.
$ sudo service drbd status
drbd driver loaded OK; device status:
version: 8.3.11 (api:88/proto:86-96)
srcversion: 2D876214BAAD53B31ADC1D6
m:res cs ro ds p mounted fstype
0:drbd_res0 Connected Secondary/Primary UpToDate/UpToDate C
無事にスレーブサーバーがプライマリに昇格しました。次はスレーブ側の動作確認です。
スレーブ
$ sudo service mysqld status
mysqld (pid 1154) is running...
$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.24 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| drbd_test |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.03 sec)
まとめ
DRBDの同期レプリケーションとHeartbeatの監視によって、MySQLデータ領域のフェールオーバーを実現できました!今回はMySQLでしたが、これ以外のソフトウェアであっても同じ仕組みで対応できるかと思います。トランザクションデータを消失せずにサービスを継続する仕組みは重要ですね!!