DRBD + Keepalived + iSCSI target を VMware ESXi から使うメモ

単なるメモです。

という構成ができた。OS は CentOS-5.2。

仮想マシンで make などをして、IO がガリガリ起きている状態で failover (マスターになっているマシンの電源断とか) しても、仮想マシン側では IO が数秒待たされるだけで特にエラーなどは起きず。結構気持ちいいなこれ。

ただし、DRBD のプロトコルが A or C だと大丈夫だが、B だと仮想マシン側で IO error が大量発生。A だと信頼性が不安だし、C だと速度でなさそうだし、というのがちょっと悩みどころかも。
# DRBD のホスト自体を仮想マシンで構築したので、速度は計測していない。

以下インストールと設定のメモ。
ちなみに DRBD + Keepalived の部分はおなじみの

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

ほとんどそのままです。

  • VIP: 192.168.0.40
  • drbd1: 192.168.0.41
  • drbd2: 192.168.0.42
# yum install drbd82 kmod-drbd82
# tar zxvf keepalived-1.1.15.tar.gz
# cd keepalived-1.1.15
# ./configure
# make
# make rpm          # rpm ができる
# rpm -Uvh keepalived-1.1.15-5.i386.rpm
# rpm -Uvh daemontools-toaster-0.76-1.3.3.i386.rpm

/etc/drbd.conf

common { syncer { rate 100M; } } 
resource r1 {
  protocol C;
  on drbd1 {
    device    /dev/drbd1;
    disk      /dev/sdc;
    address   192.168.0.41:7790;
    meta-disk internal;
  }
  on drbd2 {
    device    /dev/drbd1;
    disk      /dev/sdc;
    address   192.168.0.42:7790;
    meta-disk internal;
  }
}
# modprobe drbd
# drbdadm create-md all    # メタディスク作成 (両方で)
# drbdadm up all           # 起動 (両方で)
# drbdadm -- --overwrite-data-of-peer primary all # 最初に primary -> secondary の同期を取る (ホストdrbd1のみ)
# cat /proc/drbd           # 状態を見る

iSCSI Enterprise Target のインストール。

# yum install kernel-devel
# tar zxvf iscsitarget-0.4.16.tar.gz
# cd iscsitarget-0.4.16
# make
# make install

/etc/ietd.conf

Target iqn.2008-10.com.topicmaker.internal.drbdtest
  Lun 1 Path=/dev/drbd1,Type=fileio
  Alias drbd-test

Keepalived VRRP の設定。
/etc/keepalived/keepalived.conf

vrrp_instance DRDB {
  state BACKUP
  interface eth0
  garp_master_delay 5
  virtual_router_id 200
  priority 100
  nopreempt
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass XXXX
  }
  virtual_ipaddress {
    192.168.0.40/24 dev eth0
  }
  notify_master "/usr/local/sbin/drbd-master"
  notify_backup "/usr/local/sbin/drbd-backup"
  notify_fault  "/usr/local/sbin/drbd-backup"
}

マスターになったときに行う処理 /usr/local/sbin/drbd-master

#!/bin/sh
drbdadm primary all
service iscsi-target start

バックアップになったときに行う処理 /usr/local/sbin/drbd-backup

#!/bin/sh
service iscsi-target stop
drbdadm secondary all

daemontools から keepalived を起動するためのスクリプト /etc/daemon/keepalived/run

#!/bin/sh
[ -f /var/run/vrrp.pid ] && exit
exec 2>&1
trap 'kill -TERM $PID' TERM
trap 'kill -HUP  $PID' HUP
trap 'kill -INT  $PID' INT
keepalived -n -S 1 --vrrp &
PID=$!
wait $PID
/usr/local/sbin/drbd-backup

/etc/inittab に以下を追加

# daemontools
SV:123456:respawn:/usr/bin/svscanboot