ディスクHAクラスタ化(Pacemaker+Corosync+pcs+DRBD)

最終更新日: 2018.02.20

■概要

DRBDでネットワーク間ミラーリングしたディスクをクラスタ化して、現用サーバー側がダウンしても待機サーバー側で同じデータにアクセスできるようにする。

HAクラスターシステム構築済であること


【前提条件】
サーバー1 192.168.1.15 node1
サーバー2 192.168.1.16 node2
仮想IPアドレス 192.168.1.17


■DRBD前提

DRBDはマウントレベル(/home等のディレクトリ)ではなく、デバイスレベル(/dev/VolGroup00/lvol0等)でデータの二重化を行うため、ハードディスク追加または、既存論理ボリュームサイズ縮小してDRBD用に空きの論理ボリュームを追加(※追加した論理ボリュームにファイルシステムは作成しないこと)する。
[root@cl1 ~]# df ← マウント状況照会
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       3428080   1557756   1693380  48% / ← 論理ボリューム(/dev/mapper/VolGroup00-LogVol00)に/が割当てられている
/dev/sda1               101086     17832     78035  19% /boot
tmpfs                   127796         0    127796   0% /dev/shm

[root@cl1 ~]# grep swap /etc/fstab ← swap割当てボリューム照会
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0 ← 論理ボリューム(/dev/VolGroup00/LogVol01)にswapが割当てられている

[root@cl1 ~]# lvdisplay -C ← 論理ボリューム一覧
  LV       VG         Attr   LSize   Origin Snap%  Move Log Copy%  Convert
  LogVol00 VolGroup00 -wi-ao   3.38G ← /に割当て済※上記照会結果より
  LogVol01 VolGroup00 -wi-ao 512.00M ← swapに割当て済※上記照会結果より
  lvol0    VolGroup00 -wi-a- 992.00M ← どこにも割当てられていない論理ボリューム※上記照会結果より

■DRBDインストール

[root@node1 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm ← ELRepoリポジトリ導入

[root@node1 ~]# yum -y install kmod-drbd84 ← DRBDインストール

■DRBD設定

[root@node1 ~]# vi /etc/drbd.d/r0.res ← DRBDリソース設定ファイル(リソース名(例:r0).res)作成
resource r0 { ← DRBDリソース名をr0とする
    device    /dev/drbd0;
    meta-disk internal;
    on node1 { ← node1ホスト名(「uname -n」コマンドで表示される名前)
        disk      /dev/centos/lvol0; ← node1論理ボリューム名
        address   192.168.1.15:7780; ← node1IPアドレス
    }
    on node2 { ← node2ホスト名(「uname -n」コマンドで表示される名前)
        disk      /dev/centos/lvol0; ← node2論理ボリューム名
        address   192.168.1.16:7780; ← node2IPアドレス
    }
}

[root@node1 ~]# drbdadm create-md r0 ← DRBDメタデータ作成
  --==  Thank you for participating in the global usage survey  ==--
The server's response is:

you are the 2025th user to install this version
initializing activity log
initializing bitmap (36 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
success

■DRBD起動

[root@node1 ~]# systemctl start drbd ← DRBD起動
※node2側のDRBD起動待ちとなるため、このまま、ここまでをnode2側でも実施する



■DRBD確認

[root@node1 ~]# drbdadm new-current-uuid --clear-bitmap r0/0 ← DRBDディスク初期同期スキップ(空ディスクの場合のみ)※ディスクにデータが格納されている場合はスキップしないこと

[root@node1 ~]# cat /proc/drbd ← node1側でDRBD状態確認
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:22
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r----- ← 両待機状態
    ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@node2 ~]# cat /proc/drbd ← node2側でDRBD状態確認
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:22
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r----- ← 両待機状態
    ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@node1 ~]# drbdadm primary all ← node1側を現用化

[root@node1 ~]# cat /proc/drbd ← node1側でDRBD状態確認
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:22
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ← 自ホスト(node1)側現用/node2側待機状態
    ns:0 nr:0 dw:0 dr:2120 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@node2 ~]# cat /proc/drbd ← node2側でDRBD状態確認
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:22
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----- ← 自ホスト(node2)側待機/node1側現用状態
    ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@node1 ~]# mkfs.xfs /dev/drbd0 ← node1側でDRBDデバイス(/dev/drbd0)にファイルシステム作成
meta-data=/dev/drbd0             isize=512    agcount=4, agsize=67836 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=271342, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

[root@node1 ~]# mount /dev/drbd0 /mnt ← node1側でDRBDデバイス(/dev/drbd0)を/mntディレクトリへマウント

