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アドレスを変更しておきます。今回は以下の設定にします。
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
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
各種サービスの設定(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
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画面からNFSやiSCSIのサービスの設定を変更した場合には、再度/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