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
  • /etc/drbd.conf
  • 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) の設定ファイルです。

  • /etc/ha.d/ha.cf
  • # ログの出力先を指定(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 ファイル

  • /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 で行います。

  • /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)は サービスの起動スクリプト名を指定します。起動スクリプトは、

    1. /etc/ha.d/resource.d
    2. /etc/init.d

    の順に探していきます。

    認証の設定

    ノード間の認証の設定は /etc/ha.d/authkeys で行います。crc、sha1、md5 の3種類が使えます。crc はキーが必要なく、最も負荷の小さい方式です。sha1 は最も信頼性が高く、その次に md5 が信頼できる認証になっています。信頼できるメソッドであればあるほど処理効率は悪くなります。これもプライマリ、セカンダリで同じ設定にしておきます。

    crc を使う例(今回は CRC を使います)

  • /etc/ha.d/authkeys
  • 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 の様子はこのようになります。何が起きているかよくわかります。

  • /var/log/messages
  • 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 の様子はこのようになります。

  • /var/log/messages
  • 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 サービスが停止した場合にも フェイルオーバーして欲しいものです。これについても後ほど試してみることにします。あと、読み書きの性能も気になります…。

    カテゴリー: Linux Bookmark the permalink. MySQL DRBD Heartbeat HA はコメントを受け付けていません。

    Comments are closed.