2015年11月3日火曜日

[CentOS7] Pacemaker + DRBD (Apacheクラスタ)


前回までの記事で、Pacemaker に Apache関連のリソースを登録し、stonith も実装しました。

今回は、pm01とpm02のディスクをDRBDでミラーして、Apacheのドキュメントルートを2台で共有するようにします。
これで、フェイルオーバしても、Apache は同じ情報を提供できるし、リリース先も稼働系だけでOKになります。

環境は以下のとおり。
サーバはXenServer6.5の仮想マシンです。
  • pm01: 10.1.0.71
  • pm02: 10.1.0.72
  • drbd用ディスク: /dev/xvdb


1.DRBDを導入する


1.1.DRBDをインストールする


DRBDは、ppm01とpm02に yum でインストールします。
以下にようにDRBD用にレポジトリを登録してインストールします。
[root@pm01 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@pm01 ~]# yum install http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[root@pm01 ~]# yum install drbd84-utils kmod-drbd84
[root@pm02 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@pm02 ~]# yum install http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[root@pm02 ~]# yum install drbd84-utils kmod-drbd84

1.1.DRBD用のボリューム(ディスク)を用意する


DRBD用に pm01とpm02 に新規でディスクを追加しました。
XenServer の仮想マシンの場合は、パーティションを切らなくてもファイルシステムを作成できるので、パーティションはきりません。
以下は、pm01 の例ですが、/dev/xvdb が DRBD 用です。
pm02 も同じ構成にします。
[root@pm01 ~]# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0    8G  0 disk
├─xvda1 202:1    0  500M  0 part /boot
└─xvda2 202:2    0  7.5G  0 part /
xvdb    202:16   0    2G  0 disk
[root@pm01 ~]# fdisk -l /dev/xvdb

Disk /dev/xvdb: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト

1.2.DRBDのレポジトリ設定


DRBDのレポジトリを設定します。
pm01 の /etc/drbd.d/drbd0.res に以下の内容を記載します。
[root@pm01 ~]# cat /etc/drbd.d/drbd0.res
resource drbd0 {
        protocol C;

        disk /dev/xvdb;
        device /dev/drbd0;
        meta-disk internal;
        on pm01 {
                address 10.1.0.71:7789;
        }
        on pm02 {
                address 10.1.0.72:7789;
        }
}
同じファイルを pm02 にコピーします。
[root@pm01 ~]# scp -p /etc/drbd.d/drbd0.res pm02:/etc/drbd.d/.
pm01とpm02で /dev/xvdb にメタデータを書き込んで初期化します。
[root@pm01 ~]# drbdadm create-md drbd
~省略~
you are the 1574th user to install this version
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
success
[root@pm02 ~]# drbdadm create-md drbd
~省略~
you are the 9920th user to install this version
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
success 
pm01とpm02でリソースを有効にします。
[root@pm01 ~]# drbdadm up drbd0
[root@pm01 ~]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R7, 2015-04-10 05:13:52
 0: cs:WFConnection ro:Secondary/Unknown ds:Inconsistent/DUnknown C r----s
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:2097052
[root@pm02 ~]# drbdadm up drbd0
[root@pm02 ~]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R7, 2015-04-10 05:13:52
 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:f oos:2097052
同期を開始します。
pm01をプライマリとして同期したいので pm01 で以下のように drbdadm を実行し、cat で同期の状態を見ます。
[root@pm01 ~]# drbdadm primary --force drbd0
[root@pm01 ~]#  cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R7, 2015-04-10 05:13:52
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:19356 nr:0 dw:0 dr:20084 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:2077696
        [>....................] sync'ed:  1.0% (2077696/2097052)K
        finish: 0:10:36 speed: 3,224 (3,224) K/sec
同期が完了すると以下のように表示されます。
[root@pm01 ~]#  cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R7, 2015-04-10 05:13:52
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:2097052 nr:0 dw:0 dr:2097780 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
drbd-overview で見た drbd の状態は以下のとおり。
pm01 がプライマリで pm02 がセカンダリになり、pm01 ⇒ pm02の方向に同期されます。
[root@pm01 ~]# drbd-overview
 0:drbd0/0  Connected Primary/Secondary UpToDate/UpToDate
[root@pm02 ~]# drbd-overview
 0:drbd0/0  Connected Secondary/Primary UpToDate/UpToDate

1.3.ファイルシステムの作成


pm01 で DRBD用のボリュームにファイルシステムを作成します。
[root@pm01 ~]# mkfs.ext4 /dev/drbd0
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131072 inodes, 524263 blocks
26213 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
マウントして、試しにディレクトリとファイルを作成してみます。
[root@pm01 ~]# mount /dev/drbd0 /mnt
[root@pm01 ~]# mkdir /mnt/test
[root@pm01 ~]# touch /mnt/xx0
[root@pm01 ~]# ls -l /mnt
合計 20
drwx------ 2 root root 16384 11月  3 08:49 lost+found
drwxr-xr-x 2 root root  4096 11月  3 08:49 test
-rw-r--r-- 1 root root     0 11月  3 08:50 xx0
[root@pm01 ~]# mount | grep drbd0
/dev/drbd0 on /mnt type ext4 (rw,relatime,data=ordered)
[root@pm01 ~]# df -Th
ファイルシス   タイプ   サイズ  使用  残り 使用% マウント位置
/dev/xvda2     ext4       7.3G  1.4G  5.6G   20% /
devtmpfs       devtmpfs   476M     0  476M    0% /dev
tmpfs          tmpfs      495M     0  495M    0% /dev/shm
tmpfs          tmpfs      495M   13M  483M    3% /run
tmpfs          tmpfs      495M     0  495M    0% /sys/fs/cgroup
/dev/xvda1     ext3       477M   66M  387M   15% /boot
/dev/drbd0     ext4       2.0G  6.1M  1.9G    1% /mnt

1.4.手動のフェイルオーバ


手動でフェイルオーバさせてみます。
まず、pm01 をセカンダリにします。
[root@pm01 ~]# umount /mnt
[root@pm01 ~]# drbdadm secondary drbd0
[root@pm01 ~]# drbd-overview
 0:drbd0/0  Connected Secondary/Secondary UpToDate/UpToDate
次に、pm02 をプライマリにして、ファイルが見えるか確認します。
[root@pm02 ~]# drbdadm primary drbd0
[root@pm02 ~]# mount /dev/drbd0 /mnt
[root@pm02 ~]# ls -l /mnt
合計 20
drwx------ 2 root root 16384 11月  3 08:49 lost+found
drwxr-xr-x 2 root root  4096 11月  3 08:49 test
-rw-r--r-- 1 root root     0 11月  3 08:50 xx0
[root@pm02 ~]# drbd-overview
 0:drbd0/0  Connected Primary/Secondary UpToDate/UpToDate /mnt ext4 2.0G 6.1M 1.9G 1%
[root@pm02 ~]#

2.Apacheのドキュメントルートを変更する


Apacheのドキュメントルート(/var/www/html)を変更します。
設定ファイルを変更してもよかったのですが、今回は、DRBD用のボリュームにシンボリックリンクしました。
pm01 と pm02 でドキュメントルートを変更します。
[root@pm01 ~]# cd /var/www/
[root@pm01 www]# ls
cgi-bin  html
[root@pm01 www]# mv html html_BK
[root@pm01 www]# ln -s /mnt ./html
[root@pm01 www]# ls -l
合計 8
drwxr-xr-x 2 root root 4096  8月 25 03:12 cgi-bin
lrwxrwxrwx 1 root root    4 11月  3 10:07 html -> /mnt
drwxr-xr-x 2 root root 4096  8月 25 03:12 html_BK
あとで、動作確認できるように、テスト用のページも作成します。
pm01 を DRBD のプライマリにして、/mnt/index.html を作成します。
内容は以下のとおり。
[root@pm01 www]# cat /mnt/index.html
<html>
<head>
<title>TEST PAGE</title>
</head>
<body>
<h1>TEST PAGE</h1>
</body>
</html>

3.PacemakerにDRBDのリソースを登録する


