Pacemaker と Heartbeat による Web サーバークラスタ構築

CentOS5.6 で、Pacemaker と Heartbeat を使った Web サーバークラスタの構築例を紹介します。

Pacemaker とは

Heartbeat の後継ソフトウェアとして開発され、Heartbeat または Corosync のサブプロセスとして動作します。
Heartbeat と組み合わせて使用した場合、それぞれの役割は以下のとおりとなります。

  • Heartbeat
    各ノードの死活監視を行います。電源不良や kernel Panic 等、ハードウェアや OS に関する障害が発生した場合にこれを検知します。
  • Pacemaker
    仮想 IP アドレス、Apache 等のサービスをリソースとして扱い、起動/停止、動作状態を監視します。異常を検知すると、自動的に動作するリソースが起動するノードを制御(管理)します。

想定環境

共有ストレージの設定

パーティションの作成

パーティションを作成します。

fdisk /dev/sdb
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。

このディスクのシリンダ数は 1305 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

コマンド (m でヘルプ): p

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

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-1305, default 1):
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-1305, default 1305): +100M

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 2
最初 シリンダ (14-1305, default 14):
Using default value 14
終点 シリンダ または +サイズ または +サイズM または +サイズK (14-1305, default 1305):
Using default value 1305

コマンド (m でヘルプ): p

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          13      104391   83  Linux
/dev/sdb2              14        1305    10377990   83  Linux

コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。

警告: 領域テーブルの再読込みがエラー 16 で失敗しました: デバイスもしくはリソースがビジー状態です。
カーネルはまだ古いテーブルを使っています。
新しいテーブルは次回リブート時に使えるようになるでしょう。
ディスクを同期させます。

パーティションが作成された事を確認します。

fdisk -l

パーティションの起動

pm01 で作成したパーティションを pm02 の OS に認識させます。

fdisk /dev/sdb

このディスクのシリンダ数は 1305 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ): p

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          13      104391   83  Linux
/dev/sdb2              14        1305    10377990   83  Linux

コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。

警告: 領域テーブルの再読込みがエラー 16 で失敗しました: デバイスもしくはリソースがビジー状態です。
カーネルはまだ古いテーブルを使っています。
新しいテーブルは次回リブート時に使えるようになるでしょう。
ディスクを同期させます。

ファイルシステムの作成

パーティションにファイルシステムを作成します。

mke2fs -j /dev/sdb2
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
1297920 inodes, 2594497 blocks
129724 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2659188736
80 block groups
32768 blocks per group, 32768 fragments per group
16224 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 36 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
mke2fs -j /dev/sdb2
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
1297920 inodes, 2594497 blocks
129724 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2659188736
80 block groups
32768 blocks per group, 32768 fragments per group
16224 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 36 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

マウントポイント[/data]を作成します。

mkdir /data
mkdir /data

Pacemaker と Heartbeat の導入

Pacemaker と Heartbeat インストール

Linux-HA Japan 開発サイトからローカルリポジトリをダウンロードします。
本例では、pacemaker-1.0.11-1.2.1.el5.x86_64.repo.tar.gz をダウンロードしました。
ダウンロードしたローカルリポジトリを /tmp に展開します。

mv pacemaker-1.0.11-1.2.1.el5.x86_64.repo.tar.gz /tmp/
cd /tmp/
tar zxvf pacemaker-1.0.11-1.2.1.el5.x86_64.repo.tar.gz
mv pacemaker-1.0.11-1.2.1.el5.x86_64.repo.tar.gz /tmp/
cd /tmp/
tar zxvf pacemaker-1.0.11-1.2.1.el5.x86_64.repo.tar.gz

pacemaker heartbeat pm_extras をインストールします。

cd pacemaker-1.0.11-1.2.1.el5.x86_64.repo
yum -c pacemaker.repo install heartbeat.x86_64 pacemaker.x86_64 pm_extras
cd pacemaker-1.0.11-1.2.1.el5.x86_64.repo
yum -c pacemaker.repo install heartbeat.x86_64 pacemaker.x86_64 pm_extras

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

yum list pacemaker heartbeat pm_extras
Installed Packages
heartbeat.x86_64                    3.0.5-1.1.el5                      installed
pacemaker.x86_64                    1.0.11-1.2.el5                     installed
pm_extras.x86_64                    1.1-1.el5                          installed
yum list pacemaker heartbeat pm_extras
Installed Packages
heartbeat.x86_64                    3.0.5-1.1.el5                      installed
pacemaker.x86_64                    1.0.11-1.2.el5                     installed
pm_extras.x86_64                    1.1-1.el5                          installed

Heartbeat 設定

ha.cf を設定します

