AWS EC2インスタンスのRAID化(Amazon Linux編)

  • 2019.11.07
  • AWS
AWS EC2インスタンスのRAID化(Amazon Linux編)

はじめに

前回、Windows編をやってみましたが、今回はAmazon Linux編です。

Amazon Linux2のEC2インスタンスを構築し、RAID0(ストライピング)を設定してみたいと思います。最終的にはDisk I/Oのチェックまで実施します。

EC2インスタンスの構築

SSH Keyやセキュリティグループは事前に準備しておきます。それから次のようなJSONファイルを作成します。

{
    "ImageId": "ami-0064e711cbc7a825e",
    "InstanceType": "t2.micro",
    "KeyName": "myawskey-tokyo",
    "MaxCount": 1,
    "SecurityGroupIds": [
        "sg-04b4e7642a8fc6efe"
    ],
    "SubnetId": "subnet-0b99e52d17314979d"
}

次のコマンドでEC2インスタンスを構築します。

$ aws ec2 run-instances --cli-input-json file://ec2-amazonlinux.json

EBSボリュームの作成と割り当て

RAID用にEBSボリュームを2つ作成します。

$ aws ec2 create-volume --availability-zone ap-northeast-1a --size 30
{
    "AvailabilityZone": "ap-northeast-1a",
    "CreateTime": "2019-11-07T06:41:59.000Z",
    "Encrypted": false,
    "Size": 30,
    "SnapshotId": "",
    "State": "creating",
    "VolumeId": "vol-0ee8ef286a7aa803a",
    "Iops": 100,
    "Tags": [],
    "VolumeType": "gp2"
}
$ aws ec2 create-volume --availability-zone ap-northeast-1a --size 30
{
    "AvailabilityZone": "ap-northeast-1a",
    "CreateTime": "2019-11-07T06:42:34.000Z",
    "Encrypted": false,
    "Size": 30,
    "SnapshotId": "",
    "State": "creating",
    "VolumeId": "vol-04d53a3abf85c630b",
    "Iops": 100,
    "Tags": [],
    "VolumeType": "gp2"
}

次に作成したボリュームを次のコマンドでアタッチします。

$ aws ec2 attach-volume --device /dev/sdb --instance-id $ins_id --volume-id vol-0ee8ef286a7aa803a
{
    "AttachTime": "2019-11-07T06:43:54.388Z",
    "Device": "/dev/sdb",
    "InstanceId": "i-079b3bc7c886bd285",
    "State": "attaching",
    "VolumeId": "vol-0ee8ef286a7aa803a"
}
$ aws ec2 attach-volume --device /dev/sdc --instance-id $ins_id --volume-id vol-0c4ea99bede4e2b80
{
    "AttachTime": "2019-11-07T06:44:36.161Z",
    "Device": "/dev/sdc",
    "InstanceId": "i-079b3bc7c886bd285",
    "State": "attaching",
    "VolumeId": "vol-04d53a3abf85c630b"
}

EBS ボリュームの割り当て

作成したEBSボリュームをRAID0でRAID化しマウントします。まずは、sshでEC2インスタンスにログインし、EBSボリュームの確認をします。

$ ssh -i $key ec2-user@hoge.ap-northeast-1.compute.amazonaws.com
The authenticity of host 'hoge.ap-northeast-1.compute.amazonaws.com (hoge)' can't be established.
ECDSA key fingerprint is SHA256:hoge.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hoge.ap-northeast-1.compute.amazonaws.com,hoge' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
8 package(s) needed for security, out of 15 available
Run "sudo yum update" to apply all updates.
[ec2-user@hoge ~]$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk 
└─xvda1 202:1    0   8G  0 part /
xvdb    202:16   0  30G  0 disk 
xvdc    202:32   0  30G  0 disk 

/dev/sdbと/dev/sdcでアタッチしたのですが、xvdbとxvdcに名前が変わっています。

