[HA]MySQL5.1.52 + Heartbeat3.0.5でクラスタを組む

概要

Databaseの冗長化を考えます。一般的な冗長化の方法としては、FTサーバを導入することですが、コスト的な観点から
状況によりベストエフォートではない可能性があります。論理的な冗長化の方法としてHeartbeatを利用した方法幾つか紹介します。

HAを利用した冗長化のソリューション
概要 詳細
共有ディスク型 Headサーバのみ冗長化し、ディスクは共有するソリューション。
シェアードナッシング型 ディスク単位も冗長化する、稼働系と待機系のディスク同期はレプリケーションにより実現。

上記以外の方法としては、MySQL Clusterの利用も考えられます。

今回のソリューションはシェアードナッシングにフォーカスを当てます。シェアードナッシングのイメージ図は以下の通り。

本来であれば、監視セグメント・サービスセグメント、、、と分けて構成してあげるのがBETTERですが、ここでは省略して、各ホストひとつのNICで構築していきます。

バージョン

今回使用したミドルウェアのバージョンは以下の通り。
MySQL 5.1.52
Heartbeat 3.0.2

MySQLのレプリケーション設定

各サーバの役割は以下の通りとします。

ホスト名 IP 役割
sample.db1 10.10.0.10 マスターサーバ
sample.db2 10.10.0.20 スレーブサーバ

マスターサーバの設定

①レプリケーション用ユーザの作成
GRANT REPLICATION SLAVE ON *.* to ‘replication’@’10.10.0.20’ IDENTIFIED BY ‘replication’;
②my.cnfの設定
[mysqld]
# バイナリログを出力する
log-bin
# 識別用ID。
server-id=10

スレーブサーバの設定

①my.cnfの設定
server-id=20

データ移行 & レプリケーション設定

①マスターサーバに対して更新がかからないようにロックをかけます
mysql > FLUSH TABLES WITH READ LOCK;

②マスターサーバのデータをスレーブサーバにコピーする
・/var/lib/mysql配下のデータファイルをコピーします

③マスターサーバのバイナリログの状態を確認します
mysql > SHOW MASTER STATUS;

④レプリケーション設定をスレーブサーバに追加します
mysql > CHANGE MASTER TO MASTER_HOST=’10.10.0.10′, MASTER_USER=’replication’, MASTER_PASSSWORD=’replication’, MASTER_LOG_FILE=’※1′, MASTER_LOG_POS=’※2′;
※1 ③で確認したファイル名称
※2 ③で確認したポジション

⑤レプリケーションを開始します
mysql > START SLAVE;

⑥レプリケーションの稼動確認
mysql > SHOW SLAVE STATUS\G;
※ Slave_IO_Running, Slave_SQL_Runningがyesになっていることを確認

ハートビートの設定

大きく、以下の三つの設定ファイルが存在します。
①/etc/ha.d/ha.cf
②/etc/ha.d/authkeys
③/var/lib/heartbeat/crm/cib.xml

ha.cfの設定

logfacility local0
auto_failback on
pacemaker on
debug 0
# heartbeatに利用するポート番号
# 複数クラスタを同一LAN内で運用する場合はポート番号を変更すること
udpport 694
# heartbeatの監視間隔
keepalive 2
# クラスタを組んでいるホストがダウンしたときに警告を出すまでの時間
warntime 20
# クラスタを組んでいるホストがダウンしたと判断する時間
deadtime 24
# 起動から監視を解しするまでの時間
initdead 48
ucast eth0 10.10.0.20
logfile /var/log/ha-log

# クラスタに参加するサーバ
# uname -nで表示されるホスト名
node sample.db1
node sample.db2

watchdog /dev/watchdog
uuidfrom nodename

authkeysの設定

auth 1
# 任意の文字列を設定可能だがすべてのクラスタで同一にする必要がある
1 sha1 XXXXXXXXX

cib.xml

crmコンソールから実行します。

[root@sample.db1 ~]# crm
crm(live)# configure
crm(live)configure# primitive vip ocf:heartbeat:IPaddr2 params ip="10.10.0.1" nic="eth0" cidr_netmask="24" op monitor interval="10s"
crm(live)configure# property $id="cib-bootstrap-options" stonith-enabled="false" no-quorum-policy="ignore"
crm(live)configure# rsc_defaults resource-stickiness="INFINITY" migration-threshold="1"
crm(live)configure# primitive mysql ocf:heartbeat:mysql params binary="/usr/bin/mysqld_safe" max_slave_lag="15" evict_outdated_slaves="false" config="/etc/my.cnf" datadir="/var/lib/mysql" user="mysql" pid="/var/run/mysqld/mysqld.pid" socket="/var/lib/mysql/mysql.sock" test_user="root" test_passwd="mysql" replication_user="replication" replication_passwd="replication" op monitor interval="5s" role="Master" on_fail="fence"
crm(live)configure# ms ms_mysql mysql meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" globally-unique="false" target-role="Master" is-managed="true"
crm(live)configure# colocation vip_on_master inf: vip ms_mysql:Master
crm(live)configure# commit

稼動確認

[root@sample.db1 ~]# crm_mon
============
Last updated: Tue Aug 21 10:47:49 2012
Stack: Heartbeat
Current DC: sample.db1 (565e8e57-bbf8-2c7d-c2ad-f25e97a1e183) – partition with quorum
Version: 1.0.12-066152e
2 Nodes configured, unknown expected votes
2 Resources configured.
============

Online: [ sample.db1 sample.db2 ]

vip (ocf::heartbeat:IPaddr2): Started sample.db1
Master/Slave Set: ms_mysql
Masters: [ sample.db1 ]
Slaves: [ sample.db2 ]

フェイルオーバー確認

crm_monで状態を確認している状態で、Active側のMySQLプロセスを殺してください。
そうすると、フェイルオーバーの確認ができます。

最後に

MySQLとHeartbeatという無料のミドルウェアを使って冗長性のあるスケールアウト可能なシステムがこんなにも簡単に作れるなんてすばらしい。

関連図書