作っておぼえるHAシステム4

2台のLinuxサーバを使ってアクティブ・スタンバイで動くDBクラスターが構築できたので、実際に障害を発生させてHAシステムの動きを見てみましょう。

サーバのハングアップ試験

サーバ機の電源障害やマザーボードの故障が発生したことを想定して、アクティブなノードを停止してみます。

まず正常時の動作の状態を確認します。

動作の確認にはcrm_mon コマンドを使います。-frを引数に実行するとリソースの状態が表示されます。(引数に1を加えるとこの表示は1度だけ行われます。)

[root@node2 ~]# crm_mon -fr1
Stack: corosync
Current DC: node1.sios.com (version 1.1.21.linbit-4.0.el7-f14e36fd43) - partition with quorum
Last updated: Fri Dec 18 13:26:07 2020
Last change: Fri Dec 18 13:23:14 2020 by hacluster via crmd on node1.sios.com

2 nodes configured
5 resources configured

Online: [ node1.sios.com node2.sios.com ]

Full list of resources:

 Resource Group: rg_mariadb
     res_ipadr	(ocf::heartbeat:IPaddr2):	Started node1.sios.com
     res_fsmnt	(ocf::heartbeat:Filesystem):	Started node1.sios.com
     res_mysql	(ocf::heartbeat:mysql):	Started node1.sios.com
 Master/Slave Set: ms_drbd_r0 [res_drbd_r0]
     Masters: [ node1.sios.com ]
     Slaves: [ node2.sios.com ]

Migration Summary:
* Node node1.sios.com:
* Node node2.sios.com:

Started node1.sios.comの表示からMariaDBはnode1.sios.comで動いています。DRBDもnode1.sios.comがPrimaryになっていることがわかります。

ではnode1.sios.comを停止します。

本Blogのテスト環境はVirtualbox上で動いていますので、Virtualboxのウィンドウを閉じると、実行中の仮想ゲストを強制停止できます。実サーバで試されている場合は、電源ボタンを長押ししたり、リセットボタンを押すことで強制停止ができます。

上の図の「仮想マシンの電源オフ(P)」を選ぶとnode1.sios.comが停止します。node2.sios.comではDRBDとPacemakerが動いてるので、crm_monコマンドを実行すると、node2.sios.comに運転が切り替わったことが確認できます。この切り替わりのことをフェールオーバーと言います。

 

[root@node2 ~]# crm_mon -fr1
Stack: corosync
Current DC: node2.sios.com (version 1.1.21.linbit-4.0.el7-f14e36fd43) - partition with quorum
Last updated: Fri Dec 18 13:36:18 2020
Last change: Fri Dec 18 13:23:14 2020 by hacluster via crmd on node1.sios.com

2 nodes configured
5 resources configured

Online: [ node2.sios.com ]
OFFLINE: [ node1.sios.com ]

Full list of resources:

 Resource Group: rg_mariadb
     res_ipadr	(ocf::heartbeat:IPaddr2):	Started node2.sios.com
     res_fsmnt	(ocf::heartbeat:Filesystem):	Started node2.sios.com
     res_mysql	(ocf::heartbeat:mysql):	Started node2.sios.com
 Master/Slave Set: ms_drbd_r0 [res_drbd_r0]
     Masters: [ node2.sios.com ]
     Stopped: [ node1.sios.com ]

Migration Summary:
* Node node2.sios.com:
[root@node2 ~]# 

試験前の表示と比べると、各リソースがnode2.sios.comで動いているのがわかります。またnode1.sios.comは停止しているので、Pacemaker上からは管理できないオフライン(「OFFLINE:」)のノードになります。

この時点でnode1.sios.comを起動して、Pacemakerを起動すると次のように状態が変わります。

[root@node2 ~]# crm_mon -fr1
Stack: corosync
Current DC: node2.sios.com (version 1.1.21.linbit-4.0.el7-f14e36fd43) - partition with quorum
Last updated: Fri Dec 18 13:39:09 2020
Last change: Fri Dec 18 13:23:14 2020 by hacluster via crmd on node1.sios.com

