okochangの馬鹿でありがとう

ふらふら適当に世間を生きる日々でございます

EBSボリュームを使用したソフトウェアRAID1の構築

blogを移行したばかりなので、少しだけ『ブログを書く!』という気持が燃え上がっています。

さて、AWSを使ってる方でEC2インスタンスに複数のEBSボリュームを接続してRAID0を構成している方を見かけます。
EBSのI/Oを向上させるためにテストされた方が多いと思うのですが、そちらを参考にしつつRAID1をテストしてみました。
複数作ってもインスタンスにアタッチ出来るのは同じAvailability Zoneのものだけですし、簡単にスナップショットを作れるのでテストした人は少ないかも。
それでもRAIDの実験だけにHDDを買うのはもったいないので、そんな時はEBSが便利です。

テストに使用したのはAmazon LinuxのAMIです。
AMIからインスタスを起動して、インスタンスと同じAZに10GiBのEBSを2つ作成しました。
作成した2つのEBSを/dev/sdfと/dev/sdgにアタッチする事をお忘れなく!

EBSボリュームを/dev/sdfと/dev/sdgにアタッチすると以下のような状態となります

$ sudo ls -alh /dev/sd*
lrwxrwxrwx 1 root root 5  1月 20 15:19 2012 /dev/sda1 -> xvda1
lrwxrwxrwx 1 root root 4  1月 20 15:21 2012 /dev/sdf -> xvdf
lrwxrwxrwx 1 root root 4  1月 20 15:22 2012 /dev/sdg -> xvdg

念のため現在のファイルシステムを事前に調査しておきます。

$ df -hT
Filesystem    Type    Size  Used Avail Use% マウント位置
/dev/xvda1    ext4    7.9G  923M  6.9G  12% /
tmpfs        tmpfs    299M     0  299M   0% /dev/shm

ソフトウェアRAIDに必要なパッケージmdadmはAmazon Linuxは標準でインストール済みです

$ sudo yum info mdadm
Loaded plugins: fastestmirror, priorities, security, update-motd
Loading mirror speeds from cached hostfile
 * amzn-main: packages.ap-southeast-1.amazonaws.com
 * amzn-updates: packages.us-west-2.amazonaws.com
Installed Packages
Name        : mdadm
Arch        : x86_64
Version     : 3.2.2
Release     : 1.11.amzn1
Size        : 802 k
Repo        : installed
Summary     : The mdadm program controls Linux md devices (software RAID arrays)
URL         : http://www.kernel.org/pub/linux/utils/raid/mdadm/
License     : GPLv2+
Description : The mdadm program is used to create, manage, and monitor Linux MD (software
            : RAID) devices.  As suh, it provides similar functionality to the raidtools
            : package.  However, mdadm is a single program, and it can perform
            : almost all functions without a configuration file, though a configuration
            : file can be used to help with some common tasks.

RAID0のデバイスを作成する

$ sudo mdadm --create /dev/md0  --level=1 --metadata=1.1 --raid-devices 2 /dev/sdf /dev/sdg
mdadm: array /dev/md0 started.

mdadmn.confにデバイスの情報を入力する

$ echo DEVICE /dev/sdf /dev/sdg | sudo tee /etc/mdadm.conf
DEVICE /dev/sdf /dev/sdg
$ sudo mdadm --detail --scan | sudo tee -a /etc/mdadm.conf
ARRAY /dev/md0 metadata=1.1 name=ip-10-146-43-124:0 UUID=ad36421a:428feda0:47b89664:b8858c73

/dev/md0にファイルシステムを作成する

$ sudo mkfs.ext4 /dev/md0
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621167 blocks
131058 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2684354560
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

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

This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

/volをマウント出来るようにする

$ echo "/dev/md0 /vol ext4 noatime 0 0" | sudo tee -a /etc/fstab
/dev/md0 /vol ext4 noatime 0 0
$ sudo mkdir /vol
$ sudo mount /vol

正常にマウントしてディスクを10Gで認識しているか確認する

$ df -hT
Filesystem    Type    Size  Used Avail Use% マウント位置
/dev/xvda1    ext4    7.9G  923M  6.9G  12% /
tmpfs        tmpfs    299M     0  299M   0% /dev/shm
/dev/md0      ext4    9.9G  151M  9.2G   2% /vol

RAIDの動作確認としてapacheをインストール

$ sudo mkdir -m 777 /vol/www
$ sudo yum install httpd
$ echo "Hello World" | tee /vol/www/index.html
$ sudo vi /etc/httpd/conf/httpd.conf 
    293 #DocumentRoot "/var/www/html"
    294 DocumentRoot "/vol/www"
$ sudo httpd -t
Syntax OK
$ sudo service httpd start
Starting httpd:                                            [  OK  ]                                                                                                        

障害チェック前に現在のRAID状態をチェックする

