วันศุกร์ที่ 26 สิงหาคม พ.ศ. 2554

btrfs: ทำ profile แบบ RAID ในระดับ filesystem

คุณสมบัติหนึ่งของ btrfs คือ มันสามารถใช้ดิสก์หลายๆ ตัวมารวมเป็นพื้นที่เดียวกันได้ โดยไม่จำเป็นต้องพึ่ง RAID หรือ LVM ซึ่งสามารถกำหนด metadata profile และ data profie ได้ว่าให้มีคุณสมบัติคล้าย RAID แบบใด ซึ่งปัจจุบันสามารถกำหนดให้เป็น raid0, raid1, raid10

ตอนสร้าง filesystem แบบ btrfs มันจะใช้ metadate profile เป็น raid1 และ data profile เป็น raid0 ถ้าสร้างบนดิสก์ตัวเดียว metadata จะเก็บบนดิสก์ตัวเดียวกัน 2 สำเนา

# mkfs.btrfs /dev/sda1
เทียบเท่า
# mkfs.btrfs -m raid1 -d raid0 /dev/sda1

สร้างจากดิสก์ 2 ตัว
# mkfs.btrfs /dev/sda1 /dev/sdb1
เวลาเมานท์ก็ระบุตัวใดตัวหนึ่งก็ได้เช่น
# mount /dev/sda1 /mnt/data

อันที่จริงแล้วมันไม่ได้เป็น RAID จริงๆ คือไม่ได้เป็นลักษณะของ disk array แต่เป็นการกำหนดว่าหน่วยข้อมูลที่จัดเก็บใน filesystem บนดิสก์หลายๆ ตัว ให้มีลักษณะของการเก็บอย่างไร ได้แก่

raid0
เก็บหน่วยข้อมูลในลักษณะ stripping คือกระจายหน่วยข้อมูลที่ต่อเนื่องกัน ให้ไปอยู่บนดิสก์หลายๆ ตัว ทำให้การอ่านและเขียนเร็วขึ้นมากตามจำนวนดิสก์ที่มี

ต้องใช้ดิสก์อย่างน้อย 1 ตัว อันนี้จะต่างจาก RAID ปกติ ที่จะต้องใช้ดิสก์ 2 ตัวขึ้นไป คือถ้ามีดิสก์เพียง 1 ตัว มันก็จะเก็บข้อมูลตามปกตินั่นเอง
ถ้าในตอนแรกมีดิสก์ 2 ตัว เมื่อสั่ง delete ดิสก์ออก 1 ตัว มันจะคัดลอกข้อมูลจากตัวที่จะเอาออก มาที่ตัวที่เหลือ แล้วจึงเอาออก ซึ่งในการทำแบบนี้ สามารถทำในขณะที่ filesystem กำลังทำงานอยู่ได้ทันที ในการเพิ่ม ก็สามารถเพิ่มดิสก์เข้ามาได้ทันที โดยสามารถสั่ง balance เพื่อกระจายหน่วยข้อมูลออกไปเก็บบนดิสก์ทุกตัวอีกที
ความปลอดภัยของข้อมูล
แบบ raid0 นี้ข้อมูลแต่ละหน่วยมีเพียงชุดเดียว ไม่มีสำเนา หากมีดิสก์ตัวใดตัวหนึ่งเสีย ข้อมูลที่อยู่ในดิสก์ตัวนั้นจะเสียไปเลย

raid1
เก็บข้อมูลหน่วยละ 2 ชุด และอยู่คนละดิสก์กันเสมอ หรือเรียกอีกอย่างหนึ่งว่า mirroring ต้องใช้ดิสก์ 2 ตัวขึ้นไปเสมอ ดังนั้นถ้าตอนแรกสร้างบนดิสก์ 2 ตัว จะสั่ง delete ตัวใดตัวหนึ่งออกไม่ได้เลย แต่ถ้าดิสก์เกิดเสีย ยังสามารถเมานท์แบบ degrade ได้เพราะข้อมูลมีครบทั้งสองตัว

ตัวอย่าง
# mkfs.btrfs -d raid1 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
# mount /dev/sda1 /mnt/data