2 nodes configured
5 resources configured

Online: [ node1.sios.com node2.sios.com ]

Full list of resources:

 Resource Group: rg_mariadb
     res_ipadr	(ocf::heartbeat:IPaddr2):	Started node2.sios.com
     res_fsmnt	(ocf::heartbeat:Filesystem):	Started node2.sios.com
     res_mysql	(ocf::heartbeat:mysql):	Started node2.sios.com
 Master/Slave Set: ms_drbd_r0 [res_drbd_r0]
     Masters: [ node2.sios.com ]
     Slaves: [ node1.sios.com ]

Migration Summary:
* Node node1.sios.com:
* Node node2.sios.com:

「OFFLINE:」の表示が消えて、「Online:」の項目にnode1.sios.comのホスト名が加わっています。またDRBDも「Stopped:」から「Slave:」に表示が変わりました。
HAクラスタとしては完全に復旧しているので、次にnode2.sios.comが停止するとサービスはnode1.sios.comへフェールオーバーできます。

DRBDのデータ確認

DRBDのデータも確認してみましょう。drbdadm statusコマンドでデータの状態を確認します。node1.sios.comで実行してみたところ次のようになりました。

[root@node1 ~]# drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  node2 role:Primary
    peer-disk:UpToDate

自ノードのストレージの状態が「disk:UpToDate」、同期中のnode2のストレージの状態が「peer-disk:UpToDate」と両方とも「UpToDate」になっているのでデータの同期は正常で、node1.sios.comはいつでもサービスを引き継げる状態になっているとわかります。drbdadmコマンドはnode1.sios.comで実行したので、node2.sios.comがPrimaryになっていることがわかります。

次のような状態になっている場合は、node2.sios.comからデータ同期をまさに行っている状態になります。

[root@node1 ~]# drbdadm status r0
r0 role:Secondary
  disk:Inconsistent
  node2 role:Primary
    replication:SyncTarget peer-disk:UpToDate done:17.37

node1.sios.comが停止している間はnode2.sios.comで生じたデータの差分をDRBDは記録していて、再接続後に不足しているデータを差分同期します。上記の表示の「disk:Inconsistent」の状態はデータの不整合が発生していること、「replication:SyncTarget」はnode2.sios.comからnode1.sios.comにデータの同期が行われていること、 「done:17.37」は同期対象のデータの17.37%の同期が終了したことを意味しています。同期が100%になると、「disk:UpToDate」になり、node1.sios.comのデータはnode2.sios.comに完全に同期した状態になります。

次は同期終了後の正常な状態の表示になります。

[root@node1 ~]# drbdadm status r0
r0 role:Secondary
  disk:UpToDate
  node2 role:Primary
    peer-disk:UpToDate

また障害から復旧したnode1.sios.comでDRBDの状態が、次のようになる場合があります。

[root@node1 ~]# drbdadm status r0
r0 role:Secondary
  disk:Outdated
  node2 connection:StandAlone

「connection:StandAlone」は相手との通信が切れていることを意味します。相手との通信を試みている場合は「connection:Connecting」となります。
「connection:StandAlone」となった場合は”drbdadm connect <リソース名>”で復旧出来る場合もありますが、すぐにStandAloneになってしまう場合は、DRBDのデータがスプリットブレインになっていることが大半です。

スプリットブレインになっているかどうかは/var/log/messagesに記録されるDRBDのログの中に”Split-Brain detected”の文字列があるか確認して下さい。

Dec 18 14:21:13 node1 kernel: drbd r0/0 drbd0: Split-Brain detected but unresolved, dropping connection!

スプリットブレインであると確認できたら復旧作業を行います。方法の詳細はユーザーズ・ガイドを参照して下さい。
復旧作業後、両ノードのDRBD同期は再開します。