大容量ストレージの構築の相談を頂く事が増えてきた。
Seagateのハードウェアを使ってLinuxで構築してみる。
環境
Seagate EXOS CORVAULT 4U106 RAID
Supermicro SYS-1029P-WT
OS: Ubuntu20
1, Storage設定
2, Multipath設定
3, LVMの設定
#1, ストレージ側の設定
設定自体はかなり簡単で、ブラウザから管理画面に入り、マウスでポチポチと進むだけ。
あらかじめサーバーとSASでつないでおけば、InitiatorとしてHBAが認識される。
ストレージの構成は容量重視、性能重視、マニュアル(コマンド)から選択。
今回は容量重視で。
これで1.6PB分のストレージが16個の論理ボリュームに分割されてサーバーにアタッチされます。(Default)
データ保護は、53個の18TB HDDをRAID ADAPTと言うRAID6の進化版のアレイで構築。
RAID ADAPTはホットスペアをドライブ単位では無く分散配置する事で再構築を高速化するというもの。
DDNとかNetAppも同様の仕組みを採用してますね。
MegaRAIDでは出来ない仕組み。
とにかく、超大容量向きのRAIDって事。
#2,Multipathの設定
Multipathコマンドが通っているか確認。
# multipath -h
multipath-tools v0.8.3 (10/02, 2019)
Usage:
multipath [-v level] [-B|-d|-i|-q|-r] [-b file] [-p policy] [device]
multipath [-v level] [-R retries] -f device
multipath [-v level] [-R retries] -F
multipath [-v level] [-l|-ll] [device]
multipath [-v level] [-a|-w] device
multipath [-v level] -W
multipath [-v level] [-i] [-c|-C] device
multipath [-v level] [-i] [-u|-U]
multipath [-h|-t|-T]
/etc/multipath.confを編集
# vi /etc/multipath.conf
記述内容
defaults {
user_friendly_names yes
find_multipaths yes
}
blacklist {
}
friendly_namesがnoだと見えるデバイス名がやたら長くて非常に管理しづらくなります。
またデフォルトではRoud robinになっているので別の方式が良い場合は指定します。
例:path_selector "service-time 0"
以下Redhatのサイトからコピペ。
round-robin 0: パスグループ内のすべてのパスをループスルーを実行し、それぞれに同量の I/O を送ります。
queue-length 0: 未処理の I/O 要求数が最も少ないパスに、次の I/O 群を送ります。
service-time 0: 各パスに対する未処理の I/O 全体のサイズを相対スループットで割ることによって求められるサービス時間が最も短いパスに、次の I/O 群を送ります。
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/dm_multipath/config_file_multipath
dry runというのをやっておいた方がデバイスの見え方が綺麗になるようです。(後から知った)
# multipath -v2 -d
ここでmultipathサービスを起動します。
# systemctl enable multipathd.service
# systemctl start multipathd.service
# systemctl status multipathd.service
そしてデバイスが見えている事を確認。
16個分のデバイスが見えてます。
ここで、/dev/mapper以下を見ることが肝心です!
lsblkとかで見ると32個分出てきちゃいます。
# ls /dev/mapper/mpath
mpathe mpathg mpathi mpathk mpathm mpatho mpathq mpaths
mpathf mpathh mpathj mpathl mpathn mpathp mpathr mpatht
(普通はmpathaから始まるのですが、ガチャガチャとやっていたらmpatheまで行ってしまった。。。)
#3,LVMの設定
16個見えた論理ボリュームをLVMでおまとめします。
まずは各ドライブをlvm用に設定
# pvcreate /dev/mapper/mpath[e-t]
Physical volume "/dev/mapper/mpathe" successfully created.
Physical volume "/dev/mapper/mpathf" successfully created.
Physical volume "/dev/mapper/mpathg" successfully created.
Physical volume "/dev/mapper/mpathh" successfully created.
Physical volume "/dev/mapper/mpathi" successfully created.
Physical volume "/dev/mapper/mpathj" successfully created.
Physical volume "/dev/mapper/mpathk" successfully created.
Physical volume "/dev/mapper/mpathl" successfully created.
Physical volume "/dev/mapper/mpathm" successfully created.
Physical volume "/dev/mapper/mpathn" successfully created.
Physical volume "/dev/mapper/mpatho" successfully created.
Physical volume "/dev/mapper/mpathp" successfully created.
Physical volume "/dev/mapper/mpathq" successfully created.
Physical volume "/dev/mapper/mpathr" successfully created.
Physical volume "/dev/mapper/mpaths" successfully created.
Physical volume "/dev/mapper/mpatht" successfully created.
設定確認(16個ある)
# pvs
PV VG Fmt Attr PSize PFree
/dev/mapper/mpathe lvm2 --- 92.67t 92.67t
/dev/mapper/mpathf lvm2 --- 92.67t 92.67t
/dev/mapper/mpathg lvm2 --- 92.67t 92.67t
/dev/mapper/mpathh lvm2 --- 92.67t 92.67t
/dev/mapper/mpathi lvm2 --- 92.67t 92.67t
/dev/mapper/mpathj lvm2 --- 92.67t 92.67t
/dev/mapper/mpathk lvm2 --- 92.67t 92.67t
/dev/mapper/mpathl lvm2 --- 92.67t 92.67t
/dev/mapper/mpathm lvm2 --- 92.67t 92.67t
/dev/mapper/mpathn lvm2 --- 92.67t 92.67t
/dev/mapper/mpatho lvm2 --- 92.67t 92.67t
/dev/mapper/mpathp lvm2 --- 92.67t 92.67t
/dev/mapper/mpathq lvm2 --- 92.67t 92.67t
/dev/mapper/mpathr lvm2 --- 92.67t 92.67t
/dev/mapper/mpaths lvm2 --- 92.67t 92.67t
/dev/mapper/mpatht lvm2 --- 92.67t 92.67t
次にボリュームグループvg01を上のドライブ達を使って設定
# vgcreate vg01 /dev/mapper/mpath[e-t]
Volume group "vg01" successfully created
設定確認。 1.45pと出てますね。1.6PBではない謎。
# vgs
VG #PV #LV #SN Attr VSize VFree
vg01 16 0 0 wz--n- <1.45p <1.45p
論理ボリュームlv01を作成。
# lvcreate -n lv01 -l 100%FREE vg01
WARNING: xfs signature detected on /dev/vg01/lv01 at offset 0. Wipe it? [y/n]: y
Wiping xfs signature on /dev/vg01/lv01.
Logical volume "lv01" created.
確認。 出来てる。
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv01 vg01 -wi-a----- <1.45p
XFSでフォーマットします。
# mkfs -t xfs /dev/vg01/lv01
meta-data=/dev/vg01/lv01 isize=512 agcount=1483, agsize=268435455 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=398022656000, imaxpct=1
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=521728, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
マウントしてdfで確認
1.7PBと出る謎。
# mount /dev/mapper/vg01-lv01 /data
# df -H
Filesystem Size Used Avail Use% Mounted on
udev 50G 0 50G 0% /dev
tmpfs 10G 2.9M 10G 1% /run
/dev/sda5 491G 21G 446G 5% /
tmpfs 50G 0 50G 0% /dev/shm
tmpfs 5.3M 0 5.3M 0% /run/lock
tmpfs 50G 0 50G 0% /sys/fs/cgroup
/dev/sda1 536M 4.1k 536M 1% /boot/efi
tmpfs 10G 25k 10G 1% /run/user/1000
/dev/mapper/vg01-lv01 1.7P 12T 1.7P 1% /data
vdbenchでベンチマーク。
4GB/sの性能はケーブル、HBAのポート的に限界まで出ていると見て良さそうですね。
途中、走らせながらケーブル1本引っこ抜いてみる。
#vdbench -f test.prm (1MB 8sd/8wd/32Threads)
Dec 09, 2021 interval i/o MB/sec bytes read resp read write read write resp queue cpu% cpu%
rate 1024**2 i/o pct time resp resp max max stddev depth sys+u sys
14:53:12.043 1 3311.0 3311.00 1048576 100.00 55.020 55.020 0.000 166.92 0.00 52068.813 -3278057879.4 11.0 1.6
14:53:13.009 2 4235.0 4235.00 1048576 100.00 59.444 59.444 0.000 95.04 0.00 12.653 251.8 3.8 1.0
14:53:14.009 3 4301.0 4301.00 1048576 100.00 58.918 58.918 0.000 205.46 0.00 18.955 256.1 1.3 0.8
14:53:15.006 4 4303.0 4303.00 1048576 100.00 60.059 60.059 0.000 190.53 0.00 16.070 255.8 1.7 0.8
14:53:16.006 5 4312.0 4312.00 1048576 100.00 59.175 59.175 0.000 200.28 0.00 19.841 256.0 1.4 0.8
14:53:17.010 6 4312.0 4312.00 1048576 100.00 59.405 59.405 0.000 192.62 0.00 17.295 256.1 1.3 0.6
14:53:18.005 7 4305.0 4305.00 1048576 100.00 59.557 59.557 0.000 160.63 0.00 14.738 255.8 2.1 0.9
14:53:19.006 8 3907.0 3907.00 1048576 100.00 59.479 59.479 0.000 145.62 0.00 12.096 256.1 1.2 0.7
14:53:20.005 9 0.0 0.00 0 0.00 0.000 0.000 0.000 0.00 0.00 0.000 255.8 0.6 0.0 << Cable remove
14:53:21.006 10 0.0 0.00 0 0.00 0.000 0.000 0.000 0.00 0.00 0.000 256.1 0.6 0.1 << Cable remove
14:53:22.005 11 0.0 0.00 0 0.00 0.000 0.000 0.000 0.00 0.00 0.000 256.1 1.1 0.1 << Cable remove
14:53:23.004 12 0.0 0.00 0 0.00 0.000 0.000 0.000 0.00 0.00 0.000 255.8 0.3 0.1 << Cable remove
14:53:24.005 13 1365.0 1365.00 1048576 100.00 955.051 955.051 0.000 4964.63 0.00 1866.594 256.1 1.8 0.8
14:53:25.005 14 4204.0 4204.00 1048576 100.00 60.851 60.851 0.000 146.24 0.00 15.627 256.0 2.1 1.0
14:53:26.005 15 4204.0 4204.00 1048576 100.00 60.953 60.953 0.000 121.51 0.00 14.779 256.0 2.2 1.3
14:53:27.005 16 4198.0 4198.00 1048576 100.00 60.927 60.927 0.000 128.49 0.00 16.048 255.8 2.8 1.7
14:53:28.004 17 4213.0 4213.00 1048576 100.00 60.728 60.728 0.000 130.68 0.00 17.277 256.0 2.8 1.5
^CCTRL-C requested. Vdbench terminating
5秒くらいはアクセス止まるけど、マルチパス効果で復活しました。
という事で、意外とすんなりとペタバイトクラスのストレージが構築できました。
ここからパラメータやらテストやら深みにはまっていくのか、いかないのか。。
色々なアクセスパターンで、性能や疑似不具合で挙動が変わるかも、追記していきます。
(しないかもしれませんが。)