DRBD障害復旧 I/Oエラー障害の対応

ファイルの大量書き込み中に下記ようなI/Oエラーが発生し、その際の復旧させた際の手順を記述します。
試行錯誤の上、復旧させたので不要な手順が含まれています。
Nov 21 22:39:53 server01 kernel: attempt to access beyond end of device
Nov 21 22:39:53 server01 kernel: drbd0: rw=1, want=4095992, limit=4095800
Nov 21 22:39:53 server01 kernel: Buffer I/O error on device drbd0, logical block 511998
Nov 21 22:39:54 server01 kernel: drbd0: rw=1, want=4095952, limit=4095800
Nov 21 22:39:54 server01 kernel: attempt to access beyond end of device
Nov 21 22:39:58 server01 crmd[3635]: notice: do_state_transition: State transition S_IDLE -> S_POLICY_ENGINE [ input=I_PE_CALC cause=C_TIMER_POPPED origin=crm_timer_popped ]
Nov 21 22:39:58 server01 pengine[3634]: notice: unpack_config: On loss of CCM Quorum: Ignore
Nov 21 22:39:58 server01 crmd[3635]: notice: run_graph: Transition 117 (Complete=0, Pending=0, Fired=0, Skipped=0, Incomplete=0, Source=unknown): Complete
Nov 21 22:39:58 server01 crmd[3635]: notice: do_state_transition: State transition S_TRANSITION_ENGINE -> S_IDLE [ input=I_TE_SUCCESS cause=C_FSA_INTERNAL origin=notify_crmd ]
Nov 21 22:39:58 server01 pengine[3634]: notice: process_pe_message: Calculated Transition 117: (null)
Nov 21 22:40:06 server01 kernel: GFS2: fsid=my-cluster:imgfs.1: fatal: I/O error
Nov 21 22:40:06 server01 kernel: GFS2: fsid=my-cluster:imgfs.1: block = 511998
Nov 21 22:40:06 server01 kernel: GFS2: fsid=my-cluster:imgfs.1: function = gfs2_ail1_empty_one, file = fs/gfs2/log.c, line = 199
Nov 21 22:40:06 server01 kernel: GFS2: fsid=my-cluster:imgfs.1: about to withdraw this file system
Nov 21 22:40:06 server01 kernel: GFS2: fsid=my-cluster:imgfs.1: telling LM to unmount
Nov 21 22:40:06 server01 kernel: GFS2: fsid=my-cluster:imgfs.1: withdrawn
Nov 21 22:40:06 server01 kernel: Pid: 21554, comm: scp Not tainted 2.6.32-358.el6.x86_64 #1
Nov 21 22:40:06 server01 kernel: Call Trace:
マウントができない状態が発生。

両ノード再起動するが、フェンシングが走り、お互いに再起動を繰り返す現象が発生し、状況がよくならず。
片系Pacemakerの自動起動を停止しさせたことで、再起動を繰り返し現象は収まった。
その後、対象DRBDデバイスをFSCKを実行したいが、デバイスがBusy状態であると怒られるので、調べたところ GFS2が起動途中であったため、デバイスを中途半端につかんでしまっていた。
GFS2を強制的にKillするとFSCKができ、修復することができた。 しかし、DRBDが起動するが下記のようにDiskless状態となり、再マウントができない状態になっていた。
# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@img-server02, 2013-09-19 11:31:32
0: cs:WFConnection ro:Secondary/Unknown ds:Diskless/DUnknown C r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

DRBDデバイスがDiskless状態であるため、attachを試みるがエラーとなる。
# drbdadm attach r0
open(/dev/vg00_drbd00/lvol0) failed: No such file or directory
Command 'drbdmeta 0 v08 /dev/vg00_drbd00/lvol0 internal apply-al' terminated with exit code 20

