ログ日記

作業ログと日記とメモ

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かたまった???とかいうときに
使ってみると、うまくいったりいかなかったりします。
おまじない(もしくは気休め)として利用しています。

HEARTBEATで使用可能なコマンドが知りたい。 (Linux-ha-jp) - Linux-HA Japan - OSDN


ネットワークを切ったりしていてDRBDがお互いにStandAloneになったら、セカンダリ(データコピー先)で

# プライマリになっていたら drbdadm secondary md1 をしてから
drbdadm invalidate md1

として、両方で

/etc/init.d/drbd start

とすると復活するかも。