MySQL DRBD Heartbeat HA
MySQL を DRBD + Heartbeat で HA クラスタ 構成にしてみます。
DRBD のインストールや設定については DRBD on CentOS 5 の記事のような感じです。
今度は Heartbeat を設定していきます。OS 環境は同じく VMWare Server 上の CentOS 5 を使用します。
環境
| OS | ホスト名 | 実IPアドレス | 仮想IPアドレス | DRBDデバイス名 | MySQLデータ領域 | ポート |
|---|---|---|---|---|---|---|
| CentOS 5 | toire | 192.168.159.128 | 192.168.159.130 | /dev/drbd0 | /var/lib/mysql | 694 |
| CentOS 5 | ohuro | 192.168.159.129 | 192.168.159.130 | /dev/drbd0 | /var/lib/mysql | 694 |
global {
dialog-refresh 0;
}
common {
syncer { rate 10M; }
}
resource r0 {
protocol C;
startup {
degr-wfc-timeout 120;
}
disk {
on-io-error pass_on;
}
net {
after-sb-0pri disconnect;
after-sb-1pri disconnect;
after-sb-2pri disconnect;
rr-conflict disconnect;
}
syncer {
al-extents 257;
}
on toire {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.159.128:7788;
meta-disk internal;
}
on ohuro {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.159.129:7788;
meta-disk internal;
}
}
Heartbeat のインストール
まずは yum でパッケージをインストールします。
# yum -y install heartbeat
インストールが完了すると、/etc/ha.d ディレクトリが作成され、ほとんどの設定がこの中でされます。まずは設定ファイルを準備します。
# cp /usr/share/doc/heartbeat-2.0.8/ha.cf /etc/ha.d # cp /usr/share/doc/heartbeat-2.0.8/haresources /etc/ha.d # cp /usr/share/doc/heartbeat-2.0.8/authkeys /etc/ha.d
クラスタの設定
クラスタは /etc/ha.d/ha.cf で設定します。サンプルファイルを編集して設定します。以下は toire(Primary) の設定ファイルです。
# ログの出力先を指定(Heartbeat 専用に出力したい場合) logfile /var/log/ha-log # syslog のファシリティを設定 logfacility local0 # heartbeat の間隔(秒) keepalive 2 # ノードがダウンしたと判断する時間(秒) deadtime 30 # ノードがダウンした警告を発する時間(秒) warntime 10 # 起動時に待つ時間。これを超えるとダウンしていると判断(秒)deadtime の二倍以上推奨 initdead 120 # ブロードキャスト、ユニキャストで使用する UDP ポート番号 udpport 694 # ユニキャストを使う場合にインターフェースと相手ホストの IP アドレスを指定する ucast eth0 192.168.159.129 # 自動的にフェイルバックするかどうか auto_failback on # クラスタのノード名を指定。uname -n で表示される名前を指定する node toire node ohuro # ping 監視する IP アドレスを指定。ipfail のために使います ping 192.168.159.130 # hearbeatと一緒に起動するプロセスと起動ユーザを指定する respawn hacluster /usr/lib/heartbeat/ipfail
これは ohuro(Secondary) の /etc/ha.d/ha.cf ファイル
logfile /var/log/ha-log logfacility local0 keepalive 2 deadtime 30 warntime 10 initdead 120 udpport 694 ucast eth0 192.168.159.128 auto_failback on node toire node ohuro ping 192.168.159.130
他にもいろいろと設定項目がありますが、今回はシンプルにしています。
リソースの設定
リソースの設定は /etc/ha.d/haresources で行います。
toire drbddisk::r0 Filesystem::/dev/drbd0::/var/lib/mysql::ext3 192.168.159.130/24 mysqld
[プライマリノード名] [DRBD 監視設定] [仮想 IP アドレス] [サービス名]
という順に設定します。
そもそもの書式は以下のようになっています。
preferred-node resourcename ...
プライマリ、セカンダリともに同じ設定にします。
最後のサービス名(mysqld)は サービスの起動スクリプト名を指定します。起動スクリプトは、
- /etc/ha.d/resource.d
- /etc/init.d
の順に探していきます。
認証の設定
ノード間の認証の設定は /etc/ha.d/authkeys で行います。crc、sha1、md5 の3種類が使えます。crc はキーが必要なく、最も負荷の小さい方式です。sha1 は最も信頼性が高く、その次に md5 が信頼できる認証になっています。信頼できるメソッドであればあるほど処理効率は悪くなります。これもプライマリ、セカンダリで同じ設定にしておきます。
crc を使う例(今回は CRC を使います)
auth 1 1 crc #2 sha1 HI! #3 md5 Hello!
/etc/ha.d/authkeys は パーミッションを 0600 にしておく必要があります。
# chmod 0600 /etc/ha.d/authkeys
Heartbeat の起動
Hearbeat を起動するまえに、DRBD と MySQL のプロセスが停止していることを確認します。また、DRBD モジュールがロードされていないとうまく動かないので確認します。
# lsmod | grep drbd drbd 181384 2
もしロードされていなければ、ロードします。
# modprobe drbd
Heartbeat を起動します(プライマリ側から起動したほうがいいかも)。
# /etc/init.d/heartbeat start
両ノードで Heartbeat を起動したら、DRBD を起動します。
# /etc/init.d/drbd start
DRBD を起動すると、/etc/ha.d/haresources に設定した drbddisk によって、ホスト toire がプライマリになります。/proc/drbd で確認します。
toire# cat /proc/drbd version: 8.0.5 (api:86/proto:86) SVN Revision: 3011 build by root@toire, 2007-09-19 13:12:38 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r--- ns:852 nr:704 dw:1496 dr:8643 al:0 bm:19 lo:0 pe:0 ua:0 ap:0 resync: used:0/31 hits:15 misses:3 starving:0 dirty:0 changed:3 act_log: used:0/257 hits:198 misses:0 starving:0 dirty:0 changed:0
プライマリ(toire)で MySQL が Heartbeat によって起動されていることを確認します。
toire# /etc/init.d/mysqld status mysqld (pid 9099) を実行中...
フェイルオーバーの確認
toire(プライマリ)の Heartbeat プロセスを停止して、フェイルオーバーの動作確認をしてみます。
toire# /etc/init.d/heartbeat stop
ohuro の様子はこのようになります。何が起きているかよくわかります。
Sep 19 13:21:34 ohuro kernel: drbd0: peer( Primary -> Secondary ) Sep 19 13:21:34 ohuro heartbeat: [4280]: info: Received shutdown notice from 'toire'. Sep 19 13:21:34 ohuro heartbeat: [4280]: info: Resources being acquired from toire. Sep 19 13:21:34 ohuro heartbeat: [6699]: info: acquire local HA resources (standby). Sep 19 13:21:35 ohuro heartbeat: [6699]: info: local HA resource acquisition completed (standby). Sep 19 13:21:35 ohuro heartbeat: [4280]: info: Standby resource acquisition done [foreign]. Sep 19 13:21:35 ohuro heartbeat: [6700]: info: No local resources [/usr/share/heartbeat/ResourceManager listkeys ohuro] to acquire. Sep 19 13:21:35 ohuro harc[6725]: info: Running /etc/ha.d/rc.d/status status Sep 19 13:21:36 ohuro mach_down[6741]: info: Taking over resource group drbddisk::r0 Sep 19 13:21:36 ohuro ResourceManager[6767]: info: Acquiring resource group: toire drbddisk::r0 Filesystem::/dev/drbd0::/var/lib/mysql::ext3 192.168.159.130 mysqld Sep 19 13:21:36 ohuro ResourceManager[6767]: info: Running /etc/ha.d/resource.d/drbddisk r0 start Sep 19 13:21:37 ohuro kernel: drbd0: role( Secondary -> Primary ) Sep 19 13:21:37 ohuro kernel: drbd0: Writing meta data super block now. Sep 19 13:21:38 ohuro Filesystem[6835]: INFO: Resource is stopped Sep 19 13:21:38 ohuro ResourceManager[6767]: info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /var/lib/mysql ext3 start Sep 19 13:21:39 ohuro Filesystem[6915]: INFO: Running start for /dev/drbd0 on /var/lib/mysql Sep 19 13:21:39 ohuro kernel: kjournald starting. Commit interval 5 seconds Sep 19 13:21:39 ohuro kernel: EXT3-fs warning: maximal mount count reached, running e2fsck is recommended Sep 19 13:21:39 ohuro kernel: EXT3 FS on drbd0, internal journal Sep 19 13:21:39 ohuro kernel: EXT3-fs: mounted filesystem with ordered data mode. Sep 19 13:21:39 ohuro Filesystem[6904]: INFO: Success Sep 19 13:21:40 ohuro IPaddr[6982]: INFO: Resource is stopped Sep 19 13:21:40 ohuro ResourceManager[6767]: info: Running /etc/ha.d/resource.d/IPaddr 192.168.254.134 start Sep 19 13:21:41 ohuro IPaddr[7058]: INFO: Using calculated nic for 192.168.159.130: eth0 Sep 19 13:21:41 ohuro IPaddr[7058]: INFO: Using calculated netmask for 192.168.159.130: 255.255.255.0 Sep 19 13:21:42 ohuro IPaddr[7058]: INFO: eval ifconfig eth0:0 192.168.159.130 netmask 255.255.255.0 broadcast 192.168.159.255 Sep 19 13:21:42 ohuro IPaddr[7041]: INFO: Success Sep 19 13:21:44 ohuro ResourceManager[6767]: info: Running /etc/init.d/mysqld start Sep 19 13:21:44 ohuro heartbeat: [4280]: WARN: Late heartbeat: Node toire: interval 10040 ms Sep 19 13:21:45 ohuro heartbeat: [4280]: WARN: Late heartbeat: Node 192.168.159.130: interval 12040 ms Sep 19 13:21:48 ohuro mach_down[6741]: info: /usr/share/heartbeat/mach_down: nice_failback: foreign resources acquired Sep 19 13:21:48 ohuro mach_down[6741]: info: mach_down takeover complete for node toire. Sep 19 13:21:48 ohuro heartbeat: [4280]: info: mach_down takeover complete. Sep 19 13:22:17 ohuro heartbeat: [4280]: WARN: node toire: is dead Sep 19 13:22:17 ohuro heartbeat: [4280]: info: Dead node toire gave up resources. Sep 19 13:22:17 ohuro heartbeat: [4280]: info: Link toire:eth0 dead.
フェイルバックの確認
toire(旧プライマリ)の Heartbeat プロセスを起動して、フェイルバックの動作確認をしてみます。
toire# /etc/init.d/heartbeat start
ohuro の様子はこのようになります。
Sep 19 14:27:22 toire logd: [9610]: info: logd started with default configuration. Sep 19 14:27:22 toire logd: [9610]: info: G_main_add_SignalHandler: Added signal handler for signal 15 Sep 19 14:27:22 toire logd: [9611]: info: G_main_add_SignalHandler: Added signal handler for signal 15 Sep 19 14:27:23 toire heartbeat: [9658]: info: Version 2 support: false Sep 19 14:27:23 toire heartbeat: [9658]: WARN: Logging daemon is disabled --enabling logging daemon is recommended Sep 19 14:27:23 toire heartbeat: [9658]: info: ************************** Sep 19 14:27:23 toire heartbeat: [9658]: info: Configuration validated. Starting heartbeat 2.1.2 Sep 19 14:27:23 toire heartbeat: [9659]: info: heartbeat: version 2.1.2 Sep 19 14:27:23 toire heartbeat: [9659]: info: Heartbeat generation: 1189754312 Sep 19 14:27:23 toire heartbeat: [9659]: info: G_main_add_TriggerHandler: Added signal manual handler Sep 19 14:27:23 toire heartbeat: [9659]: info: G_main_add_TriggerHandler: Added signal manual handler Sep 19 14:27:23 toire heartbeat: [9659]: info: Removing /var/run/heartbeat/rsctmp failed,recreating. Sep 19 14:27:23 toire heartbeat: [9659]: info: glib: ucast: write socket priority set to IPTOS_LOWDELAY on eth0 Sep 19 14:27:23 toire heartbeat: [9659]: info: glib: ucast: bound send socket to device: eth0 Sep 19 14:27:23 toire heartbeat: [9659]: info: glib: ucast: bound receive socket to device: eth0 Sep 19 14:27:23 toire heartbeat: [9659]: info: glib: ucast: started on port 694 interfaceeth0 to 192.168.254.133 Sep 19 14:27:23 toire heartbeat: [9659]: info: glib: ping heartbeat started. Sep 19 14:27:23 toire heartbeat: [9659]: info: G_main_add_SignalHandler: Added signal handler for signal 17 Sep 19 14:27:24 toire heartbeat: [9659]: info: Local status now set to: 'up' Sep 19 14:27:25 toire heartbeat: [9659]: info: Link ohuro:eth0 up. Sep 19 14:27:25 toire heartbeat: [9659]: info: Status update for node ohuro: status active Sep 19 14:27:25 toire heartbeat: [9659]: info: Link 192.168.159.130:192.168.159.130 up. Sep 19 14:27:25 toire heartbeat: [9659]: info: Status update for node 192.168.159.130: status ping Sep 19 14:27:25 toire harc[9668]: info: Running /etc/ha.d/rc.d/status status Sep 19 14:27:26 toire heartbeat: [9659]: info: Comm_now_up(): updating status to active Sep 19 14:27:26 toire heartbeat: [9659]: info: Local status now set to: 'active' Sep 19 14:27:26 toire heartbeat: [9659]: info: Starting child client "/usr/lib/heartbeat/ipfail" (90,90) Sep 19 14:27:26 toire heartbeat: [9685]: info: Starting "/usr/lib/heartbeat/ipfail" as uid 90 gid 90 (pid 9685) Sep 19 14:27:26 toire heartbeat: [9659]: info: remote resource transition completed. Sep 19 14:27:26 toire heartbeat: [9659]: info: remote resource transition completed. Sep 19 14:27:26 toire heartbeat: [9659]: info: Local Resource acquisition completed. (none) Sep 19 14:27:27 toire heartbeat: [9659]: info: ohuro wants to go standby [foreign] Sep 19 14:27:31 toire kernel: drbd0: peer( Primary -> Secondary ) Sep 19 14:27:31 toire heartbeat: [9659]: info: standby: acquire [foreign] resources from ohuro Sep 19 14:27:31 toire heartbeat: [9687]: info: acquire local HA resources (standby). Sep 19 14:27:32 toire ResourceManager[9700]: info: Acquiring resource group: toire drbddisk::r0 Filesystem::/dev/drbd0::/var/lib/mysql::ext3 192.168.159.130 mysqld Sep 19 14:27:32 toire ResourceManager[9700]: info: Running /etc/ha.d/resource.d/drbddisk r0 start Sep 19 14:27:32 toire kernel: drbd0: role( Secondary -> Primary ) Sep 19 14:27:32 toire kernel: drbd0: Writing meta data super block now. Sep 19 14:27:33 toire Filesystem[9768]: INFO: Resource is stopped Sep 19 14:27:34 toire ResourceManager[9700]: info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /var/lib/mysql ext3 start Sep 19 14:27:34 toire Filesystem[9849]: INFO: Running start for /dev/drbd0 on /var/lib/mysql Sep 19 14:27:35 toire kernel: kjournald starting. Commit interval 5 seconds Sep 19 14:27:35 toire kernel: EXT3-fs warning: maximal mount count reached, running e2fsck is recommended Sep 19 14:27:35 toire kernel: EXT3 FS on drbd0, internal journal Sep 19 14:27:35 toire kernel: EXT3-fs: mounted filesystem with ordered data mode. Sep 19 14:27:35 toire Filesystem[9838]: INFO: Success Sep 19 14:27:36 toire IPaddr[9916]: INFO: Resource is stopped Sep 19 14:27:36 toire ResourceManager[9700]: info: Running /etc/ha.d/resource.d/IPaddr 192.168.159.130 start Sep 19 14:27:37 toire IPaddr[9992]: INFO: Using calculated nic for 192.168.159.130: eth0 Sep 19 14:27:37 toire IPaddr[9992]: INFO: Using calculated netmask for 192.168.159.130: 255.255.255.0 Sep 19 14:27:38 toire IPaddr[9992]: INFO: eval ifconfig eth0:0 192.168.159.130 netmask 255.255.255.0 broadcast 192.168.254.255 Sep 19 14:27:38 toire avahi-daemon[2227]: Registering new address record for 192.168.159.130 on eth0. Sep 19 14:27:38 toire IPaddr[9975]: INFO: Success Sep 19 14:27:39 toire ResourceManager[9700]: info: Running /etc/init.d/mysqld start Sep 19 14:27:42 toire heartbeat: [9659]: WARN: Late heartbeat: Node 192.168.159.130: interval 12000 ms Sep 19 14:27:43 toire heartbeat: [9687]: info: local HA resource acquisition completed (standby). Sep 19 14:27:43 toire heartbeat: [9659]: info: Standby resource acquisition done [foreign]. Sep 19 14:27:43 toire heartbeat: [9659]: info: Initial resource acquisition complete (auto_failback) Sep 19 14:27:43 toire heartbeat: [9659]: info: remote resource transition completed. Sep 19 14:27:44 toire heartbeat: [9659]: WARN: Late heartbeat: Node ohuro: interval 12400ms
自動での DRBD、MySQL の フェイルオーバー/フェイルバック が確認できました。
今回は Heartbeat を停止して実施しましたが、実運用では、MySQL サービスが停止した場合にも フェイルオーバーして欲しいものです。これについても後ほど試してみることにします。あと、読み書きの性能も気になります…。