web-dev-qa-db-ja.com

Linux-HA + dm-multipath:パスを削除すると、セグメンテーション違反、カーネルnullポインターの逆参照、およびSTONITHが発生します

さて私は実行中のLinux-HAクラスターをセットアップしています

*ペースメーカー-1.1.5

* openais-1.1.4

* multipath-tools-0.4.9

* OpenSuSE 11.4、カーネル2.6.37

クラスター構成はLinBitによるヘルスチェックに合格したので、私はかなり自信があります。

LSI SASアレイが2つのHBAを介して各ホストに接続されているため(ホストごとに合計4つのパス)、マルチパスが使用されています。ここで実行したいのは、削除してフェイルオーバー機能をテストすることです。マルチパス設定からのパス。

マルチパスパスは次のとおりです。

pgsql-data (360080e50001b658a000006874e398abe) dm-0 LSI,INF-01-00
size=6.0T features='0' hwhandler='1 rdac' wp=rw
|-+- policy='round-robin 0' prio=0 status=active
| |- 4:0:0:1 sda 8:0   active undef running
| `- 5:0:0:1 sde 8:64  active undef running
`-+- policy='round-robin 0' prio=0 status=enabled
|- 4:0:1:1 sdc 8:32  active undef running
`- 5:0:1:1 sdg 8:96  active undef running

パスの喪失をシミュレートするために、1を/ sys/block/{path}/device/stateにエコーします。これにより、次のように、パスがマルチパスに対して失敗/障害として表示されます。

pgsql-data (360080e50001b658a000006874e398abe) dm-0 LSI,INF-01-00
size=6.0T features='0' hwhandler='1 rdac' wp=rw
|-+- policy='round-robin 0' prio=0 status=active
| |- 4:0:1:1 sdc 8:32  failed faulty offline
| `- 5:0:1:1 sdg 8:96  active undef  running
`-+- policy='round-robin 0' prio=0 status=enabled
|- 4:0:0:1 sda 8:0   active undef  running
`- 5:0:0:1 sde 8:64  active undef  running

ただし、/ var/log/messagesを見ると、rdacチェッカーがパスがまだアップしていると言っていることに気付きます。

multipathd: pgsql-data: sdc - rdac checker reports path is up

また、マルチパス-l出力に戻りましょう-失敗したパスがまだアクティブグループにあることに注意してください。有効なグループに移動されている必要があり、有効からのアクティブ/実行パスがその場所(アクティブ)になっているはずです。

ここで、他のアクティブな有効パスsdgをダウンすると、rdacはパスがアップしていると報告するだけでなく、マルチパスリソースがクラスター内でFAILED状態になり、2つのアクティブ/有効パスのどちらも代わりになりません。その結果、セグメンテーション違反、NULLポイントを逆参照できないことに関するカーネルのバグ、およびクラスターがノードをSTONITHします。

db01-primary:/home/kendall/scripts # crm resource show
db01-secondary-stonith     (stonith:external/ipmi) Started 
db01-primary-stonith       (stonith:external/ipmi) Started 
Master/Slave Set: master_drbd [drbd_pg_xlog]
 Masters: [ db01-primary ]
 Slaves: [ db01-secondary ]
Resource Group: ha-pgsql
 multipathd (lsb:/etc/init.d/multipathd) Started  FAILED
 pgsql_mp_fs        (ocf::heartbeat:Filesystem) Started 
 pg_xlog_fs (ocf::heartbeat:Filesystem) Started 
 ha-DBIP-mgmt       (ocf::heartbeat:IPaddr2) Started 
 ha-DBIP    (ocf::heartbeat:IPaddr2) Started 
 postgresql (ocf::heartbeat:pgsql) Started 
 incron     (lsb:/etc/init.d/incron) Started 
 pgbouncer  (lsb:/etc/init.d/pgbouncer) Stopped 
pager-email    (ocf::heartbeat:MailTo) Stopped 

