お金をかけずにサーバーの勉強をしよう

LVM2でソフトウェアRAID構築

2022年7月26日

メニューへ戻る

※Azureについては 2022年7月に 2021年頃の記憶を基に書いています。パブリッククラウドのサービスは改善されていくので最新情報にあたるようにして下さい。

Microsoftのパブリッククラウド Azureで VMを構築した際にストレージのスピードが問題になったことがあります。

Azureには高速ストレージとして PremiumSSDというものがあるのですが、これでも速度が足りませんでした。

私はミドルウェアのライセンスフィーを低く抑えるために CPU数が 2個や 4個の VMを良く選定していたのですが、このサイズの VMでは接続できるストレージ数や最大スループットや最大IOPSが制限されていて、PremiumSSD本来のパワーを享受できずヤキモキしていました。

もっとお金を払って大きな VMを使えよって事なんで、仕方がないんですけどね。

Ultra Diskはまだ Azure Backupに対応してなかったので運用上使うことが出来なかったです。
(今は対応しているだろうか)

そんな経験をしていた過程で PremiumSSDの速度アップの方法を調べていた時に Microsoftのサイトで見つけた方法は、複数の PremiumSSDで RAID0(ディスクストライピング)せよ、というものでした。

Premium SSD自体は RAIDになっていますが、それを OSの上で束ねてソフトRAIDを組めってことです。

その場でストライピングを使う際の稼働率低下に触れてないのはどうかなぁと思うところはありますが、他に方法もないですし、嫌なら RAID0+1にしてミラーリングもしとけよってことですね。

Ubuntuのディスク増設にて、LVM2による論理ボリューム作成をやってますので、その応用で RAID0の論理ボリュームを作ってみます。

環境は VMware Workstation Playerで作った仮想ハードウェアにインストールした Ubuntu Server 22.04、そこに仮想ハードディスクを 3つ増設しています。

まず増設前の Ubuntu Serverのディスクの状態です。
20GBの仮想ハードディスク(/dev/sda)が 1つだけです。

subro@UbuntuServer2204:~$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0 61.9M  1 loop /snap/core20/1518
loop1                       7:1    0   62M  1 loop /snap/core20/1581
loop2                       7:2    0 79.9M  1 loop /snap/lxd/22923
loop3                       7:3    0 44.7M  1 loop /snap/snapd/15534
loop4                       7:4    0   47M  1 loop /snap/snapd/16292
sda                         8:0    0   20G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1.8G  0 part /boot
└─sda3                      8:3    0 18.2G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   10G  0 lvm  /
sr0                        11:0    1 1024M  0 rom

こちらが 5GBの仮想ハードディスクを 3つ追加した後です。

subro@UbuntuServer2204:~$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0 61.9M  1 loop /snap/core20/1518
loop1                       7:1    0   62M  1 loop /snap/core20/1581
loop2                       7:2    0 44.7M  1 loop /snap/snapd/15534
loop3                       7:3    0   47M  1 loop /snap/snapd/16292
loop4                       7:4    0 79.9M  1 loop /snap/lxd/22923
sda                         8:0    0   20G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1.8G  0 part /boot
└─sda3                      8:3    0 18.2G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   10G  0 lvm  /
sdb                         8:16   0    5G  0 disk
sdc                         8:32   0    5G  0 disk
sdd                         8:48   0    5G  0 disk
sr0                        11:0    1 1024M  0 rom

ピンク色のディスクが増えています。

それぞれ Physical Volume(PV)として登録します。

subro@UbuntuServer2204:~$ sudo pvcreate /dev/sdb /dev/sdc /dev/sdd
  Physical volume "/dev/sdb" successfully created.
  Physical volume "/dev/sdc" successfully created.
  Physical volume "/dev/sdd" successfully created.

subro@UbuntuServer2204:~$ sudo pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda3
  VG Name               ubuntu-vg
  PV Size               <118.23 GiB / not usable 3.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              4665
  Free PE               2105
  Allocated PE          2560
  PV UUID               iB5GZf-Oam8-MJX9-Nx3z-sLrd-3vm0-ZzXnlZ

  "/dev/sdb" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb
  VG Name
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               WkuR5d-AEGt-vb7N-ITci-j64c-zdnr-LYSlJJ

  "/dev/sdc" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc
  VG Name
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               Xo2PLD-Uirc-V62V-DZSv-51jV-6Dve-dGBXvn

  "/dev/sdd" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdd
  VG Name
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               fGEu7E-HgPT-wLBF-CXMp-3dXj-zipo-KqyQA0

PVができました。
3つとも同じ Volume Group(VG)に所属させます。

