heartbeatとDRBD作業ログ + webmin
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 md1
haresources2cib.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 ;; esac
drbdadm 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
とすると復活するかも。