HeartBeatで冗長化

サーバー運用がかなり厳しいので寄付をしてくれる人がいたらこちら
メインPCもボロボロになってきたので、ついにほしいものリスト公開

この情報は古い可能性があります!

ここではPC2台を使ってものすごく単純な冗長化を組む方法をご紹介します。

HP: http://www.linux-ha.org/

いつの間にか2.1.4でHeartBeat単体動作するのが最後と言うことだそうです?
Version2の設定を使うにはPacemakerを利用しないとだめだそうです?

ユーザ作成

groupadd -g 65 haclient
useradd -g haclient -d /var/lib/heartbeat hacluster

libnetのインストール

cd /usr/local/src
wget http://www.packetfactory.net/libnet/dist/libnet.tar.gz
tar zxvf libnet.tar.gz
cd libnet
./configure
make
make install

HeartBeatのインストール

cd /usr/local/src
wget http://hg.linux-ha.org/lha-2.1/archive/STABLE-2.1.4.tar.bz2
tar jxvf STABLE-2.1.4.tar.bz2
cd Heartbeat-STABLE-2-1-STABLE-2.1.4
./bootstrap
./configure \
--prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--disable-fatal-warnings
make
make install
ln -s /etc/init.d/httpd /etc/ha.d/resource.d/httpd

次にLinuxMONというのをインストールして
サービスによる死活監視をします。

cd /usr/local/src
wget http://www.kernel.org/pub/software/admin/mon/mon-1.2.0.tar.gz
tar zxvf mon-1.2.0.tar.gz
cp -r mon-1.2.0 /etc/ha.d/mon

次に以下の設定で行きます。

IPアドレスホスト名サービス種類
192.168.0.1www.momo-i.org無しバーチャル
192.168.0.11www1.momo-i.orghttpd実IP
192.168.0.12www2.momo-i.orghttpd実IP

www1・www2ともに同じ設定をしないと怒られるので同じにします。

/etc/ha.d/ha.cf

debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
bcast eth1 # Linux
baud 19200
auto_failback on
node www1.momo-i.org
node www2.momo-i.org

/etc/ha.d/resources

www1.momo-i.org 192.168.0.11 httpd mon ha-notify
www1.momo-i.org 192.168.0.12 httpd mon ha-notify

/etc/ha.d/authkeys

auth 2
2 sha1 hogehoge

パーミッションの設定

chmod 600 /etc/ha.d/authkeys

/etc/ha.d/resource.d/ha-notify

#!/bin/sh
date=`date`
host=hostname
mailaddr="root"
case "$1" in
start)
mail -s "HA takeover: $host on $date" $mailaddr < /dev/null 1> /dev/null 2> /dev/null
;;
stop)
mail -s "HA relinguished: $host on $date" $mailaddr < /dev/null 1> /dev/null 2> /dev/null
;;
*)
echo "Usage: $0 (start|stop)"
esac

パーミッションの設定

chmod 755 /etc/ha.d/resource.d/ha-notify

次にmonの設定です。

/etc/ha.d/mon/mon.cf

cfbasedir = /etc/ha.d/mon/etc
alertdir = /etc/ha.d/mon/alert.d
mondir = /etc/ha.d/mon/mon.d
statedir = /etc/ha.d/mon/state.d
logdir = /var/log/
maxprocs = 20
histlength = 100
randstart = 10s

authtype = getpwnam

hostgroup momo-i 192.168.0.11 192.168.0.12

watch momo-i
service http
interval 5s
monitor http.monitor -p 80 -u /index.html
allow_empty_group
period wd {Mon-Sun}
alert bring-ha-down.alert -S "web_server_node_member_down" \
webmaster@example.com このメールアドレスは、スパムロボットから保護されています。アドレスを確認するにはJavaScriptを有効にしてください
upalert mail.alert -S "web_server_is_back_up" \
webmaster@example.com このメールアドレスは、スパムロボットから保護されています。アドレスを確認するにはJavaScriptを有効にしてください
alertevery 10s
alertafter 2

/etc/ha.d/mon/mon-start

#!/bin/bash
MON_HOME=/etc/ha.d/mon

case "$1" in
start)
if [ -f $MON_HOME/mon.pid ]; then
echo "mon already started"
exit
fi
echo "Starting Mon"
$MON_HOME/mon -c $MON_HOME/mon.cf -L $MON_HOME -P $MON_HOME/mon.pid &
;;
stop)
if [ -f $MON_HOME/mon.pid ]; then
echo "Stopping Mon"
kill -9 `cat $MON_HOME/mon.pid`
rm -f $MON_HOME/mon.pid
else
echo "no server pid, server doesn't seem to run"
fi

;;
status)
echo "doing good"
;;
*)
echo "Usage: $0 {start|stop|status|reload|restart}"
exit 1
esac
exit 0

リンクの作成

ln -s /etc/ha.d/mon/mon-start /etc/ha.d/resource.d/mon

/etc/ha.d/mon/alert.d/bring-ha-down.alert

/etc/ha.d/mon/alert.d/mail.alert $* /etc/init.d/heartbeat stop

起動設定

chkconfig --add heartbeat
chkconfig --level 235 heartbeat on
/etc/init.d/heartbeat start

こんな感じです。
後は両方で起動をしてIPアドレスがwww1.momo-i.orgが
持っていることを確認したらOKです。

この方法は、あくまでもマシンが死んだりアプリケーションが
死んだと判断できた場合にのみフェイルオーバーを実行するものです。

高負荷によるフェイルオーバーは今のところできないっぽいです。
今度暇なときにでもLinuxで負荷分散装置とかのを書きますか。

予定

STONITHとかwatchdogを使ってみる
他のアプリケーションの冗長化

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
CAPTCHA
また変更しました
Fill in the blank.