NETWORK ENGINEER BLOG

Tips and Reviews for Engineers

DRBD + Heartbeat による Web サーバークラスタ構築

DRBD とは

ストレージをネットワーク経由でミラーリングするソフトウェアです。DRBD はブロックデバイスとして扱える事から、ファイルシステムを問わず利用可能です。プライマリノードで故障が発生した際は、スタンバイノードの DRBD 領域をプライマリに切り替えることで、サービスを継続し高可用性を確保します。

検証環境

想定環境
  • 各仮想マシンの CPU は1個、メモリは512MB とします。
  • 仮想ディスクは OS 用(8GB)と、DRBD 領域用(10GB)の2つを用意します。
  • 仮想ネットワークはサービス用(eth0)と、DRBD 同期用(eth1)の2つを用意します。
  • ソフトウェアは、CentOS5.6(32bit)を最小構成でインストールします。
検証構成

f:id:FriendsNow:20130303002910p:plain:w450

DRBD 設定

DRBD パーティションの作成(drbd01 / drbd02)

fdisk -l で現状のディスク情報を確認します。

# 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 にパーティションを作成します。

# 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 でパーティションが作成された事を確認します。

# 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 パッケージをインストールします。

# yum install drbd83 kmod-drbd83

インストールを確認します。

# 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 を設定します。

# 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 のデバイスをゼロ設定します。

# 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

メタファイルを作成します。

# drbdadm create-md r0
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
起動設定(drbd01 / drbd02)

chkconfig で自動起動を on にします。

# chkconfig drbd on

起動設定を確認します。

# chkconfig --list drbd
drbd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
DRBD の起動(drbd01 / drbd02)

DRBD を起動します。

# /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

起動状態を確認します。

# 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]を作成します。

# mkdir /mnt/data
Primary 昇格と DRBD 同期(drbd01)

drbd01 を一時的に Primary へ昇格させます。

# drbdadm -- --overwrite-data-of-peer primary r0

DRBD 同期状態を確認します。

# /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 ボリュームにファイルシステムを作成します。

# 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 でマウントします。

# mount -t ext3 /dev/drbd0 /mnt/data/

マウント状況を確認します。

# 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 のマウント状況を確認します。

# /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

# yum install heartbeat-stonith
# yum install heartbeat

インストールを確認します。

# 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 を設定します。

# 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 を設定します。

# vi /etc/ha.d/haresources
drbd0* IPaddr::192.168.1.103/24 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/data::ext3

authkeys を設定します。

# vi /etc/ha.d/authkeys
auth 1
1 crc

権限を設定します。

# chmod 600 /etc/ha.d/authkeys
起動設定(drbd01 / drbd02)

chkconfig で自動起動を on にします。

# chkconfig heartbeat on

起動設定を確認します。

# chkconfig --list heartbeat
heartbeat       0:off   1:off   2:on    3:on    4:on    5:on    6:off
Heatbeat の起動(drbd01 / drbd02)

DRBD 領域は Heatbeat 経由でマウントするため事前にアンマウントします。

# umount /mnt/data/

Heatbeat を起動します。

# /etc/rc.d/init.d/heartbeat start
DRBD + Heatbeat 動作確認

平常時は、プライマリ側が仮想 IP を持ちます。

[root@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 領域をマウントします。

[root@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

[root@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 を持ちません。

[root@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 領域をマウントしません。

[root@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

[root@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 を停止します。

[root@drbd01 ~]# /etc/rc.d/init.d/heartbeat stop

旧スタンバイ側がプライマリへ昇格し、仮想 IP を引き継ぎます。

[root@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 領域をマウントします。

[root@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

[root@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 を解放します。

[root@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 領域をアンマウントします。

[root@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

[root@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 パッケージをインストールします。

# yum install httpd

インストールを確認します。

# rpm -qa | grep httpd
httpd-2.2.3-76.el5.centos

httpd サービスを停止します。

# /etc/rc.d/init.d/httpd stop

httpd 自動起動をオフにします。

# chkconfig httpd off
Web サーバーデータコピー(drbd01 / drbd02)

ドキュメントルートのデータを DRBD 領域へコピーします。

# rsync -avz -e ssh --delete /var/www/ /mnt/data/
Heatbeat 設定(drbd01)

/var/www をマウントし httpd を起動するように設定します。

# drbd01 IPaddr::192.168.1.103/24 drbddisk::r0 Filesystem::/dev/drbd0::/var/www httpd
Web サーバークラスタ動作確認

http://192.168.1.103 へアクセス可能な事を確認します。

プライマリ側の仮想 IP を持ち、DRBD 領域をマウントしている事を確認します。

[root@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

[root@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 サービスが起動している事を確認します。

[root@drbd01 ~]# /etc/rc.d/init.d/httpd status
httpd (pid  31344) を実行中...

セカンダリ側では仮想 IP を持たず DRBD 領域をマウントしていない事を確認します。

[root@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

[root@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 サービスが停止している事を確認します。

[root@drbd02 ~]# /etc/rc.d/init.d/httpd status
httpd は停止しています

プライマリ側で heatbeat を停止するとプライマリとセカンダリの状態が入れ替わります。

*1:stonith をインストールしないと heartbeat のインストールに失敗する事があるようです。