OpenfilerでDRBDを使う

VMware用ストレージとしてOpenfilerにiSCSIでアクセスすることを検討しています。Openfiler単体はWebインタフェースからiSCSIの設定まで簡単にできるので問題ないのですが、せっかくなのでDRBD+Heartbeatを使って二重化したいと思い、VMware環境で検証しています。ほとんど↓のままですが。
Installing and Configuring Openfiler with DRBD and Heartbeat | HowtoForge - Linux Howtos and Tutorials
もう少し具体的にいうと、データ用ボリュームと、Openfilerと各種サービスの設定ファイルをDRBDにより同期させて、プライマリサーバの障害発生時にHeartbeatによりフェイルオーバーさせるという構成を構築します。Webの管理画面を含むOpenfilerへのアクセスは、Heartbeatによる仮想IPアドレスを使用します。

準備

OpenfilerのサイトからVMware用のVirtual Applianceをダウンロードしておきます。このファイルから2台分のOpenfilerを準備してVMを起動します。データ用としてハードディスクを追加しておきます。今回はSCSIで8GBのディスクを追加しました。

サーバ名/IPアドレスの変更

Webの管理ページにログインします。初期状態ではDHCPを使用する設定になっており、コンソールにURLが表示されています。ログインのID/パスワードはopenfiler/passwordです。
Systemタブから、サーバ名とIPアドレスを変更しておきます。今回は以下の設定にします。

  • プライマリサーバ
    1. サーバ名:openfiler01
    2. IPアドレス:192.168.0.50
  • セカンダリサーバ
    1. サーバ名:openfiler02
    2. IPアドレス:192.168.0.51

rootパスワードの変更

初期状態ではrootパスワードは設定されていないので、コンソールからrootでログインし、passwdコマンドでパスワードを設定します。これ以降はsshでログインして作業します。

hostsファイルの変更

それぞれのサーバの/etc/hostsにサーバを登録します。

# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1               openfiler01 openfiler01 localhost.localdomain localhost
192.168.0.51            openfiler02
# Do not remove the following line,pi or various programs
# that require network functionality will fail.
127.0.0.1               openfiler02 openfiler02 localhost.localdomain localhost
192.168.0.50            openfiler01

sshの鍵の作成

SSHの鍵を作成し、公開鍵をお互いに登録しておきます。

[root@openfiler01 ~]# ssh-keygen -t dsa
[root@openfiler01 ~]# scp .ssh/id_dsa.pub root@openfiler02:~/.ssh/authorized_keys2
[root@openfiler02 ~]# ssh-keygen -t dsa
[root@openfiler02 ~]# scp .ssh/id_dsa.pub root@openfiler01:~/.ssh/authorized_keys2

ssh-keygenでは、いくつか質問されますが何も入力せずにEnterを入力します。

パーティションの作成

追加したHDDであるsdbに

  • Openfiler設定ファイル用(512MB)
  • データ用(残り)

の2つのパーティションをfdiskで作成します。

[root@openfiler01 ~]# fdisk /dev/sdb
...
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1044, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1044, default 1044): +512M

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (64-1044, default 64):
Using default value 64
Last cylinder or +size or +sizeM or +sizeK (64-1044, default 1044):
Using default value 1044

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

以下のような構成になります。

  • sda1:Openfiler
  • sdb1:設定ファイル用
  • sdb2:データ用

openfiler02でも同様にパーティションを作成します。

drbd.conf

openfiler01にて、/etc/drbd.confを以下の内容に変更します。

iglobal {
 # minor-count 64;
 # dialog-refresh 5; # 5 seconds
 # disable-ip-verification;
 usage-count ask;
}

common {
 syncer { rate 100M; }
}

