ปกติเวลาทำ RAID บน server เราจะคาดหวังว่าข้อมูลมันจะปลอดภัยเป็นอันดับแรก โดยหลักการคือเราเชื่อว่าฮาร์ดดิสก์มันจะเสียไม่พร้อมกันหรอก พอเสียก็รีบเปลี่ยนตัวใหม่มาแทนทันที มันก็ควรจะอยู่ไปได้เรื่อยๆ นั่นคือเราคาดว่าฮาร์ดดิสก์มันควรจะเสียทีละตัว มีโอกาสน้อยมากที่มันจะเสียพร้อมๆ กัน
แต่ก็ไม่ใช่ว่าจะเป็นไปไม่ได้ เร็วๆ นี้ผมเจอเคสหนึ่ง เซิร์ฟเวอร์ที่เคยไปติดตั้งให้ลูกค้าเมื่อ 2 ปีกว่ามาแล้ว ส่งเมลมาแจ้งว่ามีดิสก์ตัวหนึ่งของ RAID เสีย (อันนี้เป็นข้อดีประการสำคัญของ Linux MD RAID ที่มันมีตัว monitor ที่จะส่งเมลบอกเราได้เมื่อพบดิสก์เสีย) ผมก็รีบแจ้งลูกค้าให้เตรียมฮาร์ดดิสก์ไปเปลี่ยน แล้วก็นัดกันเข้าไปเปลี่ยนที่ NOC แห่งหนึ่ง
เริ่มจาก ตรวจสอบดูสถานะของ RAID โดยสั่ง
# cat /proc/mdstat
ถ้าระบบ RAID มันปกติ จะพบสถานะแสดงเป็น [UU] อันนี้เป็นกรณี RAID1 ถ้ามีตัวหนึ่งเสีย จะเป็น [U_] และหลังชื่อ device ที่เสีย จะมี (F) บอกไว้
ในที่นี้ระบบดังกล่าวผมทำ RAID1 ไว้ 5 ชุด บนดิสก์ 4 ตัว ชุดหนึ่งเป็น RAID1 ที่สร้างจาก partition เล็กๆ 4 partition จากแต่ละดิสก์ เพื่อใช้เป็น /boot และติดตั้ง bootloader ไว้บนทุกดิสก์ นั่นคือระบบนี้จะต้องบูตได้จากดิสก์ทุกตัว แล้วรวมชุดที่เหลืออีกทีเป็น RAID0 2 ชุด สำหรับเก็บข้อมูล
ในที่นี้ดิสก์ตัวที่เสียคือ sda จึงสั่ง remove ตัวที่เสียออก
# mdadm /dev/md0 --remove /dev/sda1
mdadm: hot removed /dev/sda1
# mdadm /dev/md1 --remove /dev/sda3
mdadm: hot removed /dev/sda3
บางทีมันพบจุดเสียเฉพาะในบางพาร์ทิชัน แต่เราต้องเปลี่ยนด้วยกัน ก็ให้สั่ง fail มันก่อนแล้วค่อย remove
# mdadm /dev/md1 --fail /dev/sda3 --remove /dev/sda3
mdadm: hot removed /dev/sda3
เครื่องนี้มี hot swap bay ซึ่งมีหลอดแสดงสถานะการทำงานของดิสก์แต่ละตัวแยกกัน แต่เนื่องจากไม่ได้ใช้ hardware RAID จึงไม่มีไฟบอกสถานะว่าดิสก์ตัวไหนเสีย จึงเล่นมุกง่ายๆ โดยลองสั่งให้ดิสก์ตัวที่เสียมันทำงาน โดยสั่ง
# dd if=/dev/sda of=/dev/null bs=1G count=1
ไฟหลอดไหนกระพริบก็แสดงว่าคือตัวนั้น จึงถอดออกและใส่ตัวใหม่แทน แต่พบว่าปัญหาคือ hotswap มันทำงานผิดปกติหรือเปล่าไม่ทราบ ตัวใหม่จึงเห็นเป็น sde ซึ่งเป็นไปได้มากกว่าพอบูตใหม่ มันจะกลับมาแสดงเป็น sda แทนตัวเก่าอีกที แต่อันที่จริงไม่น่าจะมีปัญหาเพราะ RAID มันจะตรวจสอบจาก uuid ของ partition ไม่ใช่ชื่อ device
ขั้นต่อไปคือสร้างพาร์ทิชันให้เหมือนของเดิม ในที่นี้ดิสก์ทุกตัวถูกสร้างให้มีพาร์ทิชันแบบเดียวกันหมด จึงทำได้ง่ายๆ โดยการโคลนโครงสร้างพาร์ทิชันด้วย sfdisk
# sfdisk -d /dev/sdb | sfdisk /dev/sde
และเพิ่มดิสก์ใหม่เข้าไปใน RAID
# mdadm /dev/md0 --add /dev/sde1
# mdadm /dev/md1 --add /dev/sde3
ตรวจสอบดู
# cat /proc/mdstat
ก็จะพบว่า RAID กำลังถูก rebuild
อื่นๆ ที่ทำคือติดตั้ง grub ใน boot record เพื่อให้มันบูตได้ ซึ่งยังไม่ขอกล่าวถึงในที่นี้
ซึ่งทั้งหมดที่ทำนี้เครื่องนี้ยังให้บริการต่อตามปกติ แต่เพื่อความแน่ใจจึงขอรีบูตเครื่องใหม่เพื่อดูว่า RAID ยังทำงานได้ แต่พบว่า BIOS แจ้งว่าพบดิสก์เพียง 3 ตัว ปรากฏว่ามีดิสก์อีกตัวที่เดิมไม่ได้เสีย แต่พอรีบูตเครื่องแล้วไม่สามารถกลับมาทำงานได้ตามปกติ ซึ่งเป็นเรื่องในตำนานที่เคยได้ยินมาเหมือนกันว่า ระบบที่เปิดทิ้งไว้นานนับหลายปี ทำงานปกติดี แต่พอรีบูตแล้ว ดิสก์ไม่กลับมาทำงานอีก แต่ไม่คิดว่าจะเจอกับตัว แถม RAID ยัง rebuild ไม่เสร็จด้วย ตั้งสติกันสักพัก แล้วมาลุ้นกันว่าตัวไหนจะเสีย คือถ้าตัวที่เสียคือตัวที่คู่กับมันใน raid1 ก็โบกมือลาข้อมูลได้เลย แต่โชคดีที่ไปเสียตัวที่ไม่ใช่คู่มัน ไปเสียที่ raid1 อีกชุดหนึ่ง จึงต้องถอดดิสก์ตัวที่เสียอีกตัวให้ลูกค้าเอาไปเคลม โดยปล่อยให้ระบบทำงานในโหมด degraded ไปก่อน แล้วอีกอาทิตย์หนึ่งจึงกลับมาใส่และ rebuild มันคล้ายๆ step ข้างบนอีกรอบ
เพื่อความปลอดภัย เผื่อในกรณีซวยซ้ำซวยซ้อนแบบที่เจอมานี้ ควรใช้ RAID ที่ยอมให้ดิสก์เสียได้มากกว่า 1 ตัว เช่น RAID6 ที่ยอมให้ดิสก์เสียได้ถึง 2 ตัว (ส่วน RAID5 ยอมให้เสียได้เพียง 1 ตัว) RAID1+0 ก็พอไหว เสียได้ 1 ตัว กับอีกตัวที่ไม่ใช่คู่ของมัน (2 ใน 3 ตัว) อันนี้คือกรณีทำ RAID1 2 ชุด แล้วมารวมเป็น RAID0 อีกชุดหนึ่ง ถ้าทำ RAID0 2 ชุด แล้วมารวมเป็น RAID1 ผมคิดว่าไม่ใช่ไอเดียที่ดี เพราะถ้ามีดิสก์เสีย 1 ตัว อีก 1 ตัวที่จะเสียได้ ต้องเป็นคู่ของมันเท่านั้น (1 ใน 3 ตัว)
มีอีกแนวทางหนึ่งคือใช้
Linux MD RAID 10 ซึ่งเป็น non-standard RAID ซึ่งสามารถกำหนด layout ได้ว่าให้บันทึกข้อมูลในดิสก์ในลักษณะใด ซึ่งสามารถทำให้ระบบยอมให้ดิสก์เสียได้พร้อมกัน 2 ตัว ไม่ว่าจะเป็นตัวไหนก็ได้ โดย Linux MD RAID 10 นี้ยังให้ประสิทธิภาพทั้งการอ่านและเขียนสูงกว่าแบบอื่นๆ ซึ่งขึ้นอยู่กับ layout ที่เลือกอีกด้วย ไว้โอกาสหน้าจะเอามานำเสนออีกครั้งครับ