normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

CentOS on Microsoft Azure で mdadm を利用した大容量領域の作成

はじめに

Microsoft Azure の IaaS(仮想マシン)で RDB を構築したくなるケースが往々にして存在すると思うが、この際に課題となりやすいのが「仮想マシンのディスク一本あたり上限サイズが 1TB 」という点だ。昨今(というか一昔前でも)の RDB なら 1TB ではサイズが足りないのが正直なところだろう。今回はこうした課題に対応するため、Microsoft Azure の IaaS 上で複数ディスクを束ねて一つの大きな論理ボリュームに見せる方法を紹介する。
Microsoft Azure の IaaS 上」と前置きしたが、実際には「複数 1TB 容量ディスクを接続された Linux OS でどの様に大きな論理ボリュームを作成するか?」が主題となる認識だ。Linux 上で本要件を実現する技術としては LVM と MDADM が存在するものの Azure Storage secrets and Linux I/O optimizations に以下の記載が存在する。

Software RAID

If you want to scale out on the number of IOPS that a single disk can provide, you will need to use some kind of software RAID configuration at the LINUX file system level.
 I tested both MD and LVM and we found that, at least in Azure, MD (MDADM) outperform LVM since it scales much better. As you can read in the details on software RAID later
 in this post, it is recommended to use 64KB for the “chunk” parameter. Since Azure already take care of disk replication (3 copies) for high-availability, as explained
 in the previous “Azure disk resiliency & high-availability” section, it is recommended to use RAID-0 striping configuration (no parity). Before proceeding with software
 RAID configuration using MDADM, you will need to do some preparation steps, which are create partitions on newly added data disks, format and mount. The complete procedure
 is described at the following link:

Configure Software RAID on Linux

http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-linux-configure-raid

One important factor to consider, in the context of software RAID, is the CPU power: the higher the number of cores, the better will be the scalability factor on using
 multiple disks, with a significant advantage of Intel-bases D-SERIES VM SKUs over AMD-based A-SERIES ones.

上記によれば Microsoft Azure 上でテストした限り、LVM よりも MDADM の方が性能がスケールするとある。また、chunk サイズを 64KB とし、ソフトウェア RAID であるために RAID-0 (可用性は Microsoft Azure ストレージ側に頼る)を利用することを推奨されていることが分かる。
今回は上記を踏まえて CentOS 7.2 を利用した大容量領域の作成を行う。

MDADM 領域の作成

こちらは特に解説は不要だと思うが、以下のように選択した仮想マシンから [新しいディスクの接続] を選択し、以下のように [ホストキャッシュ] を [なし] にしてディスクを N 本(今回は 2 本)追加する。
f:id:waritohutsu:20161227193627p:plain

以下の様な画面になっていればディスク追加は完了だ。
f:id:waritohutsu:20161227193509p:plain

ここからは Linux 仮想マシンSSH でログインした後の作業となる。まずはログイン後、管理者としてログインしなおして mdadm のインストールを行ってみる。

[azureuser@XXXXXXXXX ~]$ sudo su -
[root@XXXXXXXXX ~]# yum install mdadm
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Package mdadm-3.4-14.el7.x86_64 already installed and latest version
Nothing to do

ご覧の様に Microsoft Azure 上で作成する CentOS 7.2 の標準環境では mdadm モジュールが既存でインストール済の様だ。次に、以下のように接続ディスクの確認を行う。

[root@XXXXXXXXX ~]# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sdb  /dev/sdb1  /dev/sdc  /dev/sdd

上記のうち /dev/sda は OS ディスク領域、/dev/sdb は SSD の一時ディスク領域となる(今回仮想マシンを D シリーズで作成したために存在する)。管理ポータルから接続したディスクは /dev/sdc, /dev/sdd だ。ここで念のため /dev/sdb 領域を確認してみる。