$ sudo mdadm --detail /dev/md0
/dev/md0:
        Version : 1.1
  Creation Time : Fri Jan 20 15:23:50 2012
     Raid Level : raid1
     Array Size : 10484668 (10.00 GiB 10.74 GB)
  Used Dev Size : 10484668 (10.00 GiB 10.74 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Fri Jan 20 15:28:36 2012
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : ip-10-146-43-124:0  (local to host ip-10-146-43-124)
           UUID : ad36421a:428feda0:47b89664:b8858c73
         Events : 19

    Number   Major   Minor   RaidDevice State
       0     202       80        0      active sync   /dev/sdf
       1     202       96        1      active sync   /dev/sdg

/proc/mdstatからも動作確認が出来ます

$ cat /proc/mdstat
Personalities : [raid1] 
md0 : active raid1 xvdg[1] xvdf[0]
      10484668 blocks super 1.1 [2/2] [UU]
      
unused devices: <none>

EBSボリュームをデタッチして別のホストからhttpアクセスをしても正常に接続出来る事を確認

$ curl http://ec2-175-41-219-124.ap-northeast-1.compute.amazonaws.com
Hello World

障害となった/dev/sdgをRAIDから切り離す

$ sudo mdadm /dev/md0 -r /dev/sdg 
mdadm: hot removed /dev/sdg

デバイスが設定から削除された事を確認する

$ sudo mdadm --detail /dev/md0
/dev/md0:
        Version : 1.1
  Creation Time : Fri Jan 20 13:19:30 2012
     Raid Level : raid1
     Array Size : 10484668 (10.00 GiB 10.74 GB)
  Used Dev Size : 10484668 (10.00 GiB 10.74 GB)
   Raid Devices : 2
  Total Devices : 1
    Persistence : Superblock is persistent

    Update Time : Fri Jan 20 14:28:00 2012
          State : active, degraded
 Active Devices : 1
Working Devices : 1
 Failed Devices : 0
  Spare Devices : 0

           Name : ip-10-146-38-134:0  (local to host ip-10-146-38-134)
           UUID : 7ce0077d:2f4b529a:2935e42a:d677001f
         Events : 20

    Number   Major   Minor   RaidDevice State
       0     202       80        0      active sync   /dev/sdf
       1       0        0        1      removed

$ cat /proc/mdstat
Personalities : [raid1] 
md0 : active raid1 xvdf[0]
      10484668 blocks super 1.1 [2/1] [U_]
      
unused devices: <none>

新しいEBSボリュームを/dev/sdhに接続したのでRAIDアレイに加える

$ ls -alh /dev/sd*
lrwxrwxrwx 1 root root 5  1月 20 15:19 2012 /dev/sda1 -> xvda1
lrwxrwxrwx 1 root root 4  1月 20 15:23 2012 /dev/sdf -> xvdf
lrwxrwxrwx 1 root root 4  1月 20 15:46 2012 /dev/sdh -> xvdh
$ sudo mdadm /dev/md0 -a /dev/sdh
mdadm: added /dev/sdh

きちんとリビルドが開始されている事を確認する

$ sudo mdadm --detail /dev/md0
/dev/md0:
        Version : 1.1
  Creation Time : Fri Jan 20 15:23:50 2012
     Raid Level : raid1
     Array Size : 10484668 (10.00 GiB 10.74 GB)
  Used Dev Size : 10484668 (10.00 GiB 10.74 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Fri Jan 20 15:47:58 2012
          State : clean, degraded, recovering
 Active Devices : 1
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 1

 Rebuild Status : 6% complete

           Name : ip-10-146-43-124:0  (local to host ip-10-146-43-124)
           UUID : ad36421a:428feda0:47b89664:b8858c73
         Events : 26

    Number   Major   Minor   RaidDevice State
       0     202       80        0      active sync   /dev/sdf
       2     202      112        1      spare rebuilding   /dev/sdh

$ cat /proc/mdstat 
Personalities : [raid1] 
md0 : active raid1 xvdh[2] xvdf[0]
      10484668 blocks super 1.1 [2/1] [U_]
      [===>.................]  recovery = 16.9% (1780768/10484668) finish=3.2min speed=44104K/sec
      
unused devices: <none>

最後にこのようにリビルドが完了した事を確認したら終わりです。

$ sudo mdadm --detail /dev/md0
/dev/md0:
        Version : 1.1
  Creation Time : Fri Jan 20 15:23:50 2012
     Raid Level : raid1
     Array Size : 10484668 (10.00 GiB 10.74 GB)
  Used Dev Size : 10484668 (10.00 GiB 10.74 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Fri Jan 20 15:51:56 2012
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : ip-10-146-43-124:0  (local to host ip-10-146-43-124)
           UUID : ad36421a:428feda0:47b89664:b8858c73
         Events : 44

    Number   Major   Minor   RaidDevice State
       0     202       80        0      active sync   /dev/sdf
       2     202      112        1      active sync   /dev/sdh

$ cat /proc/mdstat 
Personalities : [raid1] 
md0 : active raid1 xvdh[2] xvdf[0]
      10484668 blocks super 1.1 [2/2] [UU]
      
unused devices: <none>

無事にRAID1によるミラーリングの動作を確認が出来ました。
本番環境でこのようなRAID構成にするかは別にして、こんな環境を一時的に(利用した分だけの課金で)使えるって学習目的の方に大きな魅力ですね。
AWSに限った話ではないと思いますが、使う方の立場が変われば色々なメリットや使い方も変わってくるのかも。

■参考サイト
http://dev.koba206.com/?p=21