raid10
เก็บข้อมูลหน่วยละ 2 ชุดคนละดิสก์กัน และเรียงข้อมูลแบบ stripping ด้วย ทำให้ได้ทั้งความปลอดภัย และความเร็วในการอ่านและบันทึกข้อมูล แบบนี้ใช้ดิสก์ 4 ตัวขึ้นไปเสมอ ถ้ามีเพียง 4 ตัวจะ delete ตัวใดตัวหนึ่งออกไม่ได้

ตัวอย่าง
# mkfs.btrfs -m raid10 -d raid10 /dev/sd[a-d]1
# mount /dev/sda1 /mnt/data

สามารถเพิ่มดิสก์เข้าไปใน pool ของมันได้เรื่อยๆ เช่นเพิ่มดิสก์ตัวที่ 5 เข้ามา ก็สร้าง partition แล้วเพิ่มเข้ามาได้เลย
# btrfs device add /dev/sde1 /mnt/data
# btrfs filesystem balance /mnt/data
สังเกตว่าไม่ต้อง mkfs.btrfs แล้ว แค่เพิ่มเข้าไปเลย และหลังจากเพิ่ม สามารถสั่ง balance เพื่อกระจายข้อมูลไปยังดิสก์ตัวใหม่ด้วย

การถอดดิสก์ออกจาก pool ใช้คำสั่งตามตัวอย่างนี้
# btrfs device delete /dev/sde1 /mnt/data

การเมานท์เมื่อมีดิสก์บางตัวเสียหาย หรือถูกถอดออกไปโดยไม่ได้สั่ง delete
# mount -o degraded /dev/sda1 /mnt/data
ซึ่งก็ควรจัดหาดิสก์มาทดแทนให้เร็วที่สุดแล้วสั่ง
# btrfs device add /dev/sde1 /mnt/data
# btrfs device delete missing /mnt/data

ข้อสังเกตจากการทดลองใช้งานจริงมาระยะหนึ่ง

  1. data profile raid1 เวลาสร้างบนดิสก์ที่มากกว่า 2 ตัว มันชอบเอาข้อมูลไปกองอยู่บนดิสก์แค่ 2 ตัว ไม่ค่อยกระจายเท่าไหร่ ทำให้ดิสก์บางตัวทำงานหนัก ขณะที่บางตัวไม่ค่อยถูกใช้งาน เมื่อสั่ง balance ยิ่งทำให้ข้อมูลถูกย้ายมาเก็บแค่ 2 ตัว
  2. data profile raid10 เวลาถอดดิสก์ออกจากเครื่อง แล้วสั่งเมานท์ จะเมานท์ไม่ได้ แม้ว่าจะระบุอ็อพชัน -o degraded แล้วก็ตาม ส่วนแบบ raid1 ยังไม่ได้ลอง
  3. กำหนด layout ของการเก็บข้อมูลไม่ได้ จึงไม่สามารถระบุให้เก็บข้อมูลเป็น 3 ชุด แทนที่จะเป็น 2 ชุดได้ ซึ่งทำให้เสี่ยงที่จะเกิดปัญหาถ้ามีดิสก์เสีย 2 ตัวพร้อมๆ กัน
  4. ยังไม่รองรับ profile แบบ raid5, raid6
  5. ยังเปลี่ยน profile ไม่ได้ ถ้าสร้างแบบไหน ก็ต้องใช้แบบนั้นตลอดไป
  6. แต่ละ subvolume ไม่สามารถกำหนด profile แตกต่างกันได้
  7. การ balance ทำได้ช้ามาก
  8. สามารถสั่ง defragment ได้ แต่ก็ช้ามากเช่นกัน
  9. ยังไม่สามารถสั่งตรวจสอบ filesystem แบบ online คือกำลังเมานท์อยู่ได้ และการตรวจสอบแบบ offline ก็ยังไม่สมบูรณ์
โดยรวมๆ ยังมีหลายๆ อย่างไม่สมบูรณ์ แต่โดยส่วนตัวคิดว่า เมื่อสมบูรณ์กว่านี้ เราคงไม่จำเป็นต้องใช้ RAID อีกต่อไป

ไม่มีความคิดเห็น :

โพสต์ความคิดเห็น