db01-primary:/home/kendall/scripts # multipath -l
pgsql-data (360080e50001b658a000006874e398abe) dm-0 LSI,INF-01-00
size=6.0T features='0' hwhandler='1 rdac' wp=rw
|-+- policy='round-robin 0' prio=0 status=enabled
| |- 4:0:1:1 sdc 8:32  failed faulty offline
| `- 5:0:1:1 sdg 8:96  failed faulty offline
`-+- policy='round-robin 0' prio=0 status=active
|- 4:0:0:1 sda 8:0   active undef  running
`- 5:0:0:1 sde 8:64  active undef  running

これは、カーネルのバグを示す/ var/log/messagesからの抜粋です。

Aug 17 15:30:40 db01-primary multipathd: 8:96: mark as failed
Aug 17 15:30:40 db01-primary multipathd: pgsql-data: remaining active paths: 2
Aug 17 15:30:40 db01-primary kernel: [ 1833.424180] sd 5:0:1:1: rejecting I/O to    offline device
Aug 17 15:30:40 db01-primary kernel: [ 1833.424281] device-mapper: multipath: Failing path 8:96.
Aug 17 15:30:40 db01-primary kernel: [ 1833.428389] sd 4:0:0:1: rdac: array , ctlr 1, queueing MODE_SELECT command
Aug 17 15:30:40 db01-primary multipathd: dm-0: add map (uevent)
Aug 17 15:30:41 db01-primary kernel: [ 1833.804418] sd 4:0:0:1: rdac: array , ctlr 1, MODE_SELECT completed
Aug 17 15:30:41 db01-primary kernel: [ 1833.804437] sd 5:0:0:1: rdac: array , ctlr 1, queueing MODE_SELECT command
Aug 17 15:30:41 db01-primary kernel: [ 1833.808127] sd 5:0:0:1: rdac: array , ctlr 1, MODE_SELECT completed
Aug 17 15:30:42 db01-primary multipathd: pgsql-data: sda - rdac checker reports path is up
Aug 17 15:30:42 db01-primary multipathd: 8:0: reinstated
Aug 17 15:30:42 db01-primary kernel: [ 1835.639635] device-mapper: multipath: adding disabled device 8:32
Aug 17 15:30:42 db01-primary kernel: [ 1835.639652] device-mapper: multipath: adding disabled device 8:96
Aug 17 15:30:42 db01-primary kernel: [ 1835.640666] BUG: unable to handle kernel NULL pointer dereference at           (null)
Aug 17 15:30:42 db01-primary kernel: [ 1835.640688] IP: [<ffffffffa01408a3>] dm_set_device_limits+0x23/0x140 [dm_mod]

スタックトレースもあります。これは http://Pastebin.com/gifMj7g で入手できます。

multipath.confは http://Pastebin.com/dw9pqF3Z で入手できます。

誰かがこれ、および/またはどのように進めるかについての洞察を持っていますか?

毎回これを再現できます。

1
Kendall

わかりました。/sys/block/{dev}/device/stateで「offline」を設定するだけでは、rdacにパスがダウンしていると報告させるのに十分ではなかったことがわかりました。昨夜、私はユニットでしばらく時間を過ごし、SASケーブルを引っ張って、システムの動作を監視しました。これは正常に機能します。アクティブパスが進まない場合は、「期待どおり」ではありません。有効なグループからは置き換えられませんが、これは別の問題です。フェイルオーバーも期待どおりに機能しました。最後のパスが失われると、クラスターはデータベースと関連リソースをシャットダウンし、それらをセカンダリノードに転送しました。

同様の状況に陥った場合は、multipath.confでマルチパスhwhandlerを「0」に設定してみてください。これは、デバイス{}セクションで設定する必要があります。これは基本的にパスチェックを無効にするため、デバイスがオフラインになると、実際にはオフラインになります。

0
Kendall