หลังจากที่เราคอนฟิก 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>ข้อมูลอ้างอิง