GEOM STRIPE (ストライプ/RAID0) を使ってみる

GEOM

今回は GEOM によるディスクのストライピング (RAID0) について纏めてみたいと思います.
ストライピングは複数のディスクを分散して読み書き利用する技術で,大きなディスク領域の確保,読み書き速度の向上を図る技術です.

GEOM STRIPE のイメージ

ストライピングのイメージはこのような形です.ディスクが2本の場合,3本の場合を表しています.

GEOM STRIPE の利用・管理

GEOM STRIPE は gstripe というコマンドを通じて利用・管理を行います.簡単に触れますが,詳細はコマンドのオプションの詳細は FreeBSD の マニュアル「gstripe」を見てください.

# gstripe
usage: gstripe clear [-v] prov ...
       gstripe create [-v] [-s stripesize] name prov prov ...
       gstripe destroy [-fv] name ...
       gstripe dump prov ...
       gstripe label [-hv] [-s stripesize] name prov prov ...
       gstripe stop [-fv] name ...
       gstripe help
       gstripe list [-a] [name ...]
       gstripe status [-ags] [name ...]
       gstripe load [-v]
       gstripe unload [-v]

GEOM 関連のコマンドは gconcat の際にも触れましたが createlabel の両方があり分かりづらいのですが,create は一時的,label は恒久的と覚えるのがよいです.

create で作った場合はどうなるのか?


create で作成してマウント,再起動を行うとどのようになるのかを以下に一連の流れを記載します.

gstripe create コマンドで ディスク da1 と da2 をストライピングして stripe0 を作成します.

# gstripe create stripe0 da1 da2

gstripe createlabel コマンドを実行するとカーネルモジュールが自動的にロードされます.

root@bsd13:/ # kldstat
Id Refs Address                Size Name
 1   10 0xffffffff80200000  1f3e2d0 kernel
 3    1 0xffffffff82319000     3218 intpm.ko
 4    1 0xffffffff8231d000     2180 smbus.ko
 5    1 0xffffffff82320000     7490 vmci.ko
 6    1 0xffffffff82328000     44a0 geom_stripe.ko

ですが,再起動時に必ず有効になるように明示的にロードさせる事をお勧めします.

# cat /boot/loader.conf
geom_stripe_load="YES"

gstripe status コマンドでステータスを表示できます.
以下は stripe0 のステータスです.da1, da2 がコンポーネントとして含まれており,ステータスがアップの状態です.

# gstripe status
          Name  Status  Components
stripe/stripe0      UP  da1
                        da2

gstripe list コマンドで詳細を表示する事ができます.
da1, da2 が 100GB のディスクでこれを RAID0 でストライピングしている為,stripe0 は 200G となっています.

# gstripe list
Geom name: stripe0
State: UP
Status: Total=2, Online=2
Type: MANUAL
Stripesize: 65536
ID: 2870193427
Providers:
1. Name: stripe/stripe0
   Mediasize: 214748364800 (200G)
   Sectorsize: 512
   Stripesize: 65536
   Stripeoffset: 0
   Mode: r0w0e0
Consumers:
1. Name: da1
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r0w0e0
   Number: 0
2. Name: da2
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r0w0e0
   Number: 1

newfs でファイルシステムを作成します.指定するデバイスは GEOM STRIPE の場合は /dev/stripe 以下に指定した名前のデバイスファイルが作成されますので,これを指定します.
今回は create の際に stripe0 を名前としたため,/dev/stripe/stripe0 がデバイスファイルとなります.

# newfs /dev/stripe/stripe0
/dev/stripe/stripe0: 204800.0MB (419430400 sectors) block size 32768, fragment size 4096
        using 328 cylinder groups of 625.22MB, 20007 blks, 80128 inodes.
