Debian squeeze のパッケージインストールでは、アクセス権が適切に設定されないようなので設定する。
chown hacluster:haclient /var/lib/heartbeat/crm/ chown hacluster:haclient /var/lib/heartbeat/pengine/
heartbeatの設定。
cd /etc/ha.d/ # lv /usr/share/doc/heartbeat/ha.cf.gz cat > ha.cf crm on logfile /var/log/ha-log keepalive 3 deadtime 30 deadping 40 warntime 10 initdaed 60 udpport 694 mcast eth0 239.0.0.43 node vivace node allegro autojoin none ( echo -ne "auth 1\n1 sha1 "; \ dd if=/dev/urandom bs=512 count=1 | openssl md5 ) \ > /etc/ha.d/authkeys chmod 0600 /etc/ha.d/authkeys /usr/lib/heartbeat/ha_propagate # chkconfig のエラーが出るが気にしない
ここではmcastにしているが、テスト中はucastの方がいいかも。
cat > haresources-ip vivace IPaddr2::192.168.1.12/24/eth0 /usr/lib/heartbeat/haresources2cib.py haresources-ip /etc/init.d/heartbeat start crm_mon -i 3
しばらくするとIPアドレスが割り当てられる。
切り替えテスト。
ip addr show crm_resource -r IPaddr2_1 -M ip addr show crm_resource -r IPaddr2_1 -M ip addr show
DRBDはMDデバイス上のLVM上に構築する。
for device in /dev/sda /dev/sdb; do /sbin/sfdisk $device << EOF ,,L EOF /sbin/sfdisk $device -uM << EOF ,153600,fd ,,E ; ; ,10240,S EOF done mdadm -C /dev/md1 -l1 -n2 /dev/sd[ab]1 echo "DEVICE /dev/sd[ab]1" >> /etc/mdadm/mdadm.conf mdadm -Ds >> /etc/mdadm/mdadm.conf pvcreate /dev/md1 vgcreate vg1 /dev/md1 lvcreate vg1 -n lvdrbd -L 140G
DRBDの設定。
cat > /etc/drbd.d/md1.res
resource md1 {
protocol C;
syncer {
rate 100M;
}
disk {
on-io-error detach;
}
on vivace{
device /dev/drbd1;
disk /dev/vg1/lvdrbd;
address 192.168.1.204:7789;
meta-disk internal;
}
on allegro {
device /dev/drbd1;
disk /dev/vg1/lvdrbd;
address 192.168.1.205:7789;
meta-disk internal;
}
}
dd if=/dev/zero of=/dev/vg1/lvdrbd bs=1M count=1
drbdadm create-md md1
/etc/init.d/drbd start
# プライマリ側で
drbdadm -- --overwrite-data-of-peer primary all
mkfs.ext3 /dev/drbd1
heartbeatの設定。
/etc/init.d/heartbeat stop rm -f /var/lib/heartbeat/crm/* cat > haresources-drbd vivace \ IPaddr2::192.168.1.12/24/eth0 \ drbddisk::md1 \ Filesystem::/dev/drbd1::/mnt/drbd1::ext3 /usr/lib/heartbeat/haresources2cib.py haresources-drbd /etc/init.d/heartbeat start crm_mon -i 3
heartbeatをstopしてフェイルオーバーを確認。
webminを入れる。
cat >> /etc/fstab /dev/drbd1 /mnt/drbd1 ext3 usrquota,grpquota 0 0 aptitude install bind9 postfix apache2-mpm-prefork apache2-suexec-custom libapache2-mod-suphp \ webalizer spamassassin procmail clamav mysql-server postgresql proftpd dovecot-pop3d dovecot-imapd quota
色々設定する。 IPはIPaddr2で設定するIPを使う。
ディレクトリの設定。
/etc/init.d/heartbeat stop
drbdadm primary md1
mount /dev/drbd1 /mnt/drbd1/
/etc/init.d/apache2 stop
/etc/init.d/dovecot stop
/etc/init.d/postfix stop
/etc/init.d/mysql stop
/etc/init.d/postgresql-8.4 stop
/etc/init.d/proftpd stop
update-rc.d apache2 remove
update-rc.d dovecot remove
update-rc.d postfix remove
update-rc.d mysql remove
update-rc.d postgresql-8.4 remove
update-rc.d proftpd remove
cp -a /home /mnt/drbd1/
mkdir -p /mnt/drbd1/var/lib
cp -a /var/lib/postfix /var/lib/postgresql /var/lib/mysql /var/lib/clamav /mnt/drbd1/var/lib/
cat >> /etc/drbdlinks.conf
mountpoint('/mnt/drbd1')
link('/home/')
link('/var/lib/postfix/')
link('/var/lib/postgresql/')
link('/var/lib/mysql/')
link('/var/lib/clamav')
rm -f /var/lib/heartbeat/crm/*
cat > haresources-drbd
vivace \
IPaddr2::192.168.1.12/24/eth0 \
drbddisk::md1 \
Filesystem::/dev/drbd1::/mnt/drbd1::ext3 \
drbdlinks \
proftpd postfix dovecot clamav-freshclam mysql postgresql-8.4 apache2
/usr/lib/heartbeat/haresources2cib.py haresources-drbd
umount /mnt/drbd1
drbdadm secondary md1haresources2cib.py は resources.d にないファイルは /etc/init.d/ を見るようになってるっぽい。
セカンダリ側もwebminを入れて上記のstop & remove と haresources2cib.py を実行する。
drbdlinks.confもコピーする。
自動起動テスト。
/etc/init.d/heartbeat start
うまくいかなかった場合はharesources-drbdの最後の行のサービスを一つずつ追加したり crm_mon -i 1 で調べる。
この流れで試したらうまくいかなかった。
dovecotがダメぽい。ログを見てるとstatus=4でエラーになっていた。
http://blog.suz-lab.com/search/label/Heartbeat
dovecotは停止しているときにstatusを実行すると4が返ってくる。
これはstatus_of_proc関数を使っていて、定義は /lib/lsb/init-functions にあるようだ。
status_of_proc関数は、PIDファイルを指定している場合かつPIDファイルがない場合はstatus=4を返す。多分。
起動スクリプトが3を返すように修正。
status)
#status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $?
status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || status=$?
if [ $status -eq 4 ];then
exit 3
fi
exit $status
;;
webminも起動スクリプトの終了ステータスを全体的に修正して追加。
case "$1" in
'start')
if [ -f $pidFile ]; then
exit 0
fi
$start >/dev/null 2>&1 </dev/null
RETVAL=$?
if [ "$RETVAL" = "0" ]; then
touch $lockfile >/dev/null 2>&1
fi
;;
'stop')
if [ ! -f $pidFile ]; then
exit 0
fi
$stop
RETVAL=$?
if [ "$RETVAL" = "0" ]; then
rm -f $lockfile
fi
pidfile=`grep "^pidfile=" $confFile | sed -e 's/pidfile=//g'`
if [ "$pidfile" = "" ]; then
pidfile=$pidFile
fi
rm -f $pidfile
;;
'status')
pidfile=`grep "^pidfile=" $confFile | sed -e 's/pidfile=//g'`
if [ "$pidfile" = "" ]; then
pidfile=$pidFile
fi
if [ -s $pidfile ]; then
pid=`cat $pidfile`
kill -0 $pid >/dev/null 2>&1
if [ "$?" = "0" ]; then
echo "$name (pid $pid) is running"
RETVAL=0
else
echo "$name is stopped"
RETVAL=3
fi
else
echo "$name is stopped"
RETVAL=3
fi
;;
'restart')
$stop ; $start
RETVAL=$?
;;
*)
echo "Usage: $0 { start | stop | restart }"
RETVAL=1
;;
esacdrbdadm primary md1
mount /dev/drbd1 /mnt/drbd1
mkdir /mnt/drbd1/etc
cp -a /etc/webmin /mnt/drbd1/etc/webmin/
cp -a /var/webmin /mnt/drbd1/var/
cp -a /etc/mysql /mnt/drbd1/etc/
vi /etc/drbdlinks
# 以下を追加してセカンダリにもコピー
link('/etc/webmin/')
link('/var/webmin/')
link('/etc/mysql/')webminの設定は/etc/webmin、セッションは/var/webminにある。
mysqlのrootパスワードが/etc/mysql/debian.cnfに保存されているので、/etc/mysqlもミラーリング対象にする。これが設定されていないとサービスの開始/停止が中途半端になる。
mysqlはocfではなくlsbを使うようにしてみる。
ln -s /etc/init.d/mysql /etc/init.d/mysql-5.1 cat > haresources-drbd vivace \ IPaddr2::192.168.1.12/24/eth0 \ drbddisk::md1 \ Filesystem::/dev/drbd1::/mnt/drbd1::ext3 \ drbdlinks \ proftpd postfix dovecot clamav-freshclam mysql-5.1 postgresql-8.4 apache2 webmin
ここまででheartbeatのstopによるフェイルオーバーはできた。
問題は、例えばmysql stopが完了しなかった場合にどういう動作になるか、など…。現状ではそこでフリーズみないなことになった。管理用のコマンドなどや動作を把握しないとね。
DRBDに関しては
http://www.drbd.jp/users-guide/s-heartbeat-crm.html
この辺。
ここまで色々サーバを入れるなら自動でやらない方がいいのかもしれない。
メモ。
> 又、使用して便利だったコマンド等があれば知りたいです。
# crm_resource -C -r <リソース名> -H <ノード名>
umanagedになってしまったリソースの状態を一掃することができます。
HEARTBEATで使用可能なコマンドが知りたい。 (Linux-ha-jp) - Linux-HA Japan - OSDN
なんかよくわからんけど、Heartbeatかたまった???とかいうときに
使ってみると、うまくいったりいかなかったりします。
おまじない(もしくは気休め)として利用しています。
ネットワークを切ったりしていてDRBDがお互いにStandAloneになったら、セカンダリ(データコピー先)で
# プライマリになっていたら drbdadm secondary md1 をしてから drbdadm invalidate md1
として、両方で
/etc/init.d/drbd start
とすると復活するかも。