DRBD とは
ストレージをネットワーク経由でミラーリングするソフトウェアです。DRBD はブロックデバイスとして扱える事から、ファイルシステムを問わず利用可能です。プライマリノードで故障が発生した際は、スタンバイノードの DRBD 領域をプライマリに切り替えることで、サービスを継続し高可用性を確保します。
検証環境
想定環境
- 各仮想マシンの CPU は1個、メモリは512MB とします。
- 仮想ディスクは OS 用(8GB)と、DRBD 領域用(10GB)の2つを用意します。
- 仮想ネットワークはサービス用(eth0)と、DRBD 同期用(eth1)の2つを用意します。
- ソフトウェアは、CentOS5.6(32bit)を最小構成でインストールします。
検証構成
DRBD 設定
DRBD パーティションの作成(drbd01 / drbd02)
fdisk -l で現状のディスク情報を確認します。
[drbd01 ~]# fdisk -l Disk /dev/sda: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = シリンダ数 of 16065 * 512 = 8225280 bytes デバイス Boot Start End Blocks Id System /dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 1044 8281507+ 8e Linux LVM Disk /dev/sdb: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders Units = シリンダ数 of 16065 * 512 = 8225280 bytes ディスク /dev/sdb は正常な領域テーブルを含んでいません
fdisk で /dev/sdb にパーティションを作成します。
[drbd01 ~]# fdisk /dev/sdb デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも含んでいません 新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更はメモリ内だけに残します。 その後はもちろん以前の内容は修復不可能になります。 このディスクのシリンダ数は 1305 に設定されています。 間違いではないのですが、1024 を超えているため、以下の場合に問題を生じうる事を確認しましょう: 1) ブート時に実行するソフトウェア (例. バージョンが古い LILO) 2) 別の OS のブートやパーティション作成ソフト (例. DOS FDISK, OS/2 FDISK) 警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって正常になります コマンド (m でヘルプ): n コマンドアクション e 拡張 p 基本領域 (1-4) p 領域番号 (1-4): 1 最初 シリンダ (1-1305, default 1): 1 終点 シリンダ または +サイズ または +サイズM または +サイズK (1-1305, default 1305): Using default value 1305 コマンド (m でヘルプ): w 領域テーブルは交換されました! ioctl() を呼び出して領域テーブルを再読込みします。 ディスクを同期させます。
fdisk -l でパーティションが作成された事を確認します。
[drbd01 ~]# fdisk -l Disk /dev/sda: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = シリンダ数 of 16065 * 512 = 8225280 bytes デバイス Boot Start End Blocks Id System /dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 1044 8281507+ 8e Linux LVM Disk /dev/sdb: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders Units = シリンダ数 of 16065 * 512 = 8225280 bytes デバイス Boot Start End Blocks Id System /dev/sdb1 1 1305 10482381 83 Linux
DRBD インストール(drbd01 / drbd02)
yum により drbd83 パッケージをインストールします。
[drbd01 ~]# yum install drbd83 kmod-drbd83
インストールを確認します。
[drbd01 ~]# rpm -qa | grep drbd kmod-drbd83-8.3.13-1.el5.centos drbd83-8.3.13-2.el5.centos
DRBD 設定(drbd01 / drbd02)
/etc/drbd.conf を設定します。
[drbd01 ~]# vi /etc/drbd.conf global { usage-count no; } common { syncer { rate 100M; } } resource r0 { protocol C; startup { wfc-timeout 120; } disk { on-io-error pass_on; } on drbd01 { device /dev/drbd0; disk /dev/sdb1; address 172.16.1.101:7788; meta-disk internal; } on drbd02 { device /dev/drbd0; disk /dev/sdb1; address 172.16.1.102:7788; meta-disk internal; } }
メタファイルの作成(drbd01 / drbd02)
meta-disk のデバイスをゼロ設定します。
[drbd01 ~]# dd if=/dev/zero bs=1M count=1 of=/dev/sdb1; sync 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.022898 seconds, 45.8 MB/s
メタファイルを作成します。
[drbd01 ~]# drbdadm create-md r0 Writing meta data... initializing activity log NOT initialized bitmap New drbd meta data block successfully created.
起動設定(drbd01 / drbd02)
chkconfig で自動起動を on にします。
[drbd01 ~]# chkconfig drbd on
起動設定を確認します。
[drbd01 ~]# chkconfig --list drbd drbd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
DRBD の起動(drbd01 / drbd02)
DRBD を起動します。
[drbd01 ~]# /etc/rc.d/init.d/drbd start Starting DRBD resources: [ d(r0) s(r0) ].......... *************************************************************** DRBD's startup script waits for the peer node(s) to appear. - In case this node was already a degraded cluster before the reboot the timeout is 0 seconds. [degr-wfc-timeout] - If the peer was available before the reboot the timeout will expire after 120 seconds. [wfc-timeout] (These values are for resource 'r0'; 0 sec -> wait forever) To abort waiting enter 'yes' [ 10]:yes
起動状態を確認します。
[drbd01 ~]# cat /proc/drbd version: 8.3.13 (api:88/proto:86-96) GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:31 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----- ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:10482024
マウントポイント[/mnt/data]を作成します。
[drbd01 ~]# mkdir /mnt/data
Primary 昇格と DRBD 同期(drbd01)
drbd01 を一時的に Primary へ昇格させます。
[drbd01 ~]# drbdadm -- --overwrite-data-of-peer primary r0
DRBD 同期状態を確認します。
[drbd01 ~]# /etc/rc.d/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.13 (api:88/proto:86-96) GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:31 m:res cs ro ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C
DRBD ボリュームのマウント(drbd01)
DRBD ボリュームにファイルシステムを作成します。
[drbd01 ~]# mke2fs -j /dev/drbd0 mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 1310720 inodes, 2620506 blocks 131025 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2684354560 80 block groups 32768 blocks per group, 32768 fragments per group 16384 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 37 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
ext3 でマウントします。
[drbd01 ~]# mount -t ext3 /dev/drbd0 /mnt/data/
マウント状況を確認します。
[drbd01 ~]# df -h Filesystem サイズ 使用 残り 使用% マウント位置 /dev/mapper/VolGroup00-LogVol00 6.7G 1.9G 4.5G 30% / /dev/sda1 99M 16M 79M 17% /boot tmpfs 252M 0 252M 0% /dev/shm /dev/drbd0 9.9G 151M 9.2G 2% /mnt/data
DRBD のマウント状況を確認します。
[drbd01 ~]# /etc/rc.d/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.13 (api:88/proto:86-96) GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:31 m:res cs ro ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C /mnt/data ext3
Heatbeat 設定
Heatbeat インストール(drbd01 / drbd02)
yum によりパッケージをインストールします。*1
[drbd01 ~]# yum install heartbeat-stonith [drbd01 ~]# yum install heartbeat
インストールを確認します。
[drbd01 ~]# rpm -qa | grep heartbeat heartbeat-2.1.3-3.el5.centos heartbeat-pils-2.1.3-3.el5.centos heartbeat-stonith-2.1.3-3.el5.centos
Heatbeat 設定(drbd01 / drbd02)
ha.cf を設定します。
[drbd01 ~]# vi /etc/ha.d/ha.cf crm off use_logd yes keepalive 1 warntime 3 deadtime 10 initdead 60 udpport 694 auto_failback on ucast eth0 192.168.1.102 # peer-ip-addr node drbd01 node drbd02 ping 192.168.1.2
haresources を設定します。
[drbd01 ~]# vi /etc/ha.d/haresources drbd0* IPaddr::192.168.1.103/24 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/data::ext3
authkeys を設定します。
[drbd01 ~]# vi /etc/ha.d/authkeys auth 1 1 crc
権限を設定します。
[drbd01 ~]# chmod 600 /etc/ha.d/authkeys
起動設定(drbd01 / drbd02)
chkconfig で自動起動を on にします。
[drbd01 ~]# chkconfig heartbeat on
起動設定を確認します。
[drbd01 ~]# chkconfig --list heartbeat heartbeat 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Heatbeat の起動(drbd01 / drbd02)
DRBD 領域は Heatbeat 経由でマウントするため事前にアンマウントします。
[drbd01 ~]# umount /mnt/data/
Heatbeat を起動します。
[drbd01 ~]# /etc/rc.d/init.d/heartbeat start
DRBD + Heatbeat 動作確認
平常時は、プライマリ側が仮想 IP を持ちます。
[drbd01 ~]# ifconfig -a eth0:0 eth0:0 Link encap:Ethernet HWaddr 00:50:56:91:00:04 inet addr:192.168.1.103 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:59 Base address:0x2024
また、DRBD 領域をマウントします。
[drbd01 ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.13 (api:88/proto:86-96) GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:31 m:res cs ro ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C /mnt/data ext3 [drbd01 ~]# df -h Filesystem サイズ 使用 残り 使用% マウント位置 /dev/mapper/VolGroup00-LogVol00 6.7G 2.0G 4.4G 31% / /dev/sda1 99M 16M 79M 17% /boot tmpfs 252M 0 252M 0% /dev/shm /dev/drbd0 9.9G 151M 9.2G 2% /mnt/data
逆にスタンバイ側は仮想 IP を持ちません。
[drbd02 ~]# ifconfig -a eth0:0 eth0:0 Link encap:Ethernet HWaddr 00:50:56:91:00:07 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:59 Base address:0x2024
また、DRBD 領域をマウントしません。
[drbd02 ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.13 (api:88/proto:86-96) GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:31 m:res cs ro ds p mounted fstype 0:r0 Connected Secondary/Primary UpToDate/UpToDate C [drbd02 ~]# df -h Filesystem サイズ 使用 残り 使用% マウント位置 /dev/mapper/VolGroup00-LogVol00 6.7G 1.9G 4.5G 30% / /dev/sda1 99M 16M 79M 17% /boot tmpfs 252M 0 252M 0% /dev/shm
フェールオーバーを確認するため、プライマリ側で heatbeat を停止します。
[drbd01 ~]# /etc/rc.d/init.d/heartbeat stop
旧スタンバイ側がプライマリへ昇格し、仮想 IP を引き継ぎます。
[drbd02 ~]# ifconfig -a eth0:0 eth0:0 Link encap:Ethernet HWaddr 00:50:56:91:00:07 inet addr:192.168.1.103 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:59 Base address:0x2024
また、DRBD 領域をマウントします。
[drbd02 ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.13 (api:88/proto:86-96) GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:31 m:res cs ro ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C /mnt/data ext3 [drbd02 ~]# df -h Filesystem サイズ 使用 残り 使用% マウント位置 /dev/mapper/VolGroup00-LogVol00 6.7G 1.9G 4.5G 30% / /dev/sda1 99M 16M 79M 17% /boot tmpfs 252M 0 252M 0% /dev/shm /dev/drbd0 9.9G 151M 9.2G 2% /mnt/data
旧プライマリ側は、仮想 IP を解放します。
[drbd01 ~]# ifconfig -a eth0:0 eth0:0 Link encap:Ethernet HWaddr 00:50:56:91:00:04 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:59 Base address:0x2024
また、DRBD 領域をアンマウントします。
[drbd01 ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: 8.3.13 (api:88/proto:86-96) GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-05-07 11:56:31 m:res cs ro ds p mounted fstype 0:r0 Connected Secondary/Primary UpToDate/UpToDate C [drbd01 ~]# df -h Filesystem サイズ 使用 残り 使用% マウント位置 /dev/mapper/VolGroup00-LogVol00 6.7G 2.0G 4.4G 31% / /dev/sda1 99M 16M 79M 17% /boot tmpfs 252M 0 252M 0% /dev/shm
Web サーバー監視設定
Web サーバー設定(drbd01 / drbd02)
yum により httpd パッケージをインストールします。
[drbd01 ~]# yum install httpd
インストールを確認します。
[drbd01 ~]# rpm -qa | grep httpd httpd-2.2.3-76.el5.centos
httpd サービスを停止します。
[drbd01 ~]# /etc/rc.d/init.d/httpd stop
httpd 自動起動をオフにします。
[drbd01 ~]# chkconfig httpd off
Web サーバーデータコピー(drbd01 / drbd02)
ドキュメントルートのデータを DRBD 領域へコピーします。
[drbd01 ~]# rsync -avz -e ssh --delete /var/www/ /mnt/data/
Heatbeat 設定(drbd01)
/var/www をマウントし httpd を起動するように設定します。
[drbd01 ~]# drbd01 IPaddr::192.168.1.103/24 drbddisk::r0 Filesystem::/dev/drbd0::/var/www httpd
Web サーバークラスタ動作確認
http://192.168.1.103 へアクセス可能な事を確認します。
プライマリ側の仮想 IP を持ち、DRBD 領域をマウントしている事を確認します。
[drbd01 ~]# ifconfig -a eth0:0 eth0:0 Link encap:Ethernet HWaddr 00:50:56:91:00:04 inet addr:192.168.1.103 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:59 Base address:0x2024 [drbd01 ~]# df -h Filesystem サイズ 使用 残り 使用% マウント位置 /dev/mapper/VolGroup00-LogVol00 6.7G 2.0G 4.4G 31% / /dev/sda1 99M 16M 79M 17% /boot tmpfs 252M 0 252M 0% /dev/shm /dev/drbd0 9.9G 152M 9.2G 2% /var/www
また、httpd サービスが起動している事を確認します。
[drbd01 ~]# /etc/rc.d/init.d/httpd status httpd (pid 31344) を実行中...
セカンダリ側では仮想 IP を持たず DRBD 領域をマウントしていない事を確認します。
[drbd02 ~]# ifconfig -a eth0:0 eth0:0 Link encap:Ethernet HWaddr 00:50:56:91:00:07 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:59 Base address:0x2024 [drbd02 ~]# df -h Filesystem サイズ 使用 残り 使用% マウント位置 /dev/mapper/VolGroup00-LogVol00 6.7G 2.0G 4.4G 31% / /dev/sda1 99M 16M 79M 17% /boot tmpfs 252M 0 252M 0% /dev/shm
また、httpd サービスが停止している事を確認します。
[drbd02 ~]# /etc/rc.d/init.d/httpd status httpd は停止しています
プライマリ側で heatbeat を停止するとプライマリとセカンダリの状態が入れ替わります。
以上
*1:stonith をインストールしないと heartbeat のインストールに失敗する事があるようです。