EC2で CentOS 6.5 + DRBD8.4 + Pacemaker を使う

takaokaです。

2台のEC2にCentOS 6.5をインストールし、DRBD8.4 + Pacemaker を組合せてクラスタ環境を導入してみました。
2台ともOS領域、データ領域のEBSをアタッチ。データ領域をDRBDで保護します。
サブネットは2つのAZに分けEC2をそれぞれに配置。2台間のセキュリティグループはここでは全て通しています。  

下準備

2台のEC2(以降、1号機 / 2号機とよびます。)にCentOS6.5のインストールし、予め次の内容を実施しておきます。

タイムゾーンの変更(UTC->JST)
・ntpインストールとntpd自動起動on
・ホスト名変更
1号機:drbd01.local / 2号機:drbd02.local としています。
selinux 無効化
iptables/ip6talbes 自動起動off
yum install lvm2 xfsprogs
・サーバ再起動
 

DRBD同期用のパーティション設定

パーティション設定【1号機、2号機】

データ領域のパーティションをLVMで作成します。最終的に次のようになります。

[root@drbd01 ~]# fdisk -l /dev/xvdf

Disk /dev/xvdf: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x76988ee9

    Device Boot      Start         End      Blocks   Id  System
/dev/xvdf1               1         261     2096451   8e  Linux LVM
[root@drbd01 ~]#

 

LVM設定【1号機、2号機】

次の内容を実行します。※結果は割愛しています。

[root@drbd01 ~]# pvcreate /dev/xvdf1
[root@drbd01 ~]# vgcreate VolDrbd /dev/xvdf1
[root@drbd01 ~]# lvcreate -L 1G -n lv_drbd VolDrbd

最終的に次のようになります。

[root@drbd01 ~]# pvs
  PV         VG      Fmt  Attr PSize PFree
  /dev/sdf1  VolDrbd lvm2 a--  2.00g 1020.00m
[root@drbd01 ~]# vgs
  VG      #PV #LV #SN Attr   VSize VFree
  VolDrbd   1   1   0 wz--n- 2.00g 1020.00m
[root@drbd01 ~]# lvs
  LV      VG      Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv_drbd VolDrbd -wi-a----- 1.00g
[root@drbd01 ~]#

 

DRBDのインストール、設定

DRBDのインストール【1号機、2号機】 次の内容を実行します。※結果は割愛しています。

# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
# yum install drbd84-utils kmod-drbd84

 

/etc/drbd.d/global_common.conf の修正【1号機、2号機】

変更前:

usage-count yes;

変更後:

usage-count no;

 

/etc/drbd.d/ebs.res 新規作成【1号機、2号機】

address行のIPアドレスは、各インスタンスのアドレスを記述しています。

resource r0 {
    protocol C;
    device /dev/drbd0;
    meta-disk internal;
    disk /dev/mapper/VolDrbd-lv_drbd;

    on drbd01.local {
        address 10.0.0.234:7789;
    }
    on drbd02.local {
        address 10.0.2.67:7789;
    }
}

 

DRBDのメタファイル作成【1号機、2号機】

次の内容を実行します。

[root@drbd01 ~]# drbdadm create-md r0
ERROR: modinfo: could not find module drbd
ERROR: modinfo: could not find module drbd
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
[root@drbd01 ~]#

 

drbdの自動起動off、サーバの再起動【1号機、2号機】

次の内容を実行します。※結果は割愛しています。

[root@drbd01 ~]# chkconfig drbd off
[root@drbd01 ~]# shutdown -r now

 

drbdの起動と確認【1号機、2号機】

【1号機】からdrbdを起動します

[root@drbd01 ~]# /etc/init.d/drbd start
Starting DRBD resources: [
     create res: r0
   prepare disk: r0
    adjust disk: r0
     adjust net: r0
]
..........
***************************************************************
 DRBD's startup script waits for the peer node(s) to appear.
 - If 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
   is 0 seconds. [wfc-timeout]
   (These values are for resource 'r0'; 0 sec -> wait forever)
 To abort waiting enter 'yes' [  20]: yes

.
WARN: nothing stacked for this host (drbd01.local), nothing to do in stacked mode!
[root@drbd01 ~]#

【1号機】drbdの状態を確認してみる

[root@drbd01 ~]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R6, 2015-04-09 14:35:00
 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:1048508
[root@drbd01 ~]#

【2号機】のdrbdも起動

[root@drbd02 ~]# /etc/init.d/drbd start
Starting DRBD resources: [
     create res: r0
   prepare disk: r0
    adjust disk: r0
     adjust net: r0
]
.
WARN: nothing stacked for this host (drbd02.local), nothing to do in stacked mode!
[root@drbd02 ~]#

【2号機】drbdの状態を確認してみる

[root@drbd02 ~]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R6, 2015-04-09 14:35:00
 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:1048508
[root@drbd02 ~]#

【1号機】drbdの状態を確認してみる

[root@drbd01 ~]#  cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R6, 2015-04-09 14:35:00
 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:1048508
[root@drbd01 ~]#

 

プライマリ昇格【1号機】

次の内容を実行します。実行後に同期が開始されます。

[root@drbd01 ~]# drbdadm -- --overwrite-data-of-peer primary r0

【1号機】同期中の状態

[root@drbd01 ~]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R6, 2015-04-09 14:35:00
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---n-
    ns:51224 nr:0 dw:0 dr:52020 al:0 bm:0 lo:0 pe:35 ua:7 ap:0 ep:1 wo:f oos:998044
        [>...................] sync'ed:  5.1% (998044/1048508)K
        finish: 0:03:36 speed: 4,584 (4,584) K/sec
[root@drbd01 ~]#

【2号機】同期中の状態

[root@drbd02 ~]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R6, 2015-04-09 14:35:00
 0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
    ns:0 nr:110704 dw:110528 dr:0 al:0 bm:0 lo:9 pe:32 ua:8 ap:0 ep:1 wo:f oos:937980
        [=>..................] sync'ed: 11.0% (937980/1048508)K
        finish: 0:02:15 speed: 6,908 (6,908) want: 13,200 K/sec
[root@drbd02 ~]#

【1号機】同期完了の状態

[root@drbd01 ~]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R6, 2015-04-09 14:35:00
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:1048508 nr:0 dw:0 dr:1049172 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
[root@drbd01 ~]#

【2号機】同期完了の状態

[root@drbd02 ~]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R6, 2015-04-09 14:35:00
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
    ns:0 nr:1048508 dw:1048508 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
[root@drbd02 ~]#

 

drbdの自動起動on【1号機、2号機】

次の内容を実行します。

[root@drbd01 ~]#chkconfig drbd on

 

データ領域のマウント、xfsフォーマット

【1号機、2号機】次の内容を実行します。

[root@drbd01 ~]# mkdir /data

【1号機】次の内容を実行します。

[root@drbd01 ~]# mkfs.xfs /dev/drbd0
meta-data=/dev/drbd0             isize=256    agcount=4, agsize=65532 blks
         =                       sectsz=512   attr=2, projid32bit=0
data     =                       bsize=4096   blocks=262127, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal log           bsize=4096   blocks=1200, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@drbd01 ~]# mount -t xfs /dev/drbd0 /data

【1号機】そして確認

[root@drbd01 ~]# mount
/dev/xvde on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/drbd0 on /data type xfs (rw)
[root@drbd01 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvde       7.8G  780M  6.6G  11% /
tmpfs           296M     0  296M   0% /dev/shm
/dev/drbd0     1020M   33M  988M   4% /data
[root@drbd01 ~]#

 

Pacemakerのインストール、設定

次のURLからheartbeatが入っている「pacemaker-1.0.13-2.1.el6.x86_64.repo.tar.gz」をダウンロードして、1号機、2号機にアップロードしておきましょう。

https://osdn.jp/projects/linux-ha/releases/61791

Pacemakerのインストール【1号機、2号機】

次の内容を実行します。※結果は割愛しています。

[root@drbd01 ~]# mv pacemaker-1.0.13-2.1.el6.x86_64.repo.tar.gz /tmp/
[root@drbd01 ~]# cd /tmp
[root@drbd01 tmp]# tar xzf pacemaker-1.0.13-2.1.el6.x86_64.repo.tar.gz
[root@drbd01 tmp]# cd pacemaker-1.0.13-2.1.el6.x86_64.repo/
[root@drbd01 tmp]# yum -c pacemaker.repo install pacemaker-1.0.13 heartbeat

 

Pacemakerの設定準備【1号機、2号機】

雛形が用意されているのでコピーします。

[root@drbd01 ~]# cp /usr/share/doc/heartbeat-3.0.5/authkeys /etc/ha.d/
[root@drbd01 ~]# cp /usr/share/doc/heartbeat-3.0.5/ha.cf /etc/ha.d/

 

/etc/ha.d/authkeys の修正【1号機、2号機】

サーバ間の認証方式。ここでは「crc」を指定しました。 変更前:

#auth 1
#1 crc
#2 sha1 HI!
#3 md5 Hello!

変更後:

auth 1
1 crc
#2 sha1 HI!
#3 md5 Hello!

設定ファイルのオーナーを変更する

[root@drbd01 ~]# chmod 600 /etc/ha.d/authkeys

 

/etc/ha.d/ha.cf の修正【1号機、2号機】

最終的に次のようにしました。ucast行のIPアドレスは、対向先のアドレスを記述します。

[root@drbd01 ~]# egrep -v '^#|^$' /etc/ha.d/ha.cf
pacemaker on
logfile /var/log/ha-log
logfacility     local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
ucast eth0 10.0.xx.xx
auto_failback on
node drbd01.local
node drbd02.local
[root@drbd01 ~]#

heartbeartの起動【1号機、2号機】

・今回のハマりポイント 1号機、2号機ともに「/etc/init.d/heartbeart start」を実行すると、何も表示されずプロンプトに戻ってしまう事象が発生。プロセスも存在しないのです。

試しに次の内容を実行したところ、/usr/libexec/heartbeat/heartbeatが存在しないためexitしています。

[root@drbd01 ~]# bash -x /etc/init.d/heartbeat start
~省略~
+ '[' -x /usr/libexec/heartbeat/heartbeat ']'
+ exit 0
[root@drbd01 ~]# ls -l /usr/libexec/heartbeat/heartbeat
ls: cannot access /usr/libexec/heartbeat/heartbeat: No such file or directory
[root@drbd01 ~]#
[/shell]
ちなみにheartbeat起動スクリプト内、上記エラー判定部分は次のように記述されています。
[shell]
[ -x $HA_BIN/heartbeat ] || exit 0
[/shell]
heartbeat実行ファイルをfindすると、lib64配下に存在している。
[shell]
[root@drbd01 ~]# find /usr/ -name heartbeat -type f
/usr/lib64/heartbeat/heartbeat
[root@drbd01 ~]#

調べたところ「/etc/ha.d/shellfuncs」内に直接 $HA_BIN を記述する方法で対処できるのが分かりましたが、今回はシンボリックリンクで対応しました。

・ハマリポイント回避【1号機、2号機】
heartbeartが起動しない場合の今回の対応。シンボリックリンクを張る。

[root@drbd01 ~]# ln -s /usr/lib64/heartbeat/heartbeat /usr/libexec/heartbeat/heartbeat
[root@drbd01 ~]# ls -l /usr/libexec/heartbeat/heartbeat
[root@drbd01 ~]# lrwxrwxrwx 1 root root 30 Nov 20 13:14 /usr/libexec/heartbeat/heartbeat -> /usr/lib64/heartbeat/heartbeat

・heartbeartの起動【1号機、2号機】

[root@drbd01 ~]# /etc/init.d/heartbeat start
Starting High-Availability services: Done.

[root@drbd01 ~]#

 

heartbeart確認【1号機、2号機】

次の内容を実行します。少し経ってからOnline部分に1号機、2号機が表示されクラスタに組み込まれたことがわかります。

[root@drbd01 ~]# crm status
============
Last updated: Fri Nov 20 13:16:01 2015
Stack: Heartbeat
Current DC: drbd02.local (85cb0a0e-d6d6-4d53-b86a-30207afca813) - partition with quorum
Version: 1.0.13-a83fae5
2 Nodes configured, unknown expected votes
0 Resources configured.
============

Online: [ drbd01.local drbd02.local ]

[root@drbd01 ~]#

 

Pacemakerにリソースを登録する【1号機】

次の内容を実行すると、リソースの登録が可能なプロンプトに変わります。

[root@drbd01 ~]# crm configure
INFO: building help index
crm(live)configure#

次の内容を実行し、DRBDリソースの設定を追加していきます。※プロンプト表示部は割愛しています。

property stonith-enabled="false" \
no-quorum-policy="ignore"

rsc_defaults resource-stickiness="INFINITY" \
migration-threshold="1"

primitive res_drbd ocf:linbit:drbd params drbd_resource="r0" \
op monitor interval="10s" role="Slave" timeout="20s" \
op monitor interval="10s" role="Master" timeout="20s" \
op start interval="0s" timeout="240s" \
op stop interval="0s" timeout="100s"

ms ms_drbd res_drbd meta notify="true"

primitive res_fs ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/data" fstype="xfs" \
op start interval="0s" timeout="60s" \
op stop interval="0s" timeout="60s"

colocation col_fs_drbd inf: res_fs ms_drbd:Master

order ord_fs_drbd inf: ms_drbd:promote res_fs:start

上記を実行すると設定のみ追加され、まだ登録されていません。 次の内容を実行して、設定を登録反映します。

crm(live)configure# commit

設定の確認

crm(live)configure# show
node $id="4b57ec36-924a-43fa-9b20-505342daa2f0" drbd01.local
node $id="bde01230-cb7b-45b5-82b1-92c4954203b6" drbd02.local
primitive res_drbd ocf:linbit:drbd \
        params drbd_resource="r0" \
        op monitor interval="10s" role="Slave" timeout="20s" \
        op monitor interval="10s" role="Master" timeout="20s" \
        op start interval="0s" timeout="240s" \
        op stop interval="0s" timeout="100s"
primitive res_fs ocf:heartbeat:Filesystem \
        params device="/dev/drbd0" directory="/data" fstype="xfs" \
        op start interval="0s" timeout="60s" \
        op stop interval="0s" timeout="60s"
ms ms_drbd res_drbd \
        meta notify="true"
colocation col_fs_drbd inf: res_fs ms_drbd:Master
order ord_fs_drbd inf: ms_drbd:promote res_fs:start
property $id="cib-bootstrap-options" \
        dc-version="1.0.13-a83fae5" \
        cluster-infrastructure="Heartbeat" \
        stonith-enabled="false" \
        no-quorum-policy="ignore"
rsc_defaults $id="rsc-options" \
        resource-stickiness="INFINITY" \
        migration-threshold="1"
crm(live)configure# bye
[root@drbd01 ~]#

リソース登録後のクラスタ確認

[root@drbd01 ~]# crm status
============
Last updated: Fri Nov 20 13:19:19 2015
Stack: Heartbeat
Current DC: drbd02.local (85cb0a0e-d6d6-4d53-b86a-30207afca813) - partition with quorum
Version: 1.0.13-a83fae5
2 Nodes configured, unknown expected votes
2 Resources configured.
============

Online: [ drbd01.local drbd02.local ]

 Master/Slave Set: ms_drbd
     Masters: [ drbd01.local ]
     Slaves: [ drbd02.local ]
 res_fs (ocf::heartbeat:Filesystem):    Started drbd01.local
[root@drbd01 ~]#

これでDRBDもクラスタに組み込まれ制御される状態になりました。  

2号機にDRBDリソース切り替えてみる

ここはおもむろに1号機をshutdownして停止してみます。
1号機停止後、2号機側で次の内容を実行して確認してみます。1号機側はOFFLINEとなり、2号機側でDRBDのリソースを持っていることが確認できます。

[root@drbd02 ~]# crm status
============
Last updated: Fri Nov 20 13:21:56 2015
Stack: Heartbeat
Current DC: drbd02.local (85cb0a0e-d6d6-4d53-b86a-30207afca813) - partition with quorum
Version: 1.0.13-a83fae5
2 Nodes configured, unknown expected votes
2 Resources configured.
============

Online: [ drbd02.local ]
OFFLINE: [ drbd01.local ]

 Master/Slave Set: ms_drbd
     Masters: [ drbd02.local ]
     Stopped: [ res_drbd:0 ]
 res_fs (ocf::heartbeat:Filesystem):    Started drbd02.local
[root@drbd02 ~]#
[/shell]
2号機側でデータ領域がマウントされる。
[shell]
[root@drbd02 ~]# mount
/dev/xvde on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/drbd0 on /data type xfs (rw)
[root@drbd02 tmp]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvde       7.8G  946M  6.5G  13% /
tmpfs           296M     0  296M   0% /dev/shm
/dev/drbd0     1020M   33M  988M   4% /data
[root@drbd02 ~]#

 

 

 

アプリケーション開発バナー