この情報は古い可能性があります!
ここではPC2台を使ってものすごく単純な冗長化を組む方法をご紹介します。
いつの間にか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.1 | www.example.com | 無し | バーチャル |
192.168.0.11 | www1.example.com | httpd | 実IP |
192.168.0.12 | www2.example.com | httpd | 実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.example.com
node www2.example.com
/etc/ha.d/resources
www1.example.com 192.168.0.11 httpd mon ha-notify
www1.example.com 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 example.com 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
upalert mail.alert -S "web_server_is_back_up" \
webmaster@example.com
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.example.comが
持っていることを確認したらOKです。
この方法は、あくまでもマシンが死んだりアプリケーションが
死んだと判断できた場合にのみフェイルオーバーを実行するものです。
高負荷によるフェイルオーバーは今のところできないっぽいです。
今度暇なときにでもLinuxで負荷分散装置とかのを書きますか。
予定
STONITHとかwatchdogを使ってみる
他のアプリケーションの冗長化
コメントを追加