subro@UbuntuServer2204:~$ sudo vgcreate -v raid-group /dev/sdb /dev/sdc /dev/sdd
  Wiping signatures on new PV /dev/sdb.
  Wiping signatures on new PV /dev/sdc.
  Wiping signatures on new PV /dev/sdd.
  Adding physical volume '/dev/sdb' to volume group 'raid-group'
  Adding physical volume '/dev/sdc' to volume group 'raid-group'
  Adding physical volume '/dev/sdd' to volume group 'raid-group'
  Archiving volume group "raid-group" metadata (seqno 0).
  Creating volume group backup "/etc/lvm/backup/raid-group" (seqno 1).
  Volume group "raid-group" successfully created

subro@UbuntuServer2204:~$ sudo vgdisplay raid-group
  --- Volume group ---
  VG Name               raid-group
  System ID
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               <14.99 GiB
  PE Size               4.00 MiB
  Total PE              3837
  Alloc PE / Size       1280 / 5.00 GiB
  Free  PE / Size       2557 / <9.99 GiB
  VG UUID               Yfqh6g-Yyxj-olCS-515a-D69C-ilTH-ce9a6v

「raid-group」という名前で VGができました。

次の Logical Volume作成の段で RAIDにします。
RAID0,RAID1,RAID4,RAID5,RAID6,RAID10を作ることができます。

サイズの指定は余り無くキッチリ使いたかったので、上の [Total PE]の数値を
「--extents PE数」で指定しています。

subro@UbuntuServer2204:~$ sudo lvcreate --type raid0 --stripes 3 --extents 3837 --name lv-raid0 -v raid-group
  Using default stripesize 64.00 KiB.
  Archiving volume group "raid-group" metadata (seqno 7).
  Creating logical volume lv-raid0
  Creating logical volume lv-raid0_rimage_0
  Creating logical volume lv-raid0_rimage_1
  Creating logical volume lv-raid0_rimage_2
  Creating volume group backup "/etc/lvm/backup/raid-group" (seqno 8).
  Activating logical volume raid-group/lv-raid0.
  activation/volume_list configuration setting not defined: Checking only host tags for raid-group/lv-raid0.
  Creating raid--group-lv--raid0_rimage_0
  Loading table for raid--group-lv--raid0_rimage_0 (253:1).
  Resuming raid--group-lv--raid0_rimage_0 (253:1).
  Creating raid--group-lv--raid0_rimage_1
  Loading table for raid--group-lv--raid0_rimage_1 (253:2).
  Resuming raid--group-lv--raid0_rimage_1 (253:2).
  Creating raid--group-lv--raid0_rimage_2
  Loading table for raid--group-lv--raid0_rimage_2 (253:3).
  Resuming raid--group-lv--raid0_rimage_2 (253:3).
  Creating raid--group-lv--raid0
  Loading table for raid--group-lv--raid0 (253:4).
  Resuming raid--group-lv--raid0 (253:4).
  Wiping known signatures on logical volume raid-group/lv-raid0.
  Initializing 4.00 KiB of logical volume raid-group/lv-raid0 with value 0.
  Logical volume "lv-raid0" created.

subro@UbuntuServer2204:~$ sudo lvdisplay /dev/raid-group/lv-raid0
  --- Logical volume ---
  LV Path                /dev/raid-group/lv-raid0
  LV Name                lv-raid0
  VG Name                raid-group
  LV UUID                65Of1h-GXLg-Ccm3-s7kp-3Ser-mGHJ-FFMPg0
  LV Write Access        read/write
  LV Creation host, time UbuntuServer2204-2, 2022-07-26 09:56:02 +0900
  LV Status              available
  # open                 0
  LV Size                <14.99 GiB
  Current LE             3837
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     768
  Block device           253:4

「lv-raid0」という名前で LVができました。
3つ合わせて概ね 15GBのサイズになっています。

ディスクのできあがりを見てみましょう。

subro@UbuntuServer2204:~$ lsblk
NAME                             MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0                              7:0    0 61.9M  1 loop /snap/core20/1518
loop1                              7:1    0   62M  1 loop /snap/core20/1581
loop2                              7:2    0 44.7M  1 loop /snap/snapd/15534
loop3                              7:3    0   47M  1 loop /snap/snapd/16292
loop4                              7:4    0 79.9M  1 loop /snap/lxd/22923
sda                                8:0    0   20G  0 disk
├─sda1                             8:1    0    1M  0 part
├─sda2                             8:2    0  1.8G  0 part /boot
└─sda3                             8:3    0 18.2G  0 part
  └─ubuntu--vg-ubuntu--lv        253:0    0   10G  0 lvm  /
