障害対応

PowerGres HA Pacemaker 版の運用中に発生しうる障害とその対応について説明します。

クラスタの障害

一部のコミュニケーションパスが切断された場合

一部のコミュニケーションパスが切断された場合には、Heartbeat のログファイルに以下のようなメッセージが出力されます。

Nov 19 00:51:00 alice heartbeat: [1918]: info: Link bob:eth1 dead.

また、crm_mon コマンドで表示されるクラスタの状態は、切断されたコミュニケーションパスの状態が dead と表示されます。 dead は通信できていない状態を表します。

# crm_mon -rfA
============
Last updated: Tue Nov 19 00:51:06 2013
Stack: Heartbeat
Current DC: bob (4b827ae1-e8f4-4ed4-aba8-6b0c948d297a) - partition with quorum
Version: 1.0.13-30bb726
2 Nodes configured, unknown expected votes
2 Resources configured.
============

Online: [ alice bob ]

Full list of resources:

 Master/Slave Set: powergres_drbd.drbd.ms_drbd
     Masters: [ alice ]
     Slaves: [ bob ]
 Resource Group: powergres.pgsql-drbd.group_pgsql
     powergres_drbd.drbd.filesystem     (ocf::heartbeat:Filesystem):    Started alice
     powergres_ipaddr.ipaddr    (ocf::heartbeat:IPaddr2):       Started alice
     powergres.pgsql-drbd.pgsql (ocf::heartbeat:pgsql): Started alice

Node Attributes:
* Node alice:
    + bob-eth0                          : up
    + bob-eth1                          : dead
    + bob-eth2                          : up
    + master-powergres_drbd.drbd.drbd:1 : 10000
* Node bob:
    + alice-eth0                        : up
    + alice-eth1                        : dead
    + alice-eth2                        : up
    + master-powergres_drbd.drbd.drbd:0 : 10000

Migration summary:
* Node alice:
* Node bob:

ほかに通信できているコミュニケーションパスが残っていれば、クラスタとしての動作に影響はありません。 ネットワークの障害を解消すればコミュニケーションパスは復旧します。

すべてのコミュニケーションパスが切断された場合

すべてのコミュニケーションパスが切断された場合には、DRBD リソースがプライマリロールとして動作しているノードでは、Heartbeat のログファイルに以下のようなメッセージが出力されます。

Nov 19 03:55:16 alice heartbeat: [45535]: WARN: node bob: is dead
Nov 19 03:55:16 alice heartbeat: [45535]: info: Link bob:eth0 dead.
Nov 19 03:55:16 alice heartbeat: [45535]: info: Link bob:eth1 dead.
Nov 19 03:55:16 alice heartbeat: [45535]: info: Link bob:eth2 dead.

すべてのコミュニケーションパスが切断され、相手のノードとの通信ができない状態になります。

また、crm_mon コマンドで表示されるクラスタの状態は、コミュニケーションパスの状態が表示されなくなり、「OFFLINE:」の後に相手のノードが表示されるようになります。

# crm_mon -rfA
============
Last updated: Tue Nov 19 03:55:35 2013
Stack: Heartbeat
Current DC: alice (dbf44f6c-f753-48f9-9f15-a786a116c142) - partition with quorum
Version: 1.0.13-30bb726
2 Nodes configured, unknown expected votes
2 Resources configured.
============

Online: [ alice ]
OFFLINE: [ bob ]

Full list of resources:

 Master/Slave Set: powergres_drbd.drbd.ms_drbd
     Masters: [ alice ]
     Stopped: [ powergres_drbd.drbd.drbd:1 ]
 Resource Group: powergres.pgsql-drbd.group_pgsql
     powergres_drbd.drbd.filesystem     (ocf::heartbeat:Filesystem):    Started alice
     powergres_ipaddr.ipaddr    (ocf::heartbeat:IPaddr2):       Started alice
     powergres.pgsql-drbd.pgsql (ocf::heartbeat:pgsql): Started alice

Node Attributes:
* Node alice:
    + master-powergres_drbd.drbd.drbd:0 : 10000

Migration summary:
* Node alice:

DRBD リソースがセカンダリロールとして動作しているノードでも、すべてのコミュニケーションパスが切断され、相手のノードとの通信ができない状態になります。