[root@node1 ~]# df ← node1側でディスクマウント状態確認
ファイルシス            1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/centos-root    13588480 1963112 11625368   15% /
devtmpfs                     497288       0   497288    0% /dev
tmpfs                        508124   54624   453500   11% /dev/shm
tmpfs                        508124    6856   501268    2% /run
tmpfs                        508124       0   508124    0% /sys/fs/cgroup
/dev/vda1                    508588  214040   294548   43% /boot
tmpfs                        101628       0   101628    0% /run/user/0
/dev/drbd0                  1075128   32944  1042184    4% /mnt ← /dev/drbd0が/mntディレクトリへマウントされている

[root@node1 ~]# touch /mnt/test.txt ← node1側で/mntディレクトリへテストファイル作成

[root@node1 ~]# ll /mnt/ ← node1側で/mntディレクトリ照会
合計 0
-rw-r--r-- 1 root root 0 12月 19 18:36 test.txt ← テストファイルが作成されている

[root@node1 ~]# umount /mnt/ ← node1側で/mntディレクトリアンマウント

[root@node1 ~]# df ← node1側でディスクマウント状態確認
ファイルシス            1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/centos-root    13588480 1963092 11625388   15% /
devtmpfs                     497288       0   497288    0% /dev
tmpfs                        508124   54624   453500   11% /dev/shm
tmpfs                        508124    6856   501268    2% /run
tmpfs                        508124       0   508124    0% /sys/fs/cgroup
/dev/vda1                    508588  214040   294548   43% /boot
tmpfs                        101628       0   101628    0% /run/user/0
 ← /mntディレクトリがマウントされていない

[root@node1 ~]# drbdadm secondary all ← node1側を待機化

[root@node2 ~]# drbdadm primary all ← node2側を現用化

[root@node1 ~]# cat /proc/drbd ← node1側でDRBD状態確認
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:22
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----- ← 自ホスト(node1)側待機/node2側現用状態
    ns:12662 nr:0 dw:12662 dr:5334 al:15 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@node2 ~]# cat /proc/drbd ← node2側でDRBD状態確認
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:22
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ← 自ホスト(node2)側現用/node1側待機状態
    ns:0 nr:12662 dw:12662 dr:2120 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@node2 ~]# mount /dev/drbd0 /mnt ← node2側でDRBDデバイスを/mntディレクトリへマウント

[root@node2 ~]# df ← node2側でディスクマウント状態確認
ファイルシス            1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/centos-root    13588480 1960972 11627508   15% /
devtmpfs                     497288       0   497288    0% /dev
tmpfs                        508124   39216   468908    8% /dev/shm
tmpfs                        508124    6832   501292    2% /run
tmpfs                        508124       0   508124    0% /sys/fs/cgroup
/dev/vda1                    508588  214040   294548   43% /boot
tmpfs                        101628       0   101628    0% /run/user/0
/dev/drbd0                  1075128   32944  1042184    4% /mnt ← /dev/drbd0が/mntディレクトリへマウントされている

[root@node2 ~]# ll /mnt/ ← node2側で/mntディレクトリ照会
合計 0
-rw-r--r-- 1 root root 0 12月 19 18:36 test.txt ← node1側で作成したテストファイル

[root@node2 ~]# umount /mnt/ ← node2側で/mntディレクトリアンマウント

[root@node2 ~]# drbdadm secondary all ← node2側を待機に戻す

[root@node1 ~]# drbdadm primary all ← node1側を現用に戻す

[root@node1 ~]# cat /proc/drbd ← node1側でDRBD状態確認
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:22
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ← 自ホスト(node1)側現用/node2側待機状態
    ns:12662 nr:2050 dw:14713 dr:7454 al:15 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@node2 ~]# cat /proc/drbd ← node2側でDRBD状態確認
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:22
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----- ← 自ホスト(node2)側待機/node1側現用状態
    ns:2050 nr:12662 dw:14713 dr:3216 al:10 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

■DRBDクラスタ化

[root@node1 ~]# pcs resource create DRBD0 ocf:linbit:drbd drbd_resource="r0" --group apachegroup ← DRBDリソースr0※をDRBD0という名前でクラスタリソースに追加
※DRBDリソース名r0はDRBDリソース設定ファイルに定義

[root@node1 ~]# pcs resource master MS_DRBD0 DRBD0 master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true ← DRBD0をmaster/slave※として設定
※ディスクを常時同期するためリソースを両系で起動する指定

[root@node1 ~]# pcs resource cleanup MS_DRBD0 ← ステータスクリア
Cleaning up DRBD0:0 on node2, removing fail-count-DRBD0
Cleaning up DRBD0:0 on node1, removing fail-count-DRBD0
Cleaning up DRBD0:1 on node2, removing fail-count-DRBD0
Cleaning up DRBD0:1 on node1, removing fail-count-DRBD0
Waiting for 4 replies from the CRMd.... OK

[root@node1 ~]# pcs resource show ← リソース確認
 Resource Group: apachegroup
     vipcheck_res       (ocf::myres:VIPcheck):  Started node1
     VirtualIP  (ocf::heartbeat:IPaddr2):       Started node1
 Master/Slave Set: MS_DRBD0 [DRBD0] ← MS_DRBD0
     Masters: [ node1 ] ← node1側がmaster
     Slaves: [ node2 ] ← node2側がslave

[root@node1 ~]# pcs resource create FS_DRBD0 ocf:heartbeat:Filesystem device=/dev/drbd0 directory=/mnt fstype=xfs --group apachegroup ← /dev/drbd0をxfs形式で/mntディレクトリへマウントするクラスタリソースをFS_DRBD0という名前で追加

[root@node1 ~]# pcs resource show ← リソース確認
 Resource Group: apachegroup
     vipcheck_res       (ocf::myres:VIPcheck):  Started node1
     VirtualIP  (ocf::heartbeat:IPaddr2):       Started node1
     FS_DRBD0   (ocf::heartbeat:Filesystem):    Started node1 ← FS_DRBD0
 Master/Slave Set: MS_DRBD0 [DRBD0]
     Masters: [ node1 ]
     Slaves: [ node2 ]

[root@node1 ~]# pcs constraint colocation add apachegroup MS_DRBD0 INFINITY with-rsc-role=Master ← DRBDがmaster側のノードでリソースグループ(apachegroup)を起動する

[root@node1 ~]# pcs constraint order promote MS_DRBD0 then start apachegroup ← MS_DRBD0起動後にリソースグループ(apachegroup)を起動する
Adding MS_DRBD0 apachegroup (kind: Mandatory) (Options: first-action=promote then-action=start)

[root@node1 ~]# pcs constraint colocation add FS_DRBD0 MS_DRBD0 INFINITY with-rsc-role=Master ← DRBDがMaster側のノードでFS_DRBD0リソースを起動する

[root@node1 ~]# pcs constraint order promote MS_DRBD0 then start FS_DRBD0 ← MS_DRBD0起動後にFS_DRBD0リソースを起動する
Adding MS_DRBD0 FS_DRBD0 (kind: Mandatory) (Options: first-action=promote then-action=start)

■DRBDクラスタ化確認

(1)クラスタ確認
[root@node1 ~]# df ← node1側でディスクマウント状態確認
ファイルシス            1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/centos-root    13588480 1966688 11621792   15% /
devtmpfs                     497288       0   497288    0% /dev
tmpfs                        508124   39216   468908    8% /dev/shm
tmpfs                        508124    6860   501264    2% /run
tmpfs                        508124       0   508124    0% /sys/fs/cgroup
/dev/vda1                    508588  214040   294548   43% /boot
tmpfs                        101628       0   101628    0% /run/user/0
/dev/drbd0                  1075128   32944  1042184    4% /mnt ← /dev/drbd0が/mntディレクトリへマウントされている

[root@node2 ~]# df ← node2側でディスクマウント状態確認
ファイルシス            1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/centos-root    13588480 1965148 11623332   15% /
devtmpfs                     497288       0   497288    0% /dev
tmpfs                        508124   54624   453500   11% /dev/shm
tmpfs                        508124   13216   494908    3% /run
tmpfs                        508124       0   508124    0% /sys/fs/cgroup
/dev/vda1                    508588  214040   294548   43% /boot
tmpfs                        101628       0   101628    0% /run/user/0
 ← /mntディレクトリがマウントされていない

(2)フェイルオーバー
[root@node1 ~]# halt ← node1(現用側)システム停止

[root@node2 ~]# pcs status ← node2側でクラスタ状態確認
Cluster name: mycluster
Stack: corosync
Current DC: node2 (version 1.1.16-12.el7_4.5-94ff4df) - partition with quorum
Last updated: Wed Dec 20 14:50:51 2017
Last change: Tue Dec 19 19:10:58 2017 by root via cibadmin on node1

2 nodes configured
5 resources configured

Online: [ node2 ]
OFFLINE: [ node1 ] ← node1がオフライン状態になった

Full list of resources:

 Resource Group: apachegroup
     vipcheck_res       (ocf::myres:VIPcheck):  Started node2 ← リソースがnode2側に移動した
     VirtualIP  (ocf::heartbeat:IPaddr2):       Started node2 ← リソースがnode2側に移動した
     FS_DRBD0   (ocf::heartbeat:Filesystem):    Started node2 ← リソースがnode2側に移動した
 Master/Slave Set: MS_DRBD0 [DRBD0]
     Masters: [ node2 ] ← DRBDのmasterがnode2側に切り替わった
     Stopped: [ node1 ]

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

