|
カテゴリ:カテゴリ未分類
HeartBeat とDRBD によるHAクラスタの構築
HeartBeat (相手先の稼働状況を監視し、サーバが落ちると自動的に自サーバで処理を引き継ぐ) DRBD(ネットワークRAIDディスク) メリット すべてフリーの環境で構築が可能 相手サーバマシーンの死活監視可能 フェイルバック(現状復帰)時にサービスの停止が必要ない デメリット 障害検知からフェイルオーバするまの時間(30秒がデフォルト)サービス停止する・・・調整は可能だが0秒にはできない ポートの監視などには対応していないため、サーバは正常に動いていて、Postgres のみ落ちるなどといった現象には対応できない 構築手順と設定です。 実現した構成 ホスト名 debian-420 IP:192.168.0.95 ホスト名 debian-566 IP:192.168.0.73 仮想ホストIPアドレス IP:192.168.0.222 drbd パッケージ、heartbeat パッケージともにapt-get で取得できます。 ソースをダウンロードしてコンパイルする事も可能ですが、稼動するホスト のDRBD パッケージは両方とも同じバージョンに合わせる必要があります。 ホスト情報 カーネルバージョン、debianバージョン debian-420:/etc/heartbeat# uname -r 2.6.8-2-386 debian-420:/etc/heartbeat# cat /etc/debian_version 3.1 debian-566:/etc/heartbeat# uname -r 2.4.27-2-386 debian-566:/etc/heartbeat# cat /etc/debian_version 3.1 □□□□□ DRBDの構築 □□□□□ ネットワークミラーディスクの作成です。データベースサーバ側でレプリケーションができれば 特に設定する必要がありません。(この点から、レプリケーションのできないデータベースサーバ でも同期を取ることが可能になります。) debian-420:/mnt# dpkg -l |egrep '*drbd*' ii drbd0.7-module-source0.7.10-4 RAID 1 over tcp/ip for Linux module source ii drbd0.7-utils 0.7.10-4 RAID 1 over tcp/ip for Linux utilities ii module-assistant 0.9sarge1 tool to make module package creation easier 設定ファイル 両PCともに同じ設定にする /etc/drbd.conf resource drbd0 { #DRBD リソース名 protocol C; #リモート、ローカルディスクに書込みを確認後、書込み完了とする incon-degr-cmd "halt -f"; #縮退した時には停止する syncer { #同期条件 rate 20M; #同期時の速度上限 group 1; #同じグループのデバイスをすべて同期する al-extents 7; # } on debian-420 { #ホスト debian-420 上の設定 device /dev/drbd1; #共有デバイス名を /dev/drbd1 とする disk /dev/sdb1; #ローカルのディスク /dev/sdb1 を共有スペースにする address 192.168.0.95:7789; #自分のIPアドレスと待ちうけポート meta-disk internal; } on debian-566 { device /dev/drbd1; disk /dev/hda3; address 192.168.0.73:7789; meta-disk internal; } } 2台のマシーンでdrbd をスタートする /etc/init.d/drbd start 以下は、DRBD の基本操作 (heartbeat によるフェイルオーバを実現するときには、heartbeat でスクリプトを実行する 形になるため、以下の設定はしなくても良い) primary にしたいマシーンで drbdadm -- --do-what-I-say privary al と実行すると、DRBDのプライマリディスクとなる ファイルシステムの作成とネットワークraid ディスクのマウント mke2fs -j /dev/drbd1 #ext3 にて作成して mkdir /mnt/nd0 #nd0ディレクトリを作成し mount /dev/drbd1 /mnt/nd0 #マウントしてみた 注意:drbd デバイスは、両方のサーバで同時にマウントする事はできない 何か書き込んだ後に、相手方のハードディスクに反映されているかを確認する 現在マウントしているサーバで、 drbdドライブをアンマウントし、 # umount /mnt/drbd1 drbdリソースをセカンダリにする # drbdadm secondary drbd0 相手方のサーバでdrbdリソースをプライマリ設定にし # drbdadm primary drbd0 drbdドライブをマウントする # mount /dev/drbd0 /mnt/drbd # ls /dev/drbd0 とすると、別サーバで書き込んだ内容が分かる □□□□□ HeartBeatの構築(DRBDとの連携) □□□□□ HeartBeat の仕組みは、preferred nodes(優先サーバ)が仮想IPアドレス(linuxのIPエイリアス) を持ち、preferred nodesが落ちたらsecondary nodes(待機サーバ)が仮想IPアドレスを引き継ぎ 設定されたスクリプトを実行します。 preferred nodesのIPalias 状況 eth0:0 リンク方法:イーサーネット ハードウェアアドレス 00:13:20:18:29:62 inetアドレス:192.168.0.222 ブロードキャスト:192.168.0.255 マスク:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 割り込み:169 heartbeatパッケージ ii heartbeat 1.2.3-9sarge4 Subsystem for High-Availability Linux 設定ファイルは3つ /etc/heartbeat ha.cf #基本設定ファイル オプションの設定を行う haresources #フェイルオーバするときのスクリプト実行など設定 authkeys #認証ファイル フェイルオーバするサーバ同士の認証方法、キーを設定する(アクセス権は600とする事) 上記設定ファイルのテンプレートは /usr/share/doc/heartbeat/ にあるので必要があればコピーして利用する ■基本設定ファイル /etc/heartbeat/ha.cf debugfile /var/log/ha-debug #デバッグログの表示 logfile /var/log/ha-log #heartbeat ログの表示 logfacility local0 #ローカルのシスログにも表示 keepalive 2 #2秒ごとにheartbeatパケットを送出する deadtime 30 #クラスタ先が停止していると判断するまでの時間(秒) udpport 694 #クラスタ先とコミュニケーションするポート ucast eth0 192.168.0.73 #ユニキャストでeth0 を使って192.168.0.73 にコミュニケーションパケットを送出 auto_failback on #primary ノードが復旧した際に自動的にprimary ノードにフェイルバックする node debian-420 debian-566 #クラスターになるコンピュータ名を列挙 uname -n で表示される名前にする ■認証設定ファイル /etc/heartbeat/authkeys #認証ファイル 権限は600 にすべし auth 3 #認証形式を3 md5 とする 3 md5 Hello! #認証キー Hello!(他クラスタでも同等の値を設定) ■フェイルオーバリソース設定ファイル /etc/heartbeat/haresource を書き換える debian-420 192.168.0.222 drbdisk::drbd0 #優先ホスト 仮想IPアドレス スクリプト::引数 スクリプト::引数 スクリプト::引数 ・・・ #フェイルオーバして、自ホストが優先になった場合に実行するスクリプトなどの指定 スクリプトファイルは、resource.d に設置する drbd との連携が最初から考えられていて、drbddisk というスクリプトが準備 されているが、このファイルはdrbd のプライマリ、セカンダリを設定するところ までは書いてあるが、ドライブとしてマウントするところまで書いていない スクリプトにmount /dev/drbd1 を書き加えた。 (ここにDB2 なりPostgres なりのスクリプトを書き込む事で、処理を引き継いだ時に実行する事もできる) フェイルオーバした時に実行されるスクリプト /etc/heartbeat/resource.d/drbddisk #!/bin/bash # # This script is inteded to be used as resource script by heartbeat # # Jan 2003 by Philipp Reisner. # ### DEFAULTFILE="/etc/default/drbd" DRBDADM="/sbin/drbdadm" if [ -f $DEFAULTFILE ]; then . $DEFAULTFILE fi if [ "$#" -eq 2 ]; then RES="$1" CMD="$2" else RES="all" CMD="$1" fi case "$CMD" in start) # try several times, in case heartbeat deadtime # was smaller than drbd ping time try=6 while true; do $DRBDADM primary $RES && break let "--try" || exit 20 sleep 1 done mount /dev/drbd1 #書き加えた行 ;; stop) # exec, so the exit code of drbdadm propagates umount /dev/drbd1 #書き加えた行 exec $DRBDADM secondary $RES ;; status) if [ "$RES" = "all" ]; then echo "A resource name is required for status inquiries." exit 10 fi ST=$( $DRBDADM state $RES 2> /dev/null ) ST=${ST%/*} if [ "$ST" = "Primary" ]; then echo "running" else echo "stopped" fi ;; *) echo "Usage: drbddisk [resource] {start|stop|status}" exit 1 ;; esac exit 0 ■■■■■ 実際の動作 ■■■■■ 今回のDRBD と HeartBeat の設定により以下のように動作する 1.2台のパソコンが仮想IPアドレス192.168.0.222 1台として動作しているように見える 2.2台のパソコンには /dev/drbd1 という共有ディスクがある 3.preferred nodes が落ちた時には secondary nodes に処理が引き継がれる(フェイルオーバ) (secondary nodes が落ちても何も起こらない) 4.preferred nodes が復旧したときには自動的にpreferred nodesに処理が戻る(フェイルバック) (設定によって手動にてフェイルバックする事が可能) 5.フェイルオーバ時には、preferred nodes では自動的に drbdディスクをアンマウトしdrbd をsecondary に降格させ、 secondary nodesのdrbd がprimary に昇格され、drbdディスクをマウントする 6.フェイルバック時には、secondary nodes では自動的に drbdディスクをアンマウトしdrbd をsecondary に降格させ、 preferred nodesのdrbd がprimary に昇格され、drbdディスクをマウントする お気に入りの記事を「いいね!」で応援しよう
Last updated
Apr 27, 2006 08:16:28 PM
コメント(0) | コメントを書く |