vi /etc/ha.d/ha.cf
pacemaker on
logfacility local1
debug 0
udpport 694
keepalive 2
warntime 20
deadtime 24
initdead 48
ucast eth0 192.168.1.102  # peer-ip-addr
ucast eth1 172.16.1.102   # peer-ip-addr
node pm01
node pm02
watchdog /dev/watchdog
respawn root /usr/lib64/heartbeat/ifcheckd
vi /etc/ha.d/ha.cf
pacemaker on
logfacility local1
debug 0
udpport 694
keepalive 2
warntime 20
deadtime 24
initdead 48
ucast eth0 192.168.1.101  # peer-ip-addr
ucast eth1 172.16.1.101   # peer-ip-addr
node pm01
node pm02
watchdog /dev/watchdog
respawn root /usr/lib64/heartbeat/ifcheckd

authkeys を設定します

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

権限を設定します。

chmod 600 /etc/ha.d/authkeys
chmod 600 /etc/ha.d/authkeys

Pacemaker 起動

Pacemaker を起動します。

service heartbeat start
service heartbeat start

起動を確認します。Online になるまで 1 分程度要します。

crm_mon -A
============
Last updated: Tue Mar  5 02:35:09 2013
Stack: Heartbeat
Current DC: pm02 (420126ea-1e1e-4632-b4fb-eaa2a8915909) - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, unknown expected votes
0 Resources configured.
============

Online: [ pm02 pm01 ]

Node Attributes:
* Node pm02:
    + pm01-eth0                         : up
    + pm01-eth1                         : up
* Node pm01:
    + pm02-eth0                         : up
    + pm02-eth1                         : up
crm_mon -A
============
Last updated: Tue Mar  5 02:35:09 2013
Stack: Heartbeat
Current DC: pm02 (420126ea-1e1e-4632-b4fb-eaa2a8915909) - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, unknown expected votes
0 Resources configured.
============

Online: [ pm02 pm01 ]

Node Attributes:
* Node pm02:
    + pm01-eth0                         : up
    + pm01-eth1                         : up
* Node pm01:
    + pm02-eth0                         : up
    + pm02-eth1                         : up

リソース制御設定

crm コマンドを起動します。

crm
crm(live)#

リソース設定モードに入ります。

crm(live)# configure
crm(live)configure#

現状の設定を確認します。

crm(live)configure# show
node $id="420126ea-1e1e-4632-b4fb-eaa2a8915909" pm02
node $id="ca3de0e0-dff2-4d13-a126-b9fbee7e3ec9" pm01
property $id="cib-bootstrap-options" \
        dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" \
        cluster-infrastructure="Heartbeat"

init スクリプトにより apache を制御します。

primitive apache lsb:httpd \
        op start interval="0s" timeout="60s" on-fail="restart" \
        op monitor interval="30s" timeout="60s" on-fail="restart" \
        op stop interval="0s" timeout="60s" on-fail="fence"

Filesystem リソースエージェントを使用し、Filesystem のリソース設定をします。

primitive mnt_fs ocf:heartbeat:Filesystem \
        params device="/dev/sdb2" directory="/data" fstype="ext3" \
        op monitor interval="20s" timeout="40s" \
        op start interval="0" timeout="60s" \
        op stop interval="0" timeout="60s"

pingd リソースエージェントを使用し、GW への Ping 死活監視リソース設定をします。

primitive pingd ocf:pacemaker:pingd \
        params name="default_ping_set" host_list="192.168.1.2" interval="10" timeout="10" attempts="5" multiplier="100" \
        op start interval="0" timeout="90" on-fail="restart" \
        op monitor interval="10" timeout="20" on-fail="restart" start-delay="1m" debug="true" \
        op stop interval="0" timeout="100" on-fail="block"

IPaddr2 リソースエージェントを使用し、仮想 IP のリソース設定をします。

primitive vip ocf:heartbeat:IPaddr2 \
        params ip="192.168.1.103" cidr_netmask="24" nic="eth0" iflabel="0" \
        op start interval="0s" timeout="60s" on-fail="restart" \
        op monitor interval="10s" timeout="60s" on-fail="restart" \
        op stop interval="0s" timeout="60s" on-fail="block"

STONITH 機能[1]制御不能のサーバを強制的に電源 OFF にします。を無効にします。

property $id="cib-bootstrap-options" \
        dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" \
        cluster-infrastructure="Heartbeat" \
        stonith-enabled="false" \
        no-quorum-policy="ignore"

設定したリソースをグループ化します。

group Cluster vip mnt_fs apache

GW の Ping 死活監視は、全 Node で実行するようにクローン化します。

clone clone_ping pingd

Ping 死活監視で 100以下の値になった場合、VIP をフェイルオーバーします。

location vip_location vip \
        rule $id="vip_location-rule" -inf: not_defined default_ping_set or default_ping_set lt 100

自動フェイルバックを無効化します。[2]heatbeat の auto_failback off は効きません。

rsc_defaults $id="rsc-options" \
        resource-stickiness="INFINITY" \
        migration-threshold="3"

設定を反映します。

crm(live)configure# commit

設定を確認します。

crm(live)configure# show
primitive apache lsb:httpd \
        op start interval="0s" timeout="60s" on-fail="restart" \
        op monitor interval="30s" timeout="60s" on-fail="restart" \
        op stop interval="0s" timeout="60s" on-fail="fence"
primitive mnt_fs ocf:heartbeat:Filesystem \
        params device="/dev/sdb2" directory="/data" fstype="ext3" \
        op monitor interval="20s" timeout="40s" \
        op start interval="0" timeout="60s" \
        op stop interval="0" timeout="60s"
primitive pingd ocf:pacemaker:pingd \
        params name="default_ping_set" host_list="192.168.1.2" interval="10" timeout="10" attempts="5" multiplier="100" \
        op start interval="0" timeout="90" on-fail="restart" \
        op monitor interval="10" timeout="20" on-fail="restart" start-delay="1m" debug="true" \
        op stop interval="0" timeout="100" on-fail="block"
primitive vip ocf:heartbeat:IPaddr2 \
        params ip="192.168.1.103" cidr_netmask="24" nic="eth0" iflabel="0" \
        op start interval="0s" timeout="60s" on-fail="restart" \
        op monitor interval="10s" timeout="60s" on-fail="restart" \
        op stop interval="0s" timeout="60s" on-fail="block"
group cluster vip mnt_fs apache
clone clone_ping pingd
location vip_location vip \
        rule $id="vip_location-rule" -inf: not_defined default_ping_set or default_ping_set lt 100
property $id="cib-bootstrap-options" \
        dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" \
        cluster-infrastructure="Heartbeat" \
        stonith-enabled="false" \
        no-quorum-policy="ignore"
rsc_defaults $id="rsc-options" \
        resource-stickiness="INFINITY" \
        migration-threshold="3"

Pacemaker の状態を確認します。

crm_mon -A
============
Last updated: Tue Mar  5 19:16:13 2013
Stack: Heartbeat
Current DC: pm02 (420126ea-1e1e-4632-b4fb-eaa2a8915909) - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, unknown expected votes
2 Resources configured.
============

Online: [ pm02 pm01 ]

 Resource Group: cluster
     vip        (ocf::heartbeat:IPaddr2):       Started pm01
     mnt_fs     (ocf::heartbeat:Filesystem):    Started pm01
     apache     (lsb:httpd):    Started pm01
 Clone Set: clone_ping
     Started: [ pm02 pm01 ]

Node Attributes:
* Node pm02:
    + default_ping_set                  : 100
    + pm01-eth0                         : up
    + pm01-eth1                         : up
* Node pm01:
    + default_ping_set                  : 100
    + pm02-eth0                         : up
    + pm02-eth1                         : up

設定を完全削除する場合は、Pacemaker を停止し、下記ファイルを削除します。

rm -f /var/lib/heartbeat/crm/*
rm -f /var/lib/heartbeat/crm/*

リソース移動確認(手動マイグレーション)

pm02 へのリソース移動をテストします。

crm resource move cluster pm02 force

リソースが pm02 へ正常に移動する事を確認します。

crm_mon -A
============
Last updated: Tue Mar  5 19:25:39 2013
Stack: Heartbeat
Current DC: pm02 (420126ea-1e1e-4632-b4fb-eaa2a8915909) - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, unknown expected votes
2 Resources configured.
============

Online: [ pm02 pm01 ]

 Resource Group: cluster
     vip        (ocf::heartbeat:IPaddr2):       Started pm02
     mnt_fs     (ocf::heartbeat:Filesystem):    Started pm02
     apache     (lsb:httpd):    Started pm02
 Clone Set: clone_ping
     Started: [ pm02 pm01 ]

Node Attributes:
* Node pm02:
    + default_ping_set                  : 100
    + pm01-eth0                         : up
    + pm01-eth1                         : up
* Node pm01:
    + default_ping_set                  : 100
    + pm02-eth0                         : up
    + pm02-eth1                         : up

リソースの unmove を行います。[3]move コマンドは[リソース移動指示]+[移動元ノードでの当該リソース起動禁止フラグを付ける]という挙動になります。そのため、unmove … Continue reading

crm resource unmove cluster

Web サーバー監視設定

Web サーバー設定

yum により httpd パッケージをインストールします。

yum install httpd
yum install httpd

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

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

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

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

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

chkconfig httpd off
chkconfig httpd off

ドキュメントルートの変更

ドキュメントルートを共有領域(/data)へ変更します。

vi /etc/httpd/conf/httpd.conf
DocumentRoot "/data"
vi /etc/httpd/conf/httpd.conf
DocumentRoot "/data"

共有領域をマウントします。

mount -t ext3 /dev/sdb2 /data/
mount -t ext3 /dev/sdb2 /data/

共有領域へ index.html ファイルを作成します。

echo test > /data/index.html
echo test > /data/index.html

共有領域をアンマウントします。

umount -l /data/
umount -l /data/

Web サーバークラスタ動作確認

プライマリ側が仮想 IP を持ち、セカンダリ側は仮想 IP を持たない事を確認します。

p addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:50:56:91:00:01 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.101/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.103/24 brd 192.168.1.255 scope global secondary eth0:0
ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:50:56:91:00:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.102/24 brd 192.168.1.255 scope global eth0

プライマリ側が共有領域をマウントし、セカンダリ側はマウントしていない事を確認します。

df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                      6.7G  2.2G  4.2G  34% /
/dev/sda1              99M   13M   81M  14% /boot
tmpfs                 249M     0  249M   0% /dev/shm
/dev/sdb2             9.8G  151M  9.2G   2% /data
df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                      6.7G  2.2G  4.2G  34% /
/dev/sda1              99M   13M   81M  14% /boot
tmpfs                 249M     0  249M   0% /dev/shm

プライマリ側は httpd サービスが起動し、セカンダリ側は起動していない事を確認します。

/etc/rc.d/init.d/httpd status
httpd (pid  11123) を実行中...
/etc/rc.d/init.d/httpd status
httpd は停止しています

フェイルオーバー確認

プライマリ側(pm01)で疑似障害を発生させた際、プライマリとセカンダリの状態が入れ替わります。

サービスネットワーク(eth0)を切断した場合

 crm_mon -A
============
Last updated: Tue Mar  5 19:37:38 2013
Stack: Heartbeat
Current DC: pm02 (420126ea-1e1e-4632-b4fb-eaa2a8915909) - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, unknown expected votes
2 Resources configured.
============

Online: [ pm02 pm01 ]

 Resource Group: Cluster
     vip        (ocf::heartbeat:IPaddr2):       Started pm02
     mnt_fs     (ocf::heartbeat:Filesystem):    Started pm02
     apache     (lsb:httpd):    Started pm02
 Clone Set: clone_ping
     Started: [ pm02 pm01 ]

Node Attributes:
* Node pm02:
    + default_ping_set                  : 100
    + pm01-eth0                         : dead
    + pm01-eth1                         : up
* Node pm01:
    + default_ping_set                  : 0             : Connectivity is lost
    + pm02-eth0                         : dead
    + pm02-eth1                         : up

kill -9 11494 コマンドでサービス(apache)を kill した場合

crm_mon -A
============
Last updated: Tue Mar  5 19:44:41 2013
Stack: Heartbeat
Current DC: pm02 (420126ea-1e1e-4632-b4fb-eaa2a8915909) - partition with quorum
Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87
2 Nodes configured, unknown expected votes
2 Resources configured.
============

Online: [ pm02 pm01 ]

 Resource Group: cluster
     vip        (ocf::heartbeat:IPaddr2):       Started pm02
     mnt_fs     (ocf::heartbeat:Filesystem):    Started pm02
     apache     (lsb:httpd):    Started pm02
 Clone Set: clone_ping
     Started: [ pm02 pm01 ]

Node Attributes:
* Node pm02:
    + default_ping_set                  : 100
    + pm01-eth0                         : up
    + pm01-eth1                         : up
* Node pm01:
    + default_ping_set                  : 100
    + pm02-eth0                         : up
    + pm02-eth1                         : up

Failed actions:
    apache_monitor_30000 (node=pm01, call=43, rc=7, status=complete): not running
    apache_start_0 (node=pm01, call=45, rc=1, status=complete): unknown error

以上

関連記事

故障時の動作 Pacemaker で想定される故障は、start(起動失敗)、monitor(監視による検出)、stop(停止失敗)の 3 パターンがあります。故障が発生した際は、on-fail の設定に応じた動作を行います。on-f[…]

脚注

脚注
1制御不能のサーバを強制的に電源 OFF にします。
2heatbeat の auto_failback off は効きません。
3move コマンドは[リソース移動指示]+[移動元ノードでの当該リソース起動禁止フラグを付ける]という挙動になります。そのため、unmove により、このフラグを削除しないと、フェイルオーバーが動作しなくなります。