sdb                                8:16   0    5G  0 disk
└─raid--group-lv--raid0_rimage_0 253:1    0    5G  0 lvm
  └─raid--group-lv--raid0        253:4    0   15G  0 lvm
sdc                                8:32   0    5G  0 disk
└─raid--group-lv--raid0_rimage_1 253:2    0    5G  0 lvm
  └─raid--group-lv--raid0        253:4    0   15G  0 lvm
sdd                                8:48   0    5G  0 disk
└─raid--group-lv--raid0_rimage_2 253:3    0    5G  0 lvm
  └─raid--group-lv--raid0        253:4    0   15G  0 lvm
sr0                               11:0    1 1024M  0 rom

このLV上に ext4のファイルシステムを作成します。

subro@UbuntuServer2204:~$ sudo mkfs.ext4 /dev/raid-group/lv-raid0
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 3929088 4k blocks and 983040 inodes
Filesystem UUID: 020aa7b7-15f5-40ea-a1d3-b38649db41dc
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

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

できました。

マウントポイントを作ります。

subro@UbuntuServer2204:~$ sudo mkdir /data1

/etc/fstabにマウント情報を記載するために、UUIDを確認します。
/dev/mapperディレクトリの下にデバイスマッパーによって作られたリンクがあるはず…。

subro@UbuntuServer2204:~$ ls /dev/mapper
合計 0
crw------- 1 root root 10, 236  7月 26 09:13 control
lrwxrwxrwx 1 root root       7  7月 26 10:03 raid--group-lv--raid0 -> ../dm-4
lrwxrwxrwx 1 root root       7  7月 26 09:56 raid--group-lv--raid0_rimage_0 -> ../dm-1
lrwxrwxrwx 1 root root       7  7月 26 09:56 raid--group-lv--raid0_rimage_1 -> ../dm-2
lrwxrwxrwx 1 root root       7  7月 26 09:56 raid--group-lv--raid0_rimage_2 -> ../dm-3
lrwxrwxrwx 1 root root       7  7月 26 09:13 ubuntu--vg-ubuntu--lv -> ../dm-0

/dev/dm-4を指している「raid--group-lv--raid0」が対象でしょう。

UUIDを確認します。

subro@UbuntuServer2204:~$ sudo blkid -p /dev/mapper/raid--group-lv--raid0
/dev/mapper/raid--group-lv--raid0: UUID="020aa7b7-15f5-40ea-a1d3-b38649db41dc" VERSION="1.0" BLOCK_SIZE="4096" TYPE="ext4" USAGE="filesystem"

UUIDが分かったので /etc/fstab を編集します。
一番下の行を追加しました。

subro@UbuntuServer2204:~$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#                
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-12lIizcyjCcyAF32oksfsr29gHTlOR3hUP0KZ9l3rlsdM0R8j05Yc9hVfA82VxTq / ext4 defaults 0 1
# /boot was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/bc1cfd06-4015-4d64-a94d-a5deb53905bc /boot ext4 defaults 0 1
/swap.img       none    swap    sw      0       0
UUID=020aa7b7-15f5-40ea-a1d3-b38649db41dc /data1 ext4 defaults 0 1

マウントします。

subro@UbuntuServer2204:~$ sudo mount -a

動作確認します。

subro@UbuntuServer2204:~$ ls -ld /data1
drwxr-xr-x 3 root root 4096  7月 26 10:03 /data1

subro@UbuntuServer2204:~$ cd /data1

subro@UbuntuServer2204:/data1$ sudo touch aaa

subro@UbuntuServer2204:/data1$ ls -l
合計 16
-rw-r--r-- 1 root root     0  7月 26 10:25 aaa
drwx------ 2 root root 16384  7月 26 10:03 lost+found

良さげです。

LVM2でのソフトウェアRAID構築は以上になります。


昨今はオンプレなら RAIDになっているエンタープライズレベルの外部ストレージを使うし、クラウドならストレージは元々 RAIDになっているしで、ソフトウェア RAIDを作るなんて 10年以上前に安っすい RAIDになっていない外部ストレージを導入して以来でした。

でも考え方は当時のそれ(HP-UXだった)と全く同じでしたので、根っこの技術は同じものなのでしょう。

「もうソフト RAIDなど…」と思っていましたが、最新のパブリッククラウドで要件が復活するなんて思いもしませんでしたね。

Linux環境では、一旦 PV/VG/LV という観念を理解してしまえば、ソフト RAIDの構築は簡単でした。
あ、RAIDそのものの仕組みの理解は前提になっていますので、念の為。

しかし Linuxもフリーなのにここまで機能があるとは大したものと思いますね。