drbdadm primary コマンドを実行したあと、自分がちゃんと Primary になったのを確認してから iscsi-target を起動しよう、という話。
1ヶ月ほど前から DRBD + Keepalived + iSCSI target を VMware ESXi から使うメモ - 酒日記 はてな支店 で検証した構成を元に、実マシンで iSCSI target を作って ESXi から使用中。
# 15台ほどの VM を乗っけて試験運用
DRBD の failover を起こす際に、以下のようなスクリプトを実行しているのだけど
#!/bin/sh # backup -> master になるときに実行 drbdadm primary all service iscsi-target start
#!/bin/sh # master -> backup になるときに実行 service iscsi-target stop drbdadm secondary all
backup が master に昇格する際、"drbdadm primary all" から返ってきた直後に、実際に Primary じゃないのに iscsi-target を起動してしまうと
kernel: iscsi_trgt: open_path(119) Can't open /dev/drbd1 -30 kernel: iscsi_trgt: fileio_attach(283) -30 ietd: Can't create a logical unit 30 1 1 Path=/dev/drbd1,Type=fileio
とエラーが起きるものの、ietd は起動してしまうので iSCSI のリクエストを処理しようとして固まると。
ちゃんと自分が Primary になったことを確認してから iscsi-target を起動する必要がある。
#!/bin/sh while /bin/true; do drbdadm primary all PRIMARY=`cat /proc/drbd | egrep "st:Primary/"` if [ -z "$PRIMARY" ]; then echo "not primary" sleep 1 else echo "primary" service iscsi-target start exit fi done
とここまで書いて、考えてみたら、最初のスクリプトは drbdadm primary が成功したかどうか考慮してないことに気がついた。もしかして単に失敗してたのか。