super-block backups (for fsck_ffs -b #) at:
 192, 1280640, 2561088, 3841536, 5121984, 6402432, 7682880, 8963328, 10243776, 11524224, 12804672, 14085120, 15365568,
 16646016, 17926464, 19206912, 20487360, 21767808, 23048256, 24328704, 25609152, 26889600, 28170048, 29450496, 30730944,
 32011392, 33291840, 34572288, 35852736, 37133184, 38413632, 39694080, 40974528, 42254976, 43535424, 44815872, 46096320,
....

マウントおよびマウントの結果です./mnt にマウントをしています.
これを /etc/fstab に記載した状態で再起動を行ってみます.

# mount /dev/stripe/stripe0 /mnt

# df
Filesystem          1K-blocks    Used     Avail Capacity  Mounted on
/dev/da0p2           19279260 2582452  15154468    15%    /
devfs                       1       1         0   100%    /dev
/dev/stripe/stripe0 203123608       8 186873712     0%    /mnt

# cat /etc/fstab
# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/da0p2      /               ufs     rw      1       1
/dev/da0p3      none            swap    sw      0       0
/dev/stripe/stripe0     /mnt    ufs     rw      1       1

残念な事に (想定どおりです),デバイスが無く起動途中に失敗してしまっています.
これは create で作成した為,ディスクに GEOM STRIPE の情報が記録されてい為作成したデバイスが存在しておらず,この状態となります.

恒久的に使う場合は label を利用しよう

先ほどと変わって create ではなく label で stripe0 を作成しました.

# gstripe label stripe0 da1 da2

同じディスクを同じように指定している為,status および list の結果は先ほどと変わりません.
また,create で作成した際に newfs していますが,再作成の際にディスク連結順番に変更を入れていませんのでファイルシステムとしては正しく生成された状態となっていますのでこのままマウントさせる事も可能です.

# gstripe status stripe0
          Name  Status  Components
stripe/stripe0      UP  da1
                        da2

# gstripe list stripe0
Geom name: stripe0
State: UP
Status: Total=2, Online=2
Type: AUTOMATIC
Stripesize: 65536
ID: 2858675290
Providers:
1. Name: stripe/stripe0
   Mediasize: 214748233728 (200G)
   Sectorsize: 512
   Stripesize: 65536
   Stripeoffset: 0
   Mode: r1w1e1
Consumers:
1. Name: da1
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r1w1e2
   Number: 0
2. Name: da2
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r1w1e2
   Number: 1

ですので,createlabel を間違った… という場合でも正しくコマンドを発行してあげる事で今までの状態を復元できますので,データがなくなってしまった.という事は起きませんので安心してください.
いずれにせよ… label で作成しましょう.が教訓となりますが…

# mount /dev/stripe/stripe0 /mnt

# df
Filesystem          1K-blocks    Used     Avail Capacity  Mounted on
/dev/da0p2           19279260 2582484  15154436    15%    /
devfs                       1       1         0   100%    /dev
/dev/stripe/stripe0 203123608       8 186873712     0%    /mnt

IOについて確認してみる

コンカチと違い RAID0 でのストライピングですので分散して書き込みが行われます.実際にどの様な IO が発生しているのかを確認してみます.

dd でランダムデータを生成,random.img としてファイル書き込みの IO を発生させました.
見て頂くと分かる通り da1 と da2 の両方に IO がかかっています.
このことから,分散してのディスクの読み書きが行われる事が分かります.

# dd if=/dev/random of=/mnt/random.img

# iostat 2
       tty             da0              da1              da2             cpu
 tin  tout KB/t  tps  MB/s  KB/t  tps  MB/s  KB/t  tps  MB/s  us ni sy in id
   1    89 18.3    5   0.1  60.0   10   0.6  61.6   10   0.6   0  0  1  0 99
   0   228 13.3    1   0.0  62.7  832  50.9  62.1  863  52.4   2  0 38  2 59
   0   163  0.0    0   0.0  64.0   77   4.8  56.9   90   5.0   0  0  4  0 96
   0    80  0.0    0   0.0  64.0  422  26.4  59.6  425  24.7   1  0 21  1 78
   0    73  0.0    0   0.0  61.1  549  32.8  64.0  552  34.5   1  0 25  2 72
   0    83  0.0    0   0.0  60.9  852  50.7  64.0  793  49.5   4  0 37  1 58

# ls /mnt
.snap           random.img

イメージとしてはこのような形ですね.

ディスクを拡張する

結論から先に.GEOM STRIPE によるディスクの拡張(追加)は不可能です.
GEOM CONCAT と同様のオペレーションは完了するのですが,growfs した後におかしくなります.
当然ですが,再作成であれば問題ありません.

GEOM STRIPE デバイスを終了 (破壊) する

ファイルシステムとして用済みになった.であったり,別用途に転用する為に初期化したい場合を説明します.

当然ながら,ファイルシステムはアンマウントする必要があります.
また,完全に終了 (停止・破壊) する場合は stop ではなく destroy を利用します.

# umount /mnt
# gstripe destroy stripe0
# gstripe list

もし間違って destory を実行してしまった場合ですが,これだけのオペレーションの場合だとラベル情報がなくなっただけなので,再度 label を同じ引数で渡すことで復活させる事が可能です.
やらかしてしまった… という事案の場合は慌てずにそっと元に戻しましょう.

# gstripe label stripe0 da1 da2
# mount /dev/stripe/stripe0 /mnt
# df
Filesystem          1K-blocks    Used     Avail Capacity  Mounted on
/dev/da0p2           19279260 2582504  15154416    15%    /
devfs                       1       1         0   100%    /dev
/dev/stripe/stripe0 203123480  139048 186734556     0%    /mnt

# ls /mnt
.snap           random.img

以上で GEOM STRIPE によるストライピング (RAID0) のやり方についての解説を終了します.

コメント

タイトルとURLをコピーしました