ทดสอบแก้ไขดิสก์ที่มีปัญหาใน Software-RAID บนลินุกซ์

หลังจากที่เราคอนฟิก Software RAID จากบทความที่ผ่านมาแล้ว ในบทความนี้จะกล่าวถึงวิธีการทดสอบในกรณีที่ดิสก์มีปัญหา วิธีการแก้ไข การป้องกันโดยเพิ่มดิสก์เพื่อทำหน้าที่เป็น spare

สถานการณ์ปกติหลังจากคอนฟิก RAID-5
เริ่มต้นจะเราจะสร้าง RAID-5 ที่ประกอบด้วยดิสก์จำนวน 3 partition ซึ่งประกอบด้วย /dev/sdb1, /dev/sdc1, /dev/sdd1

ตัวอย่างการสร้าง RAID-5

[root@test-raid ~]# mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 64K
mdadm: size set to 987840K
mdadm: array /dev/md0 started.

ให้รอจนกว่าการสถานะการ build ข้อมูลของ RAID-5 ครบ 100% แล้วสร้าง filesystem เพื่อ mount เข้ากับ /export

[root@test-raid ~]#  cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[2] sdc1[1] sdb1[0]
      1975680 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

[root@test-raid ~]# mkfs.ext3 /dev/md0
[root@test-raid ~]# mount /dev/md0 /export

เมื่อดิสก์มีปัญหา (fail)
เราสามารถใช้คำสั่ง mdadm –fail เพื่อใช้ในการจำลองสถานการณ์ว่าดิสก์มีปัญหา เพื่อดูผลกระทบที่เกิดขึ้น โดยไม่จำเป็นต้องไปดึงดิสก์ออกจริงๆ ซึ่งเสี่ยงต่ออุปกรณ์เสียหาย

ตัวอย่างการใช้คำสั่ง mdadm –fail เพื่อจำลองว่าดิสก์ /dev/sdc มีปัญหา

[root@test-raid ~]# mdadm /dev/md0 --fail /dev/sdc1
mdadm: set /dev/sdc1 faulty in /dev/md0

ตรวจสอบสถานะ RAID-5 เมื่อดิสก์มีปัญหา

[root@test-raid ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[2] sdc1[3](F) sdb1[0]
      1975680 blocks level 5, 64k chunk, algorithm 2 [3/2] [U_U]

unused devices: <none>

จากไฟล์ /proc/mdstat จะเห็นการเปลี่ยนแปลงคือ สถานะในวงเล็บหลัง sdc1 เปลี่ยนเป็นตัวอักษร F ซึ่งหมายถึงดิสก์นี้มีปัญหา (fail)

เนื่องจากเป็น RAID-5 ทำให้ /dev/md0 ยังสามารถใช้งานได้อยู่ในกรณีที่ดิสก์มีปัญหาก้อนเดียว โดยข้อมูลไม่เสียหาย ซึ่งสามารถตรวจสอบได้ ในที่เรา mount ไว้ ซึ่งยังสามารถเขียน/อ่าน ข้อมูลต่างๆ ได้ตามปกติ

การคอนฟิกดิสก์ที่มีปัญหาออกจาก RAID
เมื่อดิสก์ที่มีปัญหาไม่ว่าจากการคอนฟิกโดยใช้คำสั่ง mdadm หรือเสียจริงๆ ที่อุปกรณ์เลย การแก้ไขในเบื้องต้น ต้องเอาคอนฟิกของดิสก์นั้นออกจาก RAID

ตัวอย่างการใช้คำสั่ง mdadm –remove เพื่อเอาคอนฟิกของดิสก์ที่มีปัญหาออก

[root@test-raid ~]# mdadm /dev/md0 --remove /dev/sdc1
mdadm: hot removed /dev/sdc1

ตรวจสอบสถานะของ RAID หลังจากที่เอาคอนฟิกดิสก์ที่มีปัญหาออก

[root@test-raid ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[2] sdb1[0]
      1975680 blocks level 5, 64k chunk, algorithm 2 [3/2] [U_U]

unused devices: <none>

จากผลลัพธ์ ดิสก์ที่มีปัญหา (sdc) จะหายไป ถ้าเสียที่อุปกรณ์จริงๆ ก็ต้องดึงดิสก์ออกจากเครื่อง เพื่อเปลี่ยนตัวใหม่เข้ามาแทน

การเปลี่ยนดิสก์ก้อนใหม่เข้าไปใน RAID
เมื่อได้ดิสก์ก้อนใหม่ที่ใช้งานได้แล้ว ต้องคอนฟิกเพื่อเพิ่มดิสก์ก้อนนี้เข้าไปใน RAID

ตัวอย่างการใช้คำสั่ง mdadm –add เพื่อเพิ่มดิสก์ก้อนใหม่เข้าไปใน RAID

[root@test-raid ~]# mdadm /dev/md0 --add /dev/sdc1
mdadm: re-added /dev/sdc1

เมื่อเพิ่มดิสก์เข้าไปใหม่ จะมีการ re-build ข้อมูลใน RAID-5 ใหม่อีกครั้ง เพื่อทำให้คอนฟิกกลับมาเป็นปกติ

ตัวอย่างสถานะของ RAID-5 ในขณะที่มีการ re-build ข้อมูลใหม่

[root@test-raid ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sdc1[3] sdd1[2] sdb1[0]
      1975680 blocks level 5, 64k chunk, algorithm 2 [3/2] [U_U]
      [==>..................]  recovery = 12.2% (121296/987840) finish=1.7min speed=8086K/sec

unused devices: <none>

ตัวอย่างสถานะของ RAID-5 เมื่อการ re-build เสร็จสิ้น

[root@test-raid ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sdc1[1] sdd1[2] sdb1[0]
      1975680 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

จากที่ดิสก์มีปัญหาหนึ่งก้อน ดึงดิสก์ก้อนที่มีปัญหาออก เปลี่ยนดิสก์ใหม่ที่ใช้ได้ลงไป จนถึง re-build ข้อมูลใน RAID-5 ใหม่ ผู้ใช้งานทั่วไป (users) ยังสามารถที่จะเขียน/อ่าน ข้อมูลได้ตลอดเวลา โดยอาจมีผลกระทบบ้างเช่นความเร็วจะลดลง

การเพิ่มดิสก์เพื่อทำหน้าที่เป็น Spare

ถึงแม้ RAID-5 จะรองรับปัญหาในกรณีที่ดิสก์เสียได้ก้อนนึง แต่ข้อควรระวังอย่างหนึ่งคือ ในช่วงที่รออุปกรณ์ใหม่มาทดแทนเพื่อเปลี่ยน จะมีดิสก์ที่เสียอีกไม่ได้แล้ว ซึ่งถ้าเสียอีกหนึ่งก้อน ข้อมูลทั้งหมดจะเสียหายไปเลย

วิธีการหนึ่งที่ช่วยแก้ไขปัญหานี้ได้คือคอนฟิกดิสก์เปล่าๆ ก้อนหนึ่งเพื่อทำหน้าที่เป็น spare โดยดิสก์ที่เป็น spare นี้ในสถานการณ์ปกติจะไม่ถูกนำมาใช้งาน แต่จะถูกใช้โดยอัตโนมัติในกรณีที่ดิสก์ที่คอนฟิกอยู่ใน RAID-5 มีปัญหาเท่านั้น

ตัวอย่างการเพิ่ม /dev/sde เพื่อทำหน้าที่เป็น spare

[root@test-raid ~]# mdadm /dev/md0 --add /dev/sde1
mdadm: added /dev/sde1

สถานะของ RAID เมื่อมีการเพิ่มดิสก์เพื่อทำหน้าที่เป็น spare

[root@test-raid ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sde1[3](S) sdc1[1] sdd1[2] sdb1[0]
      1975680 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

จากผลลัพธ์สถานะของดิสก์ที่ทำหน้าที่เป็น spare จะมีตัวอักษร S อยู่ในวงเล็บ

ทดสอบการทำงานของ spare เมื่อดิสก์ใน RAID มีปัญหา
เราสามารถทดสอบการทำงานของ spare ได้ โดยจำลองว่าดิสก์ที่อยู่ใน RAID ก้อนหนึ่งมีปัญหา เช่นสมมติว่า sdd เสียหายไป

[root@test-raid ~]# mdadm /dev/md0 --fail /dev/sdd1
mdadm: set /dev/sdd1 faulty in /dev/md0

ตรวจสอบสถานะของ RAID ในกรณีที่มีดิสก์ spare

[root@test-raid ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sde1[3] sdc1[1] sdd1[4](F) sdb1[0]
      1975680 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
      [====>................]  recovery = 21.3% (211584/987840) finish=1.5min speed=8463K/sec

unused devices: <none>

จากผลลัพธ์จะเห็นว่าดิสก์ spare จะถูกนำมาอยู่ใน RAID โดยอัตโนมัติเลย โดยเปลี่ยนตัวอักษรจาก (S) เป็น (3) และเมื่อถูก re-build เรียบร้อยจะเปลี่ยนเป็น (2)

ตัวอย่างสถานะของ RAID-5 เมื่อดิสก์ spare ถูกนำมารวมเรียบร้อย

[root@test-raid ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sde1[2] sdc1[1] sdd1[3](F) sdb1[0]
      1975680 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

การเปลี่ยนดิสก์ที่มีปัญหาในกรณีที่มี spare
จากตัวอย่างที่แล้ว เราทำให้ /dev/sdd มีปัญหา การแก้ไขก็ต้องเอาคอนฟิกออกไป แล้วเพิ่มกลับเข้าไปใหม่

แต่ให้สังเกตว่า ในกรณีที่มีดิสก์ spare อยู่แล้ว เมื่อเปลี่ยนดิสก์อันใหม่ลงไปแทนที่ดิสก์ที่มีปัญหา ดิสก์ก้อนนี้จะถูกตั้งให้เป็น spare แทน จะไม่มีการ re-build เพื่อรวมดิสก์ที่เพิ่งเปลี่ยนเข้าไปใหม่

[root@test-raid ~]# mdadm /dev/md0 --remove /dev/sdd1
mdadm: hot removed /dev/sdd1

[root@test-raid ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sde1[2] sdc1[1] sdb1[0]
      1975680 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

[root@test-raid ~]# mdadm /dev/md0 --add /dev/sdd1
mdadm: added /dev/sdd1

[root@test-raid ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[3](S) sde1[2] sdc1[1] sdb1[0]
      1975680 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

การคอนฟิกดิสก์ spare ตอนเริ่มต้นสร้าง RAID-5
ถ้าต้องการคอนฟิกดิสก์ spare ตั้งแต่เริ่มต้นสร้าง RAID สามารถทำได้ โดยเพิ่ม option ลงไปดังนี้

ตัวอย่างการสร้าง RAID-5 พร้อมดิสก์ spare
[root@test-raid ~]# mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1 --spare-devices=1  /dev/sde1
[root@test-raid ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[4] sde1[3](S) sdc1[1] sdb1[0]
      1975680 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
      [>....................]  recovery =  2.4% (24836/987840) finish=1.2min speed=12418K/sec

unused devices: <none>

ข้อมูลอ้างอิง

Leave a Reply

Your email address will not be published.