作っておぼえるHAシステム4(2022年版)

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

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

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

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

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

[root@node2 ‾]# 
Cluster Summary:
  * Stack: corosync
  * Current DC:	node1 (version 2.0.5.linbit-1.0.el8-ba59be712) - partition with quorum
  * Last updated: Thu Dec 15 16:21:27 2022
  * Last change:  Thu Dec 15 16:17:36 2022 by hacluster via crmd on node1
  * 2 nodes configured
  * 5 resource instances configured

Node List:
  * Online: [ node1 node2 ]

Full List of Resources:
  * Resource Group: rg_mariadb:
    * res_ipadr (ocf::heartbeat:IPaddr2):        Started node1
    * res_fsmnt (ocf::heartbeat:Filesystem):     Started node1
    * res_mysql (ocf::heartbeat:mysql):  Started node1
  * Clone Set: ms_drbd_r0 [res_drbd_r0] (promotable):
    * Masters: [ node1 ]
    * Slaves: [ node2 ]

Node Attributes:
  * Node: node1:
    * master-res_drbd_r0                : 10000
  * Node: node2:
    * master-res_drbd_r0                : 10

Migration Summary:

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

ではnode1を停止します。

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

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

 

[root@node2 ‾]# crm_mon -fr1
Cluster Summary:
  * Stack: corosync
  * Current DC: node2 (version 2.0.5.linbit-1.0.el8-ba59be712) - partition with quorum
  * Last updated: Thu Dec 15 16:23:42 2022
  * Last change:  Thu Dec 15 16:17:36 2022 by hacluster via crmd on node1
  * 2 nodes configured
  * 5 resource instances configured

Node List:
  * Online: [ node2 ]
  * OFFLINE: [ node1 ]

Full List of Resources:
  * Resource Group: rg_mariadb:
    * res_ipadr	(ocf::heartbeat:IPaddr2):	 Started node2
    * res_fsmnt	(ocf::heartbeat:Filesystem):	 Started node2
    * res_mysql	(ocf::heartbeat:mysql):	 Started node2
  * Clone Set: ms_drbd_r0 [res_drbd_r0] (promotable):
    * Masters: [ node2 ]
    * Stopped: [ node1 ]

Migration Summary:

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

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

[root@node2 ‾]# crm_mon -fr1
Cluster Summary:
  * Stack: corosync
  * Current DC: node2 (version 2.0.5.linbit-1.0.el8-ba59be712) - partition with quorum
  * Last updated: Thu Dec 15 16:24:53 2022
  * Last change:  Thu Dec 15 16:17:36 2022 by hacluster via crmd on node1
  * 2 nodes configured
  * 5 resource instances configured

Node List:
  * Online: [ node1 node2 ]

Full List of Resources:
  * Resource Group: rg_mariadb:
    * res_ipadr	(ocf::heartbeat:IPaddr2):	 Started node2
    * res_fsmnt	(ocf::heartbeat:Filesystem):	 Started node2
    * res_mysql	(ocf::heartbeat:mysql):	 Started node2
  * Clone Set: ms_drbd_r0 [res_drbd_r0] (promotable):
    * Masters: [ node2 ]
    * Slaves: [ node1 ]

Migration Summary:

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

DRBDのデータ確認

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

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

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

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

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

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

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

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

また障害から復旧したnode1で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同期は再開します。