Friday, December 16, 2005

ลองใช้ mdadm / LVM บน Honey

Honey

สรุปว่าเครื่องเซิร์ฟเวอร์ใหม่ที่เพิ่งลง Ubuntu 64bit ไป (ลงเอยด้วย Ubuntu 5.1-amd64) มีชื่อว่า Honey :) เพราะตอนติดตั้งกำลังนั่งกิน "Cashews Honey Roasted"

เครื่องเซิร์ฟเวอร์ตัวก่อนหน้า (ที่เพิ่งเจ๊งไป) ตอนสั่งเลือกเป็น Hardware SATA RAID ใช้แล้วรู้สึกว่ามันช้า ยังดีที่ Linux Kernel มี Driver ให้ แต่โปรแกรมเครื่องมือสำหรับตรวจสอบสถานะของ RAID จาก Linux เขาแจกมาให้เป็น Binary เฉพาะสำหรับ Redhat เอามาลองเล่นดูบน Debian (KNOPPIX) แล้วรันไม่ได้ ยังไม่ได้ไปไล่ดูว่าเป็นเพราะอะไร

เครื่องนี้เลยเปลี่ยนเป็น SCSI Disk 300GB x 4 ตัว ธรรมด้าธรรมดา (JBOD - Just a Bunch Of Disks) แล้วใช้ Software RAID ของ Linux จัดการเองละกัน ง่ายดี ไม่น่ามีปัญหาเรื่อง Distro ฯลฯ อีก

MDADM

ก่อนหน้านี้บน Linux เวลาทำ Software RAID ก็จะเขียนไฟล์ /etc/raidtab แล้วใช้โปรแกรม ฯลฯ ใน raidtools (mkraid, raidstart) จัดการ ไปพบว่าเดี๋ยวนี้มีโปรแกรมใหม่ ชื่อ mdadm ซึ่งไม่ง้อไฟล์ /etc/raidtab แล้ว และท่าทางมีอะไรให้เล่นมากขึ้นเยอะ ก็เลยตัดสินใจลองของใหม่ก็แล้วกัน

สมมติว่าสร้าง Partition บน Disk แต่ละตัวเรียบร้อยแล้ว (ความจริงไม่น่าจำเป็น ใช้ /dev/sda ทั้งก้อนไปเลย) และจะเอา /dev/sdb1, /dev/sdc1, /dev/sdd1 3 อันมาทำ RAID5 ต้องสั่ง

# mdadm -Cv /dev/md0 -l5 -n3 /dev/sd{b,c,d}1
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 64K
mdadm: size set to 292961216K
mdadm: array /dev/md0 started.
มันจัดการสร้าง RAID5 เป็น /dev/md0 และ START ให้เรียบร้อยเลย ง่ายดี ในคู่มือของ mdadm เขาบอกว่า เวลาสร้าง RAID5 โดยกำหนดว่ามีดิสก์ 3 ตัว mdadm จะแกล้งสร้างโดยใช้ดิสก์แค่ 2 ตัวก่อน (แกล้งบอกว่าตัวที่ 3 เจ๊ง) และให้อีกตัวเป็น Spare จากนั้นจึงทำการ Recover เอา Spare มาทำเป็นตัวที่ 3

เขาบอกว่าแบบนี้จะเร็วกว่า ซึ่งก็เห็นได้จาก

# mdadm --detail /dev/md0
/dev/md0:
        Version : 00.90.01
  Creation Time : Thu Dec 15 12:07:44 2005
     Raid Level : raid5
     Array Size : 585922432 (558.78 GiB 599.98 GB)
    Device Size : 292961216 (279.39 GiB 299.99 GB)
   Raid Devices : 3
  Total Devices : 3
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Thu Dec 15 12:30:10 2005
          State : clean, degraded, recovering
 Active Devices : 2
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 1

         Layout : left-symmetric
     Chunk Size : 64K

 Rebuild Status : 31% complete

           UUID : 57fdf57f:22aec90f:f38f06cf:4e33028d
         Events : 0.17

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/.static/dev/sdb1
       1       8       33        1      active sync   /dev/.static/dev/sdc1
       2       0        0        -      removed

       3       8       49        2      spare rebuilding   /dev/.static/dev/sdd1r
และ
# cat /proc/mdstat
Personalities : [raid5]
md0 : active raid5 sdd1[3] sdc1[1] sdb1[0]
      585922432 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
      [>....................]  recovery =  0.9% (2670336/292961216) finish=67.1min speed=72010K/sec
จะเห็นว่า sdd1 มีตัวเลข [3] เพราะโดนทำให้เป็น SPARE ไม่ต่อเนื่องกับสองตัวแรก sdb1[0], sdc1[1]

เมื่อเวลาผ่านไปชั่วโมงกว่าๆ ลองเปิดดูอีกที

# cat /proc/mdstat 
Personalities : [raid5] 
md0 : active raid5 sdd1[2] sdc1[1] sdb1[0]
      585922432 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
      
