Amazon LinuxでDRBDとHeartbeatとMySQLを連動させてフェイルオーバー

この記事は公開されてから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でしたが、これ以外のソフトウェアであっても同じ仕組みで対応できるかと思います。トランザクションデータを消失せずにサービスを継続する仕組みは重要ですね!!

参考資料

フェイルオーバー

15.2. Using MySQL with DRBD

Pacemaker+drbd+heartbeatでMySQLクラスタ

Amazon LinuxでDRBD 8.3.11を構築する

Amazon LinuxでDRBDとHeartbeat 3.0.5を連動させる