1PB超のシングルボリュームを作る


大容量ストレージの構築の相談を頂く事が増えてきた。
Seagateのハードウェアを使ってLinuxで構築してみる。

環境
Seagate EXOS CORVAULT 4U106 RAID
Supermicro SYS-1029P-WT
OS: Ubuntu20

1, Storage設定
2, Multipath設定
3, LVMの設定

1, ストレージ側の設定

設定自体はかなり簡単で、ブラウザから管理画面に入り、マウスでポチポチと進むだけ。
あらかじめサーバーとSASでつないでおけば、InitiatorとしてHBAが認識される。
ストレージの構成は容量重視、性能重視、マニュアル(コマンド)から選択。

今回は容量重視で。
011.PNG
これで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/mpathe /dev/mapper/mpathf /dev/mapper/mpathg /dev/mapper/mpathh /dev/mapper/mpathi /dev/mapper/mpathj /dev/mapper/mpathk /dev/mapper/mpathl /dev/mapper/mpathm /dev/mapper/mpathn /dev/mapper/mpatho /dev/mapper/mpathp /dev/mapper/mpathq /dev/mapper/mpathr /dev/mapper/mpaths /dev/mapper/mpatht 
  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/mpathe /dev/mapper/mpathf /dev/mapper/mpathg /dev/mapper/mpathh /dev/mapper/mpathi /dev/mapper/mpathj /dev/mapper/mpathk /dev/mapper/mpathl /dev/mapper/mpathm /dev/mapper/mpathn /dev/mapper/mpatho /dev/mapper/mpathp /dev/mapper/mpathq /dev/mapper/mpathr /dev/mapper/mpaths /dev/mapper/mpatht 
  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秒くらいはアクセス止まるけど、マルチパス効果で復活しました。


という事で、意外とすんなりとペタバイトクラスのストレージが構築できました。

ここからパラメータやらテストやら深みにはまっていくのか、いかないのか。。
色々なアクセスパターンで、性能や疑似不具合で挙動が変わるかも、追記していきます。
(しないかもしれませんが。)