STONITH サービスを作成している場合には、すべてのコミュニケーションパスの切断が検知されると、スプリットブレインを回避するために相手のノードの再起動が試みられます。 STONITH サービスを作成していない場合には、両方のノードでサービスが起動され、スプリットブレインが発生してしまいます。

スプリットブレインが発生した場合には、ネットワークの障害を解消してコミュニケーションパスが通信できる状態になると、両方の DRBD リソースがプライマリロールとして動作しないように、片方の DRBD リソースのディスクの状態が無効に切り替わります。

drbd-overview コマンドで表示される DRBD リソースの状態は、DRBD リソースがプライマリロールとして動作しているノードでは、接続の状態が StandAlone、相手の DRBD リソースのロールが Unknown、ディスクの状態が Outdated と表示されます。 StandAlone は切断されている状態、Unknown はロールが不明、Outdated はデータが一致しているが、無効になっている状態を表します。

# drbd-overview
  0:powergres_drbd/0  StandAlone Primary/Unknown UpToDate/Outdated r----- /mnt/disk ext4 1004M 200M 753M 21%

データを再同期して DRBD リソースを復旧します。 ノード間のデータが異なっている場合には同期先のデータの変更は消失します。 データの再同期は pwg_clumgr コマンドの resync-service モードで行います。 コマンドは root ユーザで実行します。

# pwg_clumgr resync-service powergres alice
Enter passphrase for /root/.ssh/id_rsa-pwg_clumgr: (パスフレーズを入力)

1 つ目の引数にはサービスの作成時に指定したサービス名、2 つ目の引数には同期先のノード名を指定します。 同期先のノードには、DRBD リソースのディスクの状態が Outdated になっているノードを指定します。

データの再同期が完了すると、drbd-overview コマンドで表示される DRBD リソースの状態は、接続の状態が Connected、相手の DRBD リソースのロールが Secondary、ディスクの状態が UpToDate に切り替わります。 Connected は接続されている状態、Secondary はセカンダリロール、UpToDate はデータが一致している状態を表します。 これで DRBD リソースは復旧します。

# drbd-overview
  0:powergres_drbd/0  Connected Primary/Secondary UpToDate/UpToDate C r----- /mnt/disk ext4 1004M 200M 753M 21%

リソースの障害回数が残っている場合には消去します。 障害回数の消去については サービスの障害履歴の削除 を参照してください。

サービスの障害

サービスの障害が検知された場合

PowerGres サービスは、PowerGres、DRBD、DRBD でレプリケーションを行うファイルシステム、仮想 IP アドレスの 4 つのリソースで構成されます。

リソースの障害が検知された場合には、リソースごとに障害回数が増えていきます。 障害回数が閾値に達していない場合には同じノードで、閾値に達した場合にはほかのノードに切り替えてリソースの起動が試みられます。 障害回数の閾値は 2 回になっています。

リソースの障害回数は crm_mon コマンドで確認します。 コマンドは root ユーザで実行します。

# crm_mon -rfA
============
Last updated: Tue Nov 19 06:57:16 2013
Stack: Heartbeat
Current DC: alice (dbf44f6c-f753-48f9-9f15-a786a116c142) - partition with quorum
Version: 1.0.13-30bb726
2 Nodes configured, unknown expected votes
2 Resources configured.
============

Online: [ alice bob ]

Full list of resources:

 Master/Slave Set: powergres_drbd.drbd.ms_drbd
     Masters: [ alice ]
     Slaves: [ bob ]
 Resource Group: powergres.pgsql-drbd.group_pgsql
     powergres_drbd.drbd.filesystem     (ocf::heartbeat:Filesystem):    Started alice
     powergres_ipaddr.ipaddr    (ocf::heartbeat:IPaddr2):       Started alice
     powergres.pgsql-drbd.pgsql (ocf::heartbeat:pgsql): Started alice

Node Attributes:
* Node alice:
    + bob-eth0                          : up
    + bob-eth1                          : up
    + bob-eth2                          : up
    + master-powergres_drbd.drbd.drbd:0 : 10000
* Node bob:
    + alice-eth0                        : up
    + alice-eth1                        : up
    + alice-eth2                        : up
    + master-powergres_drbd.drbd.drbd:1 : 10000

Migration summary:
* Node alice:
   powergres_ipaddr.ipaddr: migration-threshold=2 fail-count=1 last-failure='Tue Nov 19 06:36:19 2013'
* Node bob:

Migration summary:」の下にリソースの障害回数がノードごとに表示されます。 障害が検知されていない場合には表示されません。 リソース名の後には「migration-threshold=」の後にリソースをほかのノードに切り替えて起動するかの閾値になる障害回数、「fail-count=」の後に障害の検知された回数、「last-failure=」の後に最後に障害の検知された日時が表示されます。 crm_mon コマンドについては クラスタの状態の確認 を参照してください。

リソースの障害回数は障害を解消した後に手動で消去します。 障害回数の消去については サービスの障害履歴の削除 を参照してください。

DRBD の障害

レプリケーションパスが切断された場合

レプリケーションパスが切断された場合には、DRBD リソースがプライマリロールとして動作しているノードでは、DRBD のログファイルに以下のようなメッセージが出力されます。

Nov 18 10:14:47 alice kernel: d-con powergres_drbd: PingAck did not arrive in time.
Nov 18 10:14:47 alice kernel: d-con powergres_drbd: peer( Secondary -> Unknown ) conn( Connected -> NetworkFailure ) pdsk( UpToDate -> DUnknown )
Nov 18 10:14:47 alice kernel: block drbd0: new current UUID 500A8AABBF5C5B93:D8FA218EDAD74BF5:0D536F282A456D8F:0D526F282A456D8F
Nov 18 10:14:47 alice kernel: d-con powergres_drbd: asender terminated
Nov 18 10:14:47 alice kernel: d-con powergres_drbd: Terminating drbd_a_powergre
Nov 18 10:14:47 alice kernel: d-con powergres_drbd: Connection closed
Nov 18 10:14:47 alice kernel: d-con powergres_drbd: conn( NetworkFailure -> Unconnected )
Nov 18 10:14:47 alice kernel: d-con powergres_drbd: receiver terminated
Nov 18 10:14:47 alice kernel: d-con powergres_drbd: Restarting receiver thread
Nov 18 10:14:47 alice kernel: d-con powergres_drbd: receiver (re)started
Nov 18 10:14:47 alice kernel: d-con powergres_drbd: conn( Unconnected -> WFConnection )
Nov 18 10:14:47 alice kernel: d-con powergres_drbd: helper command: /sbin/drbdadm fence-peer powergres_drbd

相手の DRBD リソースのロールが Secondary から Unknown に、接続の状態が Connected から NetworkFailureUnconnected を通じて WFConnection に、ディスクの状態が UpToDate から DUnknown に切り替わります。 Unknown はロールが不明、WFConnection は接続されるまで待機している状態、DUnknow は接続できずにディスクの状態が不明なことを表します。

Nov 18 10:14:48 alice kernel: d-con powergres_drbd: helper command: /sbin/drbdadm fence-peer powergres_drbd exit code 4 (0x400)
Nov 18 10:14:48 alice kernel: d-con powergres_drbd: fence-peer helper returned 4 (peer was fenced)
Nov 18 10:14:48 alice kernel: d-con powergres_drbd: pdsk( DUnknown -> Outdated )

コミュニケーションパスが通信できている場合には、両方の DRBD リソースがプライマリロールとして動作しないようにセカンダリロールとして動作している DRBD リソースのディスクの状態が Outdated に切り替わります。

また、drbd-overview コマンドで表示される DRBD リソースの状態は、DRBD リソースがプライマリロールとして動作しているノードでは、接続の状態が WFConnection、相手の DRBD リソースのロールが Unknown、ディスクの状態が Outdated と表示されます。 Outdated はデータが一致しているが、無効になっている状態を表します。

# drbd-overview
  0:powergres_drbd/0  WFConnection Primary/Unknown UpToDate/Outdated C r----- /mnt/disk ext4 1004M 164M 789M 18%

ネットワークの障害を解消してレプリケーションパスが通信できる状態になったら、データを再同期して DRBD リソースを復旧します。 データの再同期は pwg_clumgr コマンドの resync-service モードで行います。 コマンドは root ユーザで実行します。

# pwg_clumgr resync-service powergres bob
Enter passphrase for /root/.ssh/id_rsa-pwg_clumgr: (パスフレーズを入力)

1 つ目の引数にはサービスの作成時に指定したサービス名、2 つ目の引数には同期先のノード名を指定します。 同期先のノードには、DRBD リソースのディスクの状態が Outdated になっているノードを指定します。

データの再同期が完了すると、drbd-overview コマンドで表示される DRBD リソースの状態は、接続の状態が Connected、相手の DRBD リソースのロールが Secondary、ディスクの状態が UpToDate に切り替わります。 Connected は接続されている状態、Secondary はセカンダリロール、UpToDate はデータが一致している状態を表します。 これで DRBD リソースは復旧します。

# drbd-overview
  0:powergres_drbd/0  Connected Primary/Secondary UpToDate/UpToDate C r----- /mnt/disk ext4 1004M 164M 789M 18%

ディスクに障害が発生した場合

プライマリロールとして動作している DRBD リソースのディスクに障害が発生した場合には、DRBD のログファイルに以下のようなメッセージが出力されます。

Nov 18 22:05:44 alice kernel: block drbd0: local WRITE IO error sector 896+8 on sdb1
Nov 18 22:05:44 alice kernel: block drbd0: disk( UpToDate -> Failed )
Nov 18 22:05:44 alice kernel: block drbd0: Local IO failed in __req_mod. Detaching...
Nov 18 22:05:44 alice kernel: block drbd0: bitmap WRITE of 0 pages took 0 jiffies
Nov 18 22:05:44 alice kernel: block drbd0: 0 KB (0 bits) marked out-of-sync by on disk bit-map.
Nov 18 22:05:44 alice kernel: block drbd0: disk( Failed -> Diskless )
Nov 18 22:05:44 alice kernel: block drbd0: receiver updated UUIDs to effective data uuid: 6D2710ABFEFC5CF0
Nov 18 22:05:44 alice kernel: block drbd0: Should have called drbd_al_complete_io(, 896, 4096), but my Disk seems to have failed :(

DRBD リソースのディスクの状態が UpToDate から Failed を通じて Diskless に切り替わります。 Diskless はディスクレスモードと呼ばれるディスクが切り離された状態を表します。 ディスクレスモードではデータの読み取り、書き込みは相手の DRBD リソースのディスクに対して行われます。 ディスクレスモードへの切り替わりは基本的に障害として検知されません。

また、drbd-overview コマンドで表示される DRBD リソースの状態は、障害が発生したディスクの状態が Diskless と表示されます。

# drbd-overview
  0:powergres_drbd/0  Connected Primary/Secondary Diskless/UpToDate C r----- /mnt/disk ext4 1004M 200M 753M 21%

障害の発生したディスクと同じブロックデバイス名でディスクを交換したら、データを再同期して DRBD リソースを復旧します。 データの再同期は以下の手順で行います。 操作は root ユーザで行います。

  1. dd コマンドでファイルシステムの最初をゼロ埋めします。

    # dd if=/dev/zero of=/dev/sdb1 bs=1M count=1
    1+0 records in
    1+0 records out
    1048576 bytes (1.0 MB) copied, 0.014231 s, 73.7 MB/s
    

    オプション of= にはディスクのブロックデバイス名を指定します。

  2. sync コマンドでディスクを同期します。

    # sync
    
  3. drbdadm コマンドの create-md モードで DRBD のメタデータを作成します。

    # drbdadm create-md powergres_drbd
    Writing meta data...
    initializing activity log
    NOT initializing bitmap
    New drbd meta data block successfully created.
    success
    

    引数には DRBD リソース名を指定します。 PowerGres HA Pacemaker 版では DRBD リソース名はサービス名の最後に _drbd をつけたものです。

  4. drbdadm コマンドの attach モードでデータの再同期を開始します。

    # drbdadm attach powergres_drbd
    

    引数には DRBD リソース名を指定します。 PowerGres HA Pacemaker 版では DRBD リソース名はサービス名の最後に _drbd をつけたものです。

    データの再同期はディスク容量に応じて時間がかかります。 データの再同期がどこまで進んでいるかを drbd-overview コマンドで確認できます。

    # drbd-overview
      0:powergres_drbd/0  SyncTarget Primary/Secondary Inconsistent/UpToDate C r----- /mnt/disk ext4 1004M 200M 753M 21%
            [=========>..........] sync'ed: 53.0% (494236/1044124)K
    
  5. データの再同期が完了します。

    データの再同期が完了すると、drbd-overview コマンドで表示される DRBD リソースの状態は、ディスクの状態が UpTpDate に切り替わります。 これで DRBD リソースは復旧します。

    # drbd-overview
      0:powergres_drbd/0  Connected Primary/Secondary UpToDate/UpToDate C r----- /mnt/disk ext4 1004M 200M 753M 21%