resource cluster_metadata {
 protocol C;
 handlers {
  pri-on-incon-degr "echo O > /proc/sysrq-trigger ; halt -f";
  pri-lost-after-sb "echo O > /proc/sysrq-trigger ; halt -f";
  local-io-error "echo O > /proc/sysrq-trigger ; halt -f";
  # outdate-peer "/usr/sbin/drbd-peer-outdater";
 }
 
 startup {
  # wfc-timeout 0;
  degr-wfc-timeout 120; # 2 minutes.
 }

 disk {
  on-io-error detach;
 }

 net {
  after-sb-0pri disconnect;
  after-sb-1pri disconnect;
  after-sb-2pri disconnect;
  rr-conflict disconnect;
 }

 syncer {
  # rate 10M;
  # after "r2";
  al-extents 257;
 }

 on openfiler01 {
  device /dev/drbd0;
  disk /dev/sdb1;
  address 192.168.0.50:7788;
  meta-disk internal;
 }

 on openfiler02 {
  device /dev/drbd0;
  disk /dev/sdb1;
  address 192.168.0.51:7788;
  meta-disk internal;
 }
}

resource vg0drbd {
 protocol C;
 startup {
  wfc-timeout 0; ## Infinite!
  degr-wfc-timeout 120; ## 2 minutes.
 }

 disk {
  on-io-error detach;
 }

 net {
  # timeout 60;
  # connect-int 10;
  # ping-int 10;
  # max-buffers 2048;
  # max-epoch-size 2048;
 }

 syncer {
  after "cluster_metadata";
 }

 on openfiler01 {
  device /dev/drbd1;
  disk /dev/sdb2;
  address 192.168.0.50:7789;
  meta-disk internal;
 }

 on openfiler02 {
  device /dev/drbd1;
  disk /dev/sdb2;
  address 192.168.0.51:7789;
  meta-disk internal;
 }
}

cluster_metadataとvg0drbdの二つのリソースを設定しています。
このファイルをopenfiler02にコピーします。

[root@openfiler01 ~]# scp /etc/drbd.conf root@openfiler02:/etc/drbd.conf

メタデータの初期化

メタデータを初期化します。

[root@openfiler01 ~]# drbdadm create-md cluster_metadata
[root@openfiler01 ~]# drbdadm create-md vg0drbd
[root@openfiler02 ~]# drbdadm create-md cluster_metadata
[root@openfiler02 ~]# drbdadm create-md vg0drbd

DRBDサービスの起動

[root@openfiler01 ~]# service drbd start
[root@openfiler02 ~]# service drbd start

サービスが起動しノードが接続されると、以下のようにConnectedと表示されます。