次に、以下のコマンドでRAIDを構築します。

$ sudo mdadm --create --verbose /dev/md0 --level=0 --name=my_raid --raid-devices 2 /dev/xvdb /dev/xvdc
mdadm: chunk size defaults to 512K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

次のコマンドでRAID構築の進行状況を確認できます。構築完了したらRAIDの情報を見てみます。

$ sudo cat /proc/mdstat
Personalities : [raid0] 
md0 : active raid0 xvdc[1] xvdb[0]
      62881792 blocks super 1.2 512k chunks
      
unused devices: <none>
$ sudo mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Thu Nov  7 06:51:57 2019
        Raid Level : raid0
        Array Size : 62881792 (59.97 GiB 64.39 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Thu Nov  7 06:51:57 2019
             State : clean 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

        Chunk Size : 512K

Consistency Policy : none

              Name : my_raid
              UUID : a91cbfeb:a092d730:c3315c2d:e13711e8
            Events : 0

    Number   Major   Minor   RaidDevice State
       0     202       16        0      active sync   /dev/sdb
       1     202       32        1      active sync   /dev/sdc

ファイルシステムの構築をします。

$ sudo mkfs.ext4 -L my_raid /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=my_raid
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
3932160 inodes, 15720448 blocks
786022 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2164260864
480 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, 2654208, 
	4096000, 7962624, 11239424

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

mdadm.confファイルを作成します。

$ sudo mdadm --detail --scan | sudo tee -a /etc/mdadm.conf
ARRAY /dev/md0 metadata=1.2 name=my_raid UUID=a91cbfeb:a092d730:c3315c2d:e13711e8

ラムディスクイメージを作成します。

$ sudo dracut -H -f /boot/initramfs-$(uname -r).img $(uname -r)

マウントします。

$ sudo mkdir -p /mnt/raid
$ sudo mount LABEL=my_raid /mnt/raid

ブート時に毎回マウントするように設定します。

$ sudo cp /etc/fstab /etc/fstab.orig
$ sudo vi /etc/fstab
#
#UUID=577849ee-6d06-4473-9eec-074495a45d70     /           xfs    defaults,noatime  1   1
LABEL=my_raid       /mnt/raid   ext4    defaults,nofail        0       2

これで割り当て完了です。

Disk I/Oの測定

次のコマンドでDisk I/Oを測定してみます。まずはfioをインストールします。 

$ sudo yum install fio

次にこのような設定ファイルを作成します。

参考URL: https://thr3a.hatenablog.com/entry/20180804/1533378243

[global]
ioengine=libaio
iodepth=1
size=1g
direct=1
runtime=60
directory=/mnt/raid
stonewall

[Seq-Read]
bs=1m
rw=read

[Seq-Write]
bs=1m
rw=write

[Rand-Read-512K]
bs=512k
rw=randread

[Rand-Write-512K]
bs=512k
rw=randwrite

[Rand-Read-4K]
bs=4k
rw=randread

[Rand-Write-4K]
bs=4k
rw=randwrite

[Rand-Read-4K-QD32]
iodepth=32
bs=4k
rw=randread

[Rand-Write-4K-QD32]
iodepth=32
bs=4k
rw=randwrite

それでは測定してみます。

$ sudo chmod o+w /mnt/raid
$ fio -f bench.txt

(途中略)

Run status group 0 (all jobs):
   READ: io=1024.0MB, aggrb=66453KB/s, minb=66453KB/s, maxb=66453KB/s, mint=15779msec, maxt=15779msec

Run status group 1 (all jobs):
  WRITE: io=1024.0MB, aggrb=66445KB/s, minb=66445KB/s, maxb=66445KB/s, mint=15781msec, maxt=15781msec

Run status group 2 (all jobs):
   READ: io=1024.0MB, aggrb=66428KB/s, minb=66428KB/s, maxb=66428KB/s, mint=15785msec, maxt=15785msec

Run status group 3 (all jobs):
  WRITE: io=1024.0MB, aggrb=66437KB/s, minb=66437KB/s, maxb=66437KB/s, mint=15783msec, maxt=15783msec

Run status group 4 (all jobs):
   READ: io=648896KB, aggrb=10814KB/s, minb=10814KB/s, maxb=10814KB/s, mint=60001msec, maxt=60001msec

Run status group 5 (all jobs):
  WRITE: io=396616KB, aggrb=6609KB/s, minb=6609KB/s, maxb=6609KB/s, mint=60004msec, maxt=60004msec

Run status group 6 (all jobs):
   READ: io=1024.0MB, aggrb=25061KB/s, minb=25061KB/s, maxb=25061KB/s, mint=41840msec, maxt=41840msec

Run status group 7 (all jobs):
  WRITE: io=1024.0MB, aggrb=24595KB/s, minb=24595KB/s, maxb=24595KB/s, mint=42633msec, maxt=42633msec

Disk stats (read/write):
    md0: ios=440752/386833, merge=0/0, ticks=0/0, in_queue=0, util=0.00%, aggrios=220376/189114, aggrmerge=0/5099, aggrticks=755520/766738, aggrin_queue=1522234, aggrutil=72.50%
  xvdc: ios=220184/189142, merge=0/5003, ticks=762412/186920, in_queue=949304, util=60.25%
  xvdb: ios=220568/189086, merge=0/5195, ticks=748628/1346556, in_queue=2095164, util=72.50%

以下はRAIDを組まずに測定してみた結果です。 

$ fio -f bench.txt

(途中略)
Run status group 0 (all jobs):
   READ: io=1024.0MB, aggrb=64935KB/s, minb=64935KB/s, maxb=64935KB/s, mint=16148msec, maxt=16148msec

Run status group 1 (all jobs):
  WRITE: io=1024.0MB, aggrb=55028KB/s, minb=55028KB/s, maxb=55028KB/s, mint=19055msec, maxt=19055msec

Run status group 2 (all jobs):
   READ: io=1024.0MB, aggrb=64766KB/s, minb=64766KB/s, maxb=64766KB/s, mint=16190msec, maxt=16190msec

Run status group 3 (all jobs):
  WRITE: io=1024.0MB, aggrb=50751KB/s, minb=50751KB/s, maxb=50751KB/s, mint=20661msec, maxt=20661msec

Run status group 4 (all jobs):
   READ: io=490216KB, aggrb=8170KB/s, minb=8170KB/s, maxb=8170KB/s, mint=60001msec, maxt=60001msec

Run status group 5 (all jobs):
  WRITE: io=374744KB, aggrb=6245KB/s, minb=6245KB/s, maxb=6245KB/s, mint=60001msec, maxt=60001msec

Run status group 6 (all jobs):
   READ: io=746704KB, aggrb=12442KB/s, minb=12442KB/s, maxb=12442KB/s, mint=60011msec, maxt=60011msec

Run status group 7 (all jobs):
  WRITE: io=737476KB, aggrb=12289KB/s, minb=12289KB/s, maxb=12289KB/s, mint=60011msec, maxt=60011msec

Disk stats (read/write):
  xvdb: ios=325614/294510, merge=0/1128, ticks=2095028/2121360, in_queue=4216472, util=99.08%

ちょっと比較しにくいので結果を整形します。

比較内容RAID0シングル構成
Seq-Read66453KB/s64935KB/s
Seq-Write66445KB/s55028KB/s
Rand-Read-512K66428KB/s64766KB/s
Rand-Write-512K66437KB/s50751KB/s
Rand-Read-4K10814KB/s8170KB/s
Rand-Write-4K6609KB/s6245KB/s
Rand-Read-4K-QD3225061KB/s12442KB/s
Rand-Write-4K-QD3224595KB/s12289KB/s

並列処理を行なった際のIOは2倍以上の速度がでていることが分かります。