lvdisplayで論理ボリュームの状態を確認したところ、「NOT available」状態であった。
# lvdisplay
--- Logical volume ---
LV Path /dev/vg00_drbd00/lvol0
LV Name lvol0
VG Name vg00_drbd00
LV UUID t4ZAsj-PSU4-br5z-WMnp-TlIa-d0Ey-KDK6so
LV Write Access read/write
LV Creation host, time img-server02, 2013-09-19 20:27:51 +0900
LV Status NOT available
LV Size 1.95 GiB
Current LE 500
Segments 1
Allocation inherit
Read ahead sectors auto
--- Logical volume ---
LV Path /dev/vg_imgserver01/lv_root
LV Name lv_root
VG Name vg_imgserver01
LV UUID WlKq2j-D8MA-U5lq-L7ub-E0ml-f5kv-7ppuD0
LV Write Access read/write
LV Creation host, time server01, 2013-08-26 18:22:42 +0900
LV Status available
# open 1
LV Size 25.57 GiB
Current LE 6546
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
--- Logical volume ---
LV Path /dev/vg_imgserver01/lv_swap
LV Name lv_swap
VG Name vg_imgserver01
LV UUID J0pej8-zNpT-0vtj-eq8w-Fbhs-mqXX-wFZAdY
LV Write Access read/write
LV Creation host, time server01, 2013-08-26 18:22:50 +0900
LV Status available
# open 1
LV Size 3.94 GiB
Current LE 1008
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1

論理ボリュームを有効化してみる。
# lvchange --available y /dev/vg00_drbd00/lvol0
Error locking on node server01-rep: Volume group for uuid not found: coQY8CAx8b3QvQNfms8C1HhrHFnzlUc8t4ZAsjPSU4br5zWMnpTlIad0EyKDK6so

関係ないと思うが片系のDRBDが停止していたので、DRBDを起動させる。
# /etc/init.d/drbd start
cat /proc/drbd

再度、論理ボリュームの有効化を試みたところなぜか有効ができた。
# lvchange --available y /dev/vg00_drbd00/lvol0
# lvdisplay
--- Logical volume ---
LV Path /dev/vg00_drbd00/lvol0
LV Name lvol0
VG Name vg00_drbd00
LV UUID t4ZAsj-PSU4-br5z-WMnp-TlIa-d0Ey-KDK6so
LV Write Access read/write
LV Creation host, time img-server02, 2013-09-19 20:27:51 +0900
LV Status available
# open 0
LV Size 1.95 GiB
Current LE 500
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:2
省略

再度DRBDデバイスのattachを試みる。
# drbdadm attach r0
drbdadm attach r0
Marked additional 80 MB as out-of-sync based on AL.
DRBDがUpToDate状態になっていることを確認する。
# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@img-server02, 2013-09-19 11:31:32
0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1240988
DRBDの状態がUpToDateになったので、Primary化する。
# drbdadm primary r0
# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@img-server02, 2013-09-19 11:31:32
0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r-----
ns:0 nr:0 dw:0 dr:680 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1240988

Primaryとなったが、gfs2を起動するが、GFS2の起動に失敗する。。
# /etc/init.d/gfs2 start
Mounting GFS2 filesystem (/data): error mounting /dev/drbd0 on /data: No such file or directory
[失敗]

原因は、cman,clvmdが起動していなかったためと考え、cman,clvmdを含めPacemakerを起動させる。
 # /etc/inti.d/pacemaker start
※Pacemaker起動時にcman,clvmdが起動するようにしている。
しかし、両ノードのPacemakerを起動するが、GFS2が起動できない。
GFS2を起動する際に下記のログがmessagesにはかれていた。
GFS2 (built Feb 22 2013 00:33:41) installed
  GFS2: can't find protocol fsck_dlm

fsck_dlmについて調べたらhttp://www.redhat.com/archives/linux-cluster/2010-August/msg00004.html を見つけ、下記のコマンドを実行したらマウントができるようになった。
 
# gfs2_tool sb /dev/mapper/vg00_drbd00-lvol0 proto lock_dlm
You shouldn't change any of these values if the filesystem is mounted.
Are you sure? [y/n] y
current lock protocol name = "fsck_dlm"
new lock protocol name = "lock_dlm"
Done
※両ノードで実行する必要がある?


Google+