[root@node2 ~]# df ← node2側でディスクマウント状態確認
ファイルシス            1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/centos-root    13588480 1965360 11623120   15% /
devtmpfs                     497288       0   497288    0% /dev
tmpfs                        508124   54624   453500   11% /dev/shm
tmpfs                        508124    6824   501300    2% /run
tmpfs                        508124       0   508124    0% /sys/fs/cgroup
/dev/vda1                    508588  214040   294548   43% /boot
tmpfs                        101628       0   101628    0% /run/user/0
/dev/drbd0                  1075128   32944  1042184    4% /mnt ← /dev/drbd0が/mntディレクトリへマウントされている

(3)フェイルバック
node1起動

[root@node1 ~]# pcs status ← クラスタ状態確認
Cluster name: mycluster
Stack: corosync
Current DC: node2 (version 1.1.16-12.el7_4.5-94ff4df) - partition with quorum
Last updated: Wed Dec 20 14:53:27 2017
Last change: Tue Dec 19 19:10:58 2017 by root via cibadmin on node1

2 nodes configured
5 resources configured

Online: [ node1 node2 ] ← node1がオンライン状態になった

Full list of resources:

 Resource Group: apachegroup
     vipcheck_res       (ocf::myres:VIPcheck):  Started node2 ← リソースはnode2側のまま
     VirtualIP  (ocf::heartbeat:IPaddr2):       Started node2 ← リソースはnode2側のまま
     FS_DRBD0   (ocf::heartbeat:Filesystem):    Started node2 ← リソースはnode2側のまま
 Master/Slave Set: MS_DRBD0 [DRBD0]
     Masters: [ node2 ] ← DRBDのmasterはnode2側のまま
     Slaves: [ node1 ]

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

[root@node1 ~]# pcs cluster standby node2 ← node2側をスタンバイ状態へ切替

[root@node1 ~]# pcs status ← クラスタ状態確認
Cluster name: mycluster
Stack: corosync
Current DC: node2 (version 1.1.16-12.el7_4.5-94ff4df) - partition with quorum
Last updated: Wed Dec 20 15:16:20 2017
Last change: Wed Dec 20 15:16:06 2017 by root via cibadmin on node1

2 nodes configured
5 resources configured

Node node2: standby ← node2がスタンバイ状態になった
Online: [ node1 ]

Full list of resources:

 Resource Group: apachegroup
     vipcheck_res       (ocf::myres:VIPcheck):  Started node1 ← リソースがnode1側に移動した
     VirtualIP  (ocf::heartbeat:IPaddr2):       Started node1 ← リソースがnode1側に移動した
     FS_DRBD0   (ocf::heartbeat:Filesystem):    Started node1 ← リソースがnode1側に移動した
 Master/Slave Set: MS_DRBD0 [DRBD0]
     Masters: [ node1 ] ← DRBDのmasterがnode1側に切り替わった
     Stopped: [ node2 ]

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

[root@node1 ~]# pcs cluster unstandby node2 ← node2側のスタンバイ状態を解除

[root@node1 ~]# pcs status ← クラスタ状態確認
Cluster name: mycluster
Stack: corosync
Current DC: node2 (version 1.1.16-12.el7_4.5-94ff4df) - partition with quorum
Last updated: Wed Dec 20 15:17:16 2017
Last change: Wed Dec 20 15:17:11 2017 by root via cibadmin on node1

2 nodes configured
5 resources configured

Online: [ node1 node2 ] ← node2がオンライン状態になった

Full list of resources:

 Resource Group: apachegroup
     vipcheck_res       (ocf::myres:VIPcheck):  Started node1 ← リソースはnode1側のまま
     VirtualIP  (ocf::heartbeat:IPaddr2):       Started node1 ← リソースはnode1側のまま
     FS_DRBD0   (ocf::heartbeat:Filesystem):    Started node1 ← リソースはnode1側のまま
 Master/Slave Set: MS_DRBD0 [DRBD0]
     Masters: [ node1 ] ← DRBDのmasterはnode1側のまま
     Slaves: [ node2 ]

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

[root@node1 ~]# df ← node1側でディスクマウント状態確認
ファイルシス            1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/centos-root    13588480 1967292 11621188   15% /
devtmpfs                     497288       0   497288    0% /dev
tmpfs                        508124   39216   468908    8% /dev/shm
tmpfs                        508124    6824   501300    2% /run
tmpfs                        508124       0   508124    0% /sys/fs/cgroup
/dev/vda1                    508588  214040   294548   43% /boot
tmpfs                        101628       0   101628    0% /run/user/0
/dev/drbd0                  1075128   32944  1042184    4% /mnt ← /dev/drbd0が/mntディレクトリへマウントされている


■関連コンテンツ




▲このページのトップへ戻る

ご自由にリンクしてください(連絡は不要です)
本ページへのご意見・ご要望、誤字・脱字・リンク切れ等のご連絡はこちらからお願いします