[root@openfiler01 ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.2.7 (api:88/proto:86-88)
GIT-hash: 61b7f4c2fc34fe3d2acf7be6bcc1fc2684708a7d build by phil@fat-tyre, 2008-11-12 16:47:11
m:res               cs         st                   ds                         p  mounted  fstype
0:cluster_metadata  Connected  Secondary/Secondary  Inconsistent/Inconsistent  C
1:vg0drbd           Connected  Secondary/Secondary  Inconsistent/Inconsistent  C

openfiler01をプライマリに設定します。

[root@openfiler01 ~]# drbdsetup /dev/drbd0 primary -o
[root@openfiler01 ~]# drbdsetup /dev/drbd1 primary -o

データのミラーリングが開始されます。vg0drbdのサイズが大きい場合には完了するまでに時間がかかります(検証用であればサイズは小さめにしておいた方がよいです)。

[root@openfiler01 ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.2.7 (api:88/proto:86-88)
GIT-hash: 61b7f4c2fc34fe3d2acf7be6bcc1fc2684708a7d build by phil@fat-tyre, 2008-11-12 16:47:11
m:res               cs          st                 ds                     p  mounted  fstype
0:cluster_metadata  Connected   Primary/Secondary  UpToDate/Inconsistent  C
...                 sync'ed:    0.4%               (7673/7694)M
1:vg0drbd           SyncSource  Primary/Secondary  UpToDate/Inconsistent  C

DRBDの起動設定

サーバ起動時にDRBDのサービスを起動するように設定します。

[root@openfiler01 ~]# chkconfig --level 2345 drbd on
[root@openfiler02 ~]# chkconfig --level 2345 drbd on

ファイルシステムの作成

Openfilerやサービスの設定ファイルを保存するために、drbd0にファイルシステムを作成します。

[root@openfiler01 ~]# mkfs.ext3 /dev/drbd0

LVMパーティションの設定

/dev/drbd1にPhysical Volumeを作成します。まず、/etc/lvm/lvm.confを変更します。

filter = [ "a/.*/" ]

の部分を以下のように変更します。

filter = [ "r|/dev/sdb2|" ]

openfiler02でも同様に変更します。
次に、openfiler01にて、LVM Physical Volumeを作成します。この作業はopenfiler01のみです。openfiler02はDRBDで複製されます。

[root@openfiler01 ~]# pvcreate /dev/drbd1
  Physical volume "/dev/drbd1" successfully created

Heartbeatの設定

/etc/ha.d/authkeysファイルを以下の内容で作成します。

auth 2
2 crc

ファイルのパーミッションを変更します。

[root@openfiler01 ~]# chmod 600 /etc/ha.d/authkeys
[root@openfiler02 ~]# chmod 600 /etc/ha.d/authkeys

/etc/ha.d/ha.confを以下の内容で作成します。

debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
bcast eth0
keepalive 5
warntime 10
deadtime 120
initdead 120
udpport 694
auto_failback on
node openfiler01
node openfiler02

Heartbeatの起動設定

サーバ起動時にサービスが自動起動するように設定します。

[root@openfiler01 ~]# chkconfig --level 2345 heartbeat on
[root@openfiler02 ~]# chkconfig --level 2345 heartbeat on

Openfilerの設定ファイルの移動

DRDBで同期させるために、Openfierの各種設定を/drdb0にコピーしてシンボリックリンクを張ります。

openfiler01での作業
mkdir /cluster_metadata
mount /dev/drbd0 /cluster_metadata
mv /opt/openfiler/ /opt/openfiler.local
mkdir /cluster_metadata/opt
cp -a /opt/openfiler.local /cluster_metadata/opt/openfiler
ln -s /cluster_metadata/opt/openfiler /opt/openfiler
rm /cluster_metadata/opt/openfiler/sbin/openfiler
ln -s /usr/sbin/httpd /cluster_metadata/opt/openfiler/sbin/openfiler
rm /cluster_metadata/opt/openfiler/etc/rsync.xml
ln -s /opt/openfiler.local/etc/rsync.xml /cluster_metadata/opt/openfiler/etc/

/opt/openfiler.local/etc/rsync.xmlを以下の内容に変更します。


192.168.0.51"/> ## IP address of peer node.








mkdir -p /cluster_metadata/etc/httpd/conf.d
openfiler02での作業
mkdir /cluster_metadata
mv /opt/openfiler/ /opt/openfiler.local
ln -s /cluster_metadata/opt/openfiler /opt/openfiler

/opt/openfiler.local/etc/rsync.xmlを以下の内容に変更します。


192.168.0.50"/> ## IP address of peer node.








HAクラスタの設定

openfiler01にて、/cluster_metadata/opt/openfiler/etc/cluster.xmlを以下の内容に変更します。





192.168.0.52/24" />





192.168.0.52がアクセスする仮想IPアドレスです。フェイルオーバー時にLVMボリュームグループとcluster_metadataをマウントしています。

各種サービスの設定(openfiler01)

各種サービスの設定ファイルをcluster_metadata上に移動しシンボリックリンクを張ります。

SambaとNFS
mkdir /cluster_metadata/etc
mv /etc/samba/ /cluster_metadata/etc/
ln -s /cluster_metadata/etc/samba/ /etc/samba
mkdir -p /cluster_metadata/var/spool
mv /var/spool/samba/ /cluster_metadata/var/spool/
ln -s /cluster_metadata/var/spool/samba/ /var/spool/samba

service portmap stop
service rpcidmapd stop
umount /var/lib/nfs/rpc_pipefs
mkdir -p /cluster_metadata/var/lib
mv /var/lib/nfs/ /cluster_metadata/var/lib/
ln -s /cluster_metadata/var/lib/nfs/ /var/lib/nfs
mount -t rpc_pipefs sunrpc /var/lib/nfs/rpc_pipefs

mv /etc/exports /cluster_metadata/etc/
ln -s /cluster_metadata/etc/exports /etc/exports

元の資料だとNFSのディレクトリを単純にcluster_metadata上に移動していますが、それだとrpc_pipefsが削除できないというエラーが発生します。関連するサービスを停止し、rpc_pipefsのマウントを解除してから移動した上で、再度rpc_pipefsをマウントします(NFSサービスが起動するところまでしか確認していないので、実際にはこれではダメかもしれません)。

iSCSI
mv /etc/ietd.conf /cluster_metadata/etc/
ln -s /cluster_metadata/etc/ietd.conf /etc/ietd.conf
mv /etc/initiators.allow /cluster_metadata/etc/
ln -s /cluster_metadata/etc/initiators.allow /etc/initiators.allow
mv /etc/initiators.deny /cluster_metadata/etc/
ln -s /cluster_metadata/etc/initiators.deny /etc/initiators.deny
FTP
mv /etc/proftpd /cluster_metadata/etc/
ln -s /cluster_metadata/etc/proftpd/ /etc/proftpd

各種サービスの設定(openfiler02)

SambaとNFS
rm -rf /etc/samba/
ln -s /cluster_metadata/etc/samba/ /etc/samba

rm -rf /var/spool/samba/
ln -s /cluster_metadata/var/spool/samba/ /var/spool/samba

service portmap stop
service rpcidmapd stop
umount /var/lib/nfs/rpc_pipefs
rm -rf /var/lib/nfs/
ln -s /cluster_metadata/var/lib/nfs/ /var/lib/nfs

rm -rf /etc/exports
ln -s /cluster_metadata/etc/exports /etc/exports
iSCSI
rm /etc/ietd.conf
ln -s /cluster_metadata/etc/ietd.conf /etc/ietd.conf
rm /etc/initiators.allow
ln -s /cluster_metadata/etc/initiators.allow /etc/initiators.allow
rm /etc/initiators.deny
ln -s /cluster_metadata/etc/initiators.deny /etc/initiators.deny
FTP
rm -rf /etc/proftpd
ln -s /cluster_metadata/etc/proftpd/ /etc/proftpd

VolumeGroupの作成

openfiler01にてVolumeGroupを作成します。

[root@openfiler01 ~]# vgcreate vg0drbd /dev/drbd1

Heartbeatサービスの起動と初期設定

cluster.xmlをもとにして/etc/ha.d/haresourcesのファイルを作成させるために、Openfilerのサービスを再起動してプライマリノードのIPアドレスでWeb画面にログインしてiSCSIサービスを開始します。

[root@openfiler01 ~]# rm /opt/openfiler/etc/httpd/modules
[root@openfiler01 ~]# ln -s /usr/lib/httpd/modules /opt/openfiler/etc/httpd/modules

64bitの場合にはlibの部分をlib64にします。

[root@openfiler01 ~]# service openfiler restart

これで/etc/ha.d/haresourcesにファイルが作成されるのでopenfiler02にコピーします。この後でWeb画面からNFSiSCSIのサービスの設定を変更した場合には、再度/etc/ha.d/haresourcesをopenfiler02にコピーする必要があります。

[root@openfiler01 ~]# scp /etc/ha.d/haresources root@openfiler02:/etc/ha.d/haresources

Heartbeatを開始する前に、vg0drbdにLogicalVolumeを作成しておきます。

[root@openfiler01 ~]# lvcreate -L 400M -n filer vg0drbd

両方のサーバを再起動します。これで、cluster.xmlで指定したIPアドレスにてOpenfilerにアクセスできるようになります。

フェイルオーバの確認

openfiler01にてhearbeatを停止します。

[root@openfiler01 ~]# service heartbeat stop

openfiler02の/var/log/messages,/var/log/ha-logでフェイルオーバを確認します。また、ifconfigでもインタフェースが追加されていることが確認できます。

[root@openfiler02 nfs]#  ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:0F:E0:B7
          inet addr:192.168.0.51  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: 2001:c90:a89:b05:20c:29ff:fe0f:e0b7/64 Scope:Global
          inet6 addr: fe80::20c:29ff:fe0f:e0b7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:354619 errors:0 dropped:0 overruns:0 frame:0
          TX packets:191540 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:104320124 (99.4 Mb)  TX bytes:55924283 (53.3 Mb)
          Interrupt:18 Base address:0x1400

eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:0F:E0:B7
          inet addr:192.168.0.52  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:354623 errors:0 dropped:0 overruns:0 frame:0
          TX packets:191546 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:104320366 (99.4 Mb)  TX bytes:55925139 (53.3 Mb)
          Interrupt:18 Base address:0x1400

openfiler01にてhearbeatを開始しフェイルバックを確認します。

[root@openfiler01 ~]# service heartbeat start