unused devices: 
พอทำการซ่อมเสร็จ sdd1 กลายเป็นเลข [2] และรายละเอียดของ RAID จะเป็น
# mdadm --detail /dev/md0
/dev/md0:
        Version : 00.90.01
  Creation Time : Thu Dec 15 12:07:44 2005
     Raid Level : raid5
     Array Size : 585922432 (558.78 GiB 599.98 GB)
    Device Size : 292961216 (279.39 GiB 299.99 GB)
   Raid Devices : 3
  Total Devices : 3
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Thu Dec 15 13:44:05 2005
          State : clean
 Active Devices : 3
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 64K

           UUID : 57fdf57f:22aec90f:f38f06cf:4e33028d
         Events : 0.1654

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/.static/dev/sdb1
       1       8       33        1      active sync   /dev/.static/dev/sdc1
       2       8       49        2      active sync   /dev/.static/dev/sdd1
ทีแรกไม่เข้าใจ คิดว่าจะทำแบบมี 1 SPARE ไปตลอด เนื้อที่หายไป 300GB คงแย่เลย ตกลงได้ 600GB ถูกต้องตามต้องการ

ลอง Reboot ดูก็พบว่า /dev/md0 โผล่ขึ้นมาเลย ทั้งๆที่ยังไม่ได้ไปแก้ Partition ID อะไร และมี Process mdadm -F ทำงานอยู่ในโหมด Monitor คอยส่งเมล์ไปให้ root หากมีอะไรเกิดขึ้นกับ RAID5 ตัวนี้

 8706 ?        Ss     0:00 /sbin/mdadm -F -i /var/run/mdadm.pid -m root -f -s
เจ๋ง+ง่าย ดี :)

LVM

ได้ /dev/md0 มาแล้ว ว่าจะ Format เลย คิดไปคิดมา ลองเล่น LVM ดูบ้างดีกว่า เท่าที่เคยอ่าน จุดเด่นของ LVM คือ ยืดหดได้ ย้ายที่ได้ง่าย และทำ Snapshot ได้

ขั้นตอนมีอยู่ได้ว่า

  1. เอา Partition ของ HardDisk ที่มี มาทำเป็น PV (Physical Volume)
  2. เอา PV หลายๆอัน มารวมกันเป็น VG (Volume Group)
  3. แบ่ง VG ออกเป็นส่วนๆตามต้องการ สำหรับแต่ละ File System แต่ละส่วนเรียกว่า LV (Logical Volume)
ขั้นแรก เอา /dev/md0 มาทำให้เป็น PV
# pvcreate /dev/md0
  Physical volume "/dev/md0" successfully created
ขั้นต่อไป สร้าง VG ชื่อ "honey_group" จาก PV ซึ่งบังเอิญมีแค่ตัวเดียว
# vgcreate honey_group /dev/md0
  Volume group "honey_group" successfully created
ตรวจสอบ
# vgdisplay
  --- Volume group ---
  VG Name               Ubuntu
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               279.15 GB
  PE Size               4.00 MB
  Total PE              71462
  Alloc PE / Size       71462 / 279.15 GB
  Free  PE / Size       0 / 0
  VG UUID               R6LjNt-EY2N-98nE-IqrH-sBu3-P8tC-Op9PHC

  --- Volume group ---
  VG Name               honey_group
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               558.78 GB
  PE Size               4.00 MB
  Total PE              143047
  Alloc PE / Size       0 / 0
  Free  PE / Size       143047 / 558.78 GB
  VG UUID               XkNJGo-4q8s-BOD1-veBq-gBB6-aGxB-04t6Y9
อันบน "Ubuntu" เป็นอันที่ Ubutun สร้างให้ตอนเลือกติดตั้งลงบน LVM

หลังจากนั้นก็สร้าง LV บน VG นี้ (ขนาด 558G เอามาจากบรรทัด "Free PE" ข้างบน)

# lvcreate -L558G -nhoneyhome honey_group
  Logical volume "honeyhome" created
ตรวจสอบ
root@honey:/home/vuthi# lvdisplay
  --- Logical volume ---
  LV Name                /dev/Ubuntu/root
  VG Name                Ubuntu
  LV UUID                pguS5X-B6t0-tTf2-cQYD-ZWHP-mNYB-jKx5Oy
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                267.83 GB
  Current LE             68565
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           254:0

  --- Logical volume ---
  LV Name                /dev/Ubuntu/swap_1
  VG Name                Ubuntu
  LV UUID                2mPHNn-sNfN-VJcQ-QZ8U-zsPF-5Yqz-8TE8AM
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                11.32 GB
  Current LE             2897
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           254:1

  --- Logical volume ---
  LV Name                /dev/honey_group/honeyhome
  VG Name                honey_group
  LV UUID                Nts6Xl-z9ti-SwzK-A3g1-NbgE-GAwe-jY2Piy
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                558.00 GB
  Current LE             142848
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           254:6
สองอันบน "root" กับ "swap_1" Ubutun สร้างให้ตอนเลือกติดตั้งลงบน LVM

เมื่อได้ LV ชื่อ /dev/honey_group/honeyhome มาแล้วก็จัดการสร้าง File System

# mkfs.ext3 -L HOME /dev/honey_group/honeyhome
mke2fs 1.38 (30-Jun-2005)
Filesystem label=HOME
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
73138176 inodes, 146276352 blocks
7313817 blocks (5.00%) reserved for the super user
First data block=0
4464 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
จากนี้ก็ทำการ mount /dev/honey_group/honeyhome ได้ตามปกติ

ถ้าเข้าไปดูใต้ /dev จะเห็นว่าความจริงแล้ว /dev/honey_group/honeyhome เป็น symlink ไปยัง "VG-LV" ใต้ /dev/mapper/ อีกทีหนึ่ง คือ /dev/mapper/honey_group-honeyhome

No comments: