AmazonEBSでraid0を組んだ時のパフォーマンス検証

AmazonEBSでraid0を組んだ時のパフォーマンス検証

EBSを組むと早いはなしを検証したい

testでマルチ、ラージなら結構こうかある説がある模様。
既存移行の方法も検討(バイナリログ等のディレクトリ分けるところからかと。)

公式のユーザガイド(EBSPerformance)
EBS自体が冗長構成組まれているのでraid0でいいと思われる。

インスタンスディスク(ローカルディスク、エフェメラルディスク)を使ってRAID0
EBSでRAID0を組むことは、RAID10(ミラーのストライプ)と同等である

Largeインスタンス以上であれば、1台よりも2台の方がディスクI/O性能が目に見えて上がりました

エフェメラルディスク(stopすると消えるほうのディスク)でraid0したい場合の起動コマンド例
[shell] ec2-run-instances ami-e965ba80 –region us-east-1 –key id_rsa –group sg-a4866fcc –placement-group test –instance-type cc2.8xlarge -b “/dev/sdb=ephemeral0” - b “/dev/sdc=ephemeral1” -b “/dev/sdd=ephemeral2” “/dev/sdf=ephemeral3” [/shell] ・ラージでEBSディスクを2つ追加して起動してログインする
[shell] # df -h Filesystem Size Used Avail Use% Mounted on /dev/xvde1 9.9G 867M 8.5G 10% / none 3.7G 0 3.7G 0% /dev/shm # ls -l /dev/xv* brw-rw—- 1 root disk 202, 65 Mar 21 02:15 /dev/xvde1 brw-rw—- 1 root disk 202, 80 Mar 21 02:15 /dev/xvdf brw-rw—- 1 root disk 202, 96 Mar 21 02:15 /dev/xvdg find /dev -type b -print [/shell] してみたがそれらしい名前のは上記のみ。

・mdadmでraidを組む
mdadmのつかいかた
[shell] # yum install mdadm Installed: mdadm.x86_64 0:3.2.5-4.el6 # /sbin/mdadm –create /dev/md0 –level=0 -c256 –raid-devices=2 /dev/xvdf /dev/xvdg mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. # echo ‘DEVICE /dev/xvdf /dev/xvdg’ > /etc/mdadm.conf # mdadm –detail –scan » /etc/mdadm.conf # cat /etc/mdadm.conf DEVICE /dev/xvdf /dev/xvdg ARRAY /dev/md0 metadata=1.2 name=aws-cent63-template:0 UUID=f1d24aee:f788f00e:66d66f4d:ac63fa92 # ls -l /dev/md0 brw-rw—- 1 root disk 9, 0 Mar 21 02:39 /dev/md0 [/shell] ・ファイルフォーマット
xfsが早いらしいと見かけたが、こちらのベンチの結果をみると実際そんなに変わらないかも。

xfsはacl使うと実は遅いらしいという情報もありました。
(SSDやiodriveとかではxfsで4kbでフォーマットが早いらしいと聞きます)

普通に/とおなじファイルシステムで試すことにする。
[shell] # mount /dev/xvde1 on / type ext4 (rw) none on /proc type proc (rw) none on /sys type sysfs (rw) none on /dev/pts type devpts (rw,gid=5,mode=620) none on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) # mkfs.ext4 /dev/md0 # mkdir /data # mount /dev/md0 /data # df -h Filesystem Size Used Avail Use% Mounted on /dev/xvde1 9.9G 859M 8.6G 9% / none 3.7G 0 3.7G 0% /dev/shm /dev/md0 20G 172M 19G 1% /data # mount /dev/xvde1 on / type ext4 (rw) none on /proc type proc (rw) none on /sys type sysfs (rw) none on /dev/pts type devpts (rw,gid=5,mode=620) none on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) /dev/md0 on /data type ext4 (rw) [/shell] ・ベンチマークする
fioベンチ参考
fioダウンロード
[shell] # wget http://pkgs.repoforge.org/fio/fio-2.0.9-1.el6.rf.x86_64.rpm # yum install libaio # rpm -ivh fio-2.0.9-1.el6.rf.x86_64.rpm [/shell] 4kランダムリードを16多重で5回計測する場合。
[shell] # vi randread4k16.fio # cat randread4k16.fio [randread4k] readwrite=randread blocksize=4k size=100m directory=/data direct=1 loops=5 numjobs=16 # fio -group_reporting randread4k16.fio ~略~ read : io=512000KB, bw=3200.6KB/s, iops=800 , runt=159974msec ~略~
Run status group 0 (all jobs): READ: io=8000.0MB, aggrb=51001KB/s, minb=3187KB/s, maxb=3209KB/s, mint=159540msec, maxt=160623msec Disk stats (read/write): md0: ios=2047724/11, merge=0/0, ticks=0/0, in_queue=0, util=0.00%, aggrios=1024000/4, aggrmerge=0/1, aggrticks=1203285/363, aggrin_queue=1202916, aggrutil=87.91% xvdf: ios=1024000/9, merge=0/2, ticks=1177359/726, in_queue=1177346, util=82.95% xvdg: ios=1024000/0, merge=0/0, ticks=1229211/0, in_queue=1228486, util=87.91% [/shell] 4kランダムライトを16多重で5回計測する場合。
[shell] # vi randwrite4k16.fio [randwrite4k] readwrite=randwrite blocksize=4k size=100m directory=/data direct=1 loops=5 numjobs=16 # fio -group_reporting randwrite4k16.fio ~略~ write: io=512000KB, bw=1997.4KB/s, iops=499 , runt=256336msec ~略~
Run status group 0 (all jobs): WRITE: io=8000.0MB, aggrb=31902KB/s, minb=1993KB/s, maxb=1998KB/s, mint=256247msec, maxt=256786msec Disk stats (read/write): md0: ios=0/2061004, merge=0/0, ticks=0/0, in_queue=0, util=0.00%, aggrios=0/1024965, aggrmerge=0/5568, aggrticks=0/2042634, aggrin_queue=2042035, aggrutil=99.58% xvdf: ios=0/1025035, merge=0/5770, ticks=0/1733675, in_queue=1733059, util=97.23% xvdg: ios=0/1024895, merge=0/5366, ticks=0/2351593, in_queue=2351011, util=99.58% [/shell] シーケンシャルも一応計ってみる
[shell] # vi seqread4k16.fio [seqread4k] readwrite=read blocksize=4k size=100m directory=/data direct=1 loops=5 numjobs=16 # fio -group_reporting seqread4k16.fio ~略~ read : io=512000KB, bw=3215.9KB/s, iops=803 , runt=159213msec ~略~
Run status group 0 (all jobs): READ: io=8000.0MB, aggrb=51306KB/s, minb=3206KB/s, maxb=3216KB/s, mint=159165msec, maxt=159669msec Disk stats (read/write): md0: ios=2046486/24, merge=0/0, ticks=0/0, in_queue=0, util=0.00%, aggrios=1024000/5, aggrmerge=0/6, aggrticks=1202445/327, aggrin_queue=1202016, aggrutil=87.41% xvdf: ios=1024000/11, merge=0/13, ticks=1183413/655, in_queue=1183332, util=84.11% xvdg: ios=1024000/0, merge=0/0, ticks=1221478/0, in_queue=1220701, util=87.41% # vi seqwrite4k16.fio [seqwrite4k] readwrite=write blocksize=4k size=100m directory=/data direct=1 loops=5 numjobs=16 # fio -group_reporting seqwrite4k16.fio ~略~ write: io=512000KB, bw=1795.7KB/s, iops=448 , runt=285131msec ~略~ Run status group 0 (all jobs): WRITE: io=8000.0MB, aggrb=28708KB/s, minb=1794KB/s, maxb=1797KB/s, mint=284902msec, maxt=285354msec Disk stats (read/write): md0: ios=0/2048172, merge=0/0, ticks=0/0, in_queue=0, util=0.00%, aggrios=0/1024126, aggrmerge=0/5, aggrticks=0/2263010, aggrin_queue=2262748, aggrutil=96.45% xvdf: ios=0/1024125, merge=0/11, ticks=0/2035946, in_queue=2035696, util=91.73% xvdg: ios=0/1024128, merge=0/0, ticks=0/2490074, in_queue=2489800, util=96.45% [/shell] raid0じゃないところも計って差を確かめる
[shell] # vi randread4k16_noraid.fio [randread4k] readwrite=randread blocksize=4k size=100m directory=/ direct=1 loops=5 numjobs=16 # fio -group_reporting randread4k16_noraid.fio ~略~ read : io=512000KB, bw=3194.4KB/s, iops=798 , runt=160281msec ~略~ Run status group 0 (all jobs): READ: io=8000.0MB, aggrb=50913KB/s, minb=3182KB/s, maxb=3200KB/s, mint=159959msec, maxt=160899msec Disk stats (read/write): xvde1: ios=2047511/20, merge=0/5, ticks=2427396/202, in_queue=2426053, util=100.00% # vi randwrite4k16_noraid.fio [randwrite4k] readwrite=randwrite blocksize=4k size=100m directory=/ direct=1 loops=5 numjobs=16 # fio -group_reporting randwrite4k16_noraid.fio ~略~ write: io=512000KB, bw=1374.4KB/s, iops=343 , runt=372625msec ~略~ Run status group 0 (all jobs): WRITE: io=8000.0MB, aggrb=21969KB/s, minb=1373KB/s, maxb=1375KB/s, mint=372306msec, maxt=372874msec Disk stats (read/write): xvde1: ios=1/2049664, merge=0/14975, ticks=7/5995555, in_queue=5995341, util=100.00% # vi seqread4k16_noraid.fio [seqread4k] readwrite=read blocksize=4k size=100m directory=/ direct=1 loops=5 numjobs=16 # fio -group_reporting seqread4k16_noraid.fio ~略~ read : io=512000KB, bw=3124.3KB/s, iops=781 , runt=163882msec ~略~ Run status group 0 (all jobs): READ: io=8000.0MB, aggrb=49945KB/s, minb=3121KB/s, maxb=3129KB/s, mint=163601msec, maxt=164020msec Disk stats (read/write): xvde1: ios=2046743/23, merge=0/3, ticks=2503841/252, in_queue=2502405, util=100.00% # vi seqwrite4k16_noraid.fio [seqwrite4k] readwrite=write blocksize=4k size=100m directory=/ direct=1 loops=5 numjobs=16 # fio -group_reporting seqwrite4k16_noraid.fio ~略~ write: io=512000KB, bw=1438.6KB/s, iops=359 , runt=355910msec ~略~ Run status group 0 (all jobs): WRITE: io=8000.0MB, aggrb=23015KB/s, minb=1438KB/s, maxb=1439KB/s, mint=355585msec, maxt=355936msec Disk stats (read/write): xvde1: ios=15/2047985, merge=0/21, ticks=65/5674427, in_queue=5674447, util=100.00% [/shell] ★比較結果

read/write種別,singledisk(iops),raid0disk(iops),singledisk(帯域幅),raid0disk(帯域幅)
ランダムリード7988003194.4KB/s3200.6KB/s
ランダムライト3434991374.4KB/s1997.4KB/s
シーケンシャルリード7818033124.3KB/s3215.9KB/s
シーケンシャルライト3594481438.6KB/s1795.7KB/s

結果:raid0組んだほうが早い。(※)
※こちらは本環境での結果となりますので、実際お使いの環境でお試しいただくことをお勧めいたします。

・移行方法案

本番DBではなくバックアップ用に同期しているサーバ上の3307ポートのDBがとりあえず移行ターゲット。
試験環境も混在しているため、ioが分散されれば結構遅延に対して効果があると思われる。

0.対象サーバにディスク追加し、raid0を組んでフォーマットしておく
1.slaveを止める(必要ならmy.cnfにskip_slaveいれる)
2.mysql2(3307のほう)を止める
3.データディレクトリコピー
4.シンボリックリンク
5.mysql2を起動
6.slaveを開始する(必要があれば)
7.同期するのを待つ
8.遅延の度合いを確かめる

画像入りでdumpとレストアの仕方が特殊だったと思うので、コールドが手間がなくてよいと考えられる。