DRBDのサービスを有効にするリソースを登録します。
[root@pm01 ~]# pcs resource create drbd0_res ocf:linbit:drbd params drbd_resource="drbd0"
DRBDのサービスをマスタ/スレーブにします。
[root@pm01 ~]# pcs resource master ms_drbd0 drbd0_res master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
DRBD用のボリュームをマウントするリソースを登録します。
[root@pm01 ~]# pcs resource create fsdrbd0_res Filesystem device=/dev/drbd0 directory=/mnt fstype=ext4
DRBDのマウントがマスタで動くようにします。
[root@pm01 ~]# pcs constraint colocation add fsdrbd0_res ms_drbd0 INFINITY with-rsc-role=Master
[root@pm01 ~]# pcs constraint order promote ms_drbd0 then start fsdrbd0_res
Adding ms_drbd0 fsdrbd0_res (kind: Mandatory) (Options: first-action=promote then-action=start)
リソースグループを変更します。
drbdのマウントをWebGroupに入れて、VIPチェックの次に起動するようにします。
[root@pm01 ~]# pcs resource group remove WebGroup vipcheck_res vip_res httpd_res
[root@pm01 ~]# pcs resource group add WebGroup vipcheck_res fsdrbd0_res vip_res httpd_res
クラスタの状態を確認します。
[root@pm01 ~]# pcs status
Cluster name: cluster_test
Last updated: Tue Nov  3 10:49:35 2015          Last change: Tue Nov  3 10:46:21 2015 by root via crm_attribute on pm02
Stack: corosync
Current DC: pm02 (version 1.1.13-a14efad) - partition with quorum
2 nodes and 10 resources configured

Online: [ pm01 pm02 ]

Full list of resources:

 Clone Set: ping-clone [ping]
     Started: [ pm01 pm02 ]
 fence_pm01     (stonith:fence_xenapi): Started pm02
 fence_pm02     (stonith:fence_xenapi): Started pm01
 Master/Slave Set: ms_drbd0 [drbd0_res]
     Masters: [ pm01 ]
     Slaves: [ pm02 ]
 Resource Group: WebGroup
     vipcheck_res       (ocf::myres:VIPCheck):  Started pm01
     fsdrbd0_res        (ocf::heartbeat:Filesystem):    Started pm01
     vip_res    (ocf::heartbeat:IPaddr2):       Started pm01
     httpd_res  (ocf::heartbeat:apache):        Started pm01

PCSD Status:
  pm01: Online
  pm02: Online

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

4.動作確認


まずは、pm01 が稼働系の場合に、VIPにアクセスしてテストページが表示できることを確認します。
[root@pm01 ~]# pcs status resources
 Clone Set: ping-clone [ping]
     Started: [ pm01 pm02 ]
 Master/Slave Set: ms_drbd0 [drbd0_res]
     Masters: [ pm01 ]
     Slaves: [ pm02 ]
 Resource Group: WebGroup
     vipcheck_res       (ocf::myres:VIPCheck):  Started
     fsdrbd0_res        (ocf::heartbeat:Filesystem):    Started
     vip_res    (ocf::heartbeat:IPaddr2):       Started
     httpd_res  (ocf::heartbeat:apache):        Started
[root@pm01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 4a:73:98:ab:45:82 brd ff:ff:ff:ff:ff:ff
    inet 10.1.0.71/32 brd 10.1.0.71 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.1.0.70/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::4873:98ff:feab:4582/64 scope link
       valid_lft forever preferred_lft forever
[root@pm01 ~]# curl http://10.1.0.70
<html>
<head>
<title>TEST PAGE</title>
</head>
<body>
<h1>TEST PAGE</h1>
</body>
</html>
[root@pm01 ~]#
手動でフェイルオーバさせます。
[root@pm01 ~]# pcs cluster standby pm01
VIPにアクセスしてテストページが見えることを確認します。
[root@pm01 ~]# pcs status resources
 Clone Set: ping-clone [ping]
     Started: [ pm02 ]
     Stopped: [ pm01 ]
 Master/Slave Set: ms_drbd0 [drbd0_res]
     Masters: [ pm02 ]
     Stopped: [ pm01 ]
 Resource Group: WebGroup
     vipcheck_res       (ocf::myres:VIPCheck):  Started
     fsdrbd0_res        (ocf::heartbeat:Filesystem):    Started
     vip_res    (ocf::heartbeat:IPaddr2):       Started
     httpd_res  (ocf::heartbeat:apache):        Started
[root@pm01 ~]# curl http://10.1.0.70
<html>
<head>
<title>TEST PAGE</title>
</head>
<body>
<h1>TEST PAGE</h1>
</body>
</html>
[root@pm01 ~]#