前回までの記事で、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. successpm01と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:0drbd-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=trueDRBD用のボリュームをマウントするリソースを登録します。
[root@pm01 ~]# pcs resource create fsdrbd0_res Filesystem device=/dev/drbd0 directory=/mnt fstype=ext4DRBDのマウントがマスタで動くようにします。
[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 pm01VIPにアクセスしてテストページが見えることを確認します。
[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 ~]#