[root@XXXXXXXXX ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        30G  1.6G   29G   6% /
devtmpfs        1.7G     0  1.7G   0% /dev
tmpfs           1.7G     0  1.7G   0% /dev/shm
tmpfs           1.7G  8.3M  1.7G   1% /run
tmpfs           1.7G     0  1.7G   0% /sys/fs/cgroup
/dev/sdb1       6.8G   32M  6.4G   1% /mnt/resource
tmpfs           345M     0  345M   0% /run/user/1000

[root@XXXXXXXXX ~]# ls /mnt/resource/
DATALOSS_WARNING_README.txt  lost+found
[root@XXXXXXXXX ~]# cat /mnt/resource/DATALOSS_WARNING_README.txt
WARNING: THIS IS A TEMPORARY DISK.

Any data stored on this drive is SUBJECT TO LOSS and THERE IS NO WAY TO RECOVER IT.

Please do not use this disk for storing any personal or application data.

For additional details to please refer to the MSDN documentation at :
http://msdn.microsoft.com/en-us/library/windowsazure/jj672979.aspx

上記のように「一時領域だから保存データおかないでね!リカバリする方法ないよ!!」と明記されている。こちらはデータベースの一時領域等で利用しよう。

ここで漸く論理ボリュームの作成に入る。まず、以下の手順を /dev/sdc, /dev/sdd(さらにディスクを接続済ならその分も)に対して実行し、パーティションを作成する。

[root@XXXXXXXXX ~]# fdisk /dev/sdc
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xe67aee68.

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-2145386495, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2145386495, default 2145386495):
Using default value 2145386495
Partition 1 of type Linux and of size 1023 GiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

上記を実行することで /dev/sdc1, /dev/sdd1 の論理ボリュームが作成されている。こちらを用いて以下のように論理ボリュームを束ねた新規ボリュームを作成する。この際、冒頭で記載した chunk サイズを 64K にすることに注意して欲しい。

[root@XXXXXXXXX ~]# mdadm --create /dev/md127 --level 0 --raid-devices 2 /dev/sdc1 /dev/sdd1 -c 64
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md127 started.

更にこちらを ext4ファイルシステムでフォーマットする。

[root@XXXXXXXXX ~]# mkfs -t ext4 /dev/md127
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=16 blocks, Stripe width=32 blocks
134070272 inodes, 536280576 blocks
26814028 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2684354560
16366 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, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848, 512000000

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

上記の領域を blkid コマンドを利用して UUID を確認し、/etc/fstab に作成したマウントポイント(以下の /mnt/data )を追記し、barrier 無効(barrier=0)としてマウント情報を記載する。

[root@XXXXXXXXX ~]# blkid
/dev/sda1: UUID="0177d0ac-2605-4bfb-9873-5bdefea12fe2" TYPE="xfs"
/dev/sdb1: UUID="beab1720-9779-4fb0-9c6a-2b53bf861873" TYPE="ext4"
/dev/sdc1: UUID="b09c7a9a-b577-c937-cb1f-075432fd1bab" UUID_SUB="e6775322-8a2c-74e8-d3a1-f7bb8d391f78" LABEL="XXXXXXXXX:127" TYPE="linux_raid_member"
/dev/sdd1: UUID="b09c7a9a-b577-c937-cb1f-075432fd1bab" UUID_SUB="b378d3d5-0611-d3ed-d02f-0b4005316319" LABEL="XXXXXXXXX:127" TYPE="linux_raid_member"
/dev/md127: UUID="488685aa-4434-483f-b773-fa737ea270c6" TYPE="ext4"

[root@XXXXXXXXX ~]# mkdir /mnt/data
[root@XXXXXXXXX ~]# vi /etc/fstab
[root@XXXXXXXXX ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Oct 26 19:33:38 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=0177d0ac-2605-4bfb-9873-5bdefea12fe2 /                       xfs     defaults        0 0
UUID=488685aa-4434-483f-b773-fa737ea270c6 /mnt/data               ext4    defaults,barrier=0        0 2

実際にマウントして情報を確認する。

[root@XXXXXXXXX ~]# mount -a
[root@XXXXXXXXX ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        30G  1.6G   29G   6% /
devtmpfs        1.7G     0  1.7G   0% /dev
tmpfs           1.7G     0  1.7G   0% /dev/shm
tmpfs           1.7G  8.3M  1.7G   1% /run
tmpfs           1.7G     0  1.7G   0% /sys/fs/cgroup
/dev/sdb1       6.8G   32M  6.4G   1% /mnt/resource
tmpfs           345M     0  345M   0% /run/user/1000
/dev/md127      2.0T   81M  1.9T   1% /mnt/data

上記で 2.0T の領域が作成されていることが確認できたと思う。