mdadm と LVM で作る、全手動 BeyondRAID もどき

自宅のファイルサーバをリプレースしていて、冗長性と拡張性を兼ね備えるべく色々試行錯誤したらいい感じになったのでそのまとめです。

ファイルサーバの容量拡張、困ってませんか?

自宅でファイルサーバを運用してるんですが、以下の 2 点をいい感じで満たそうとして大体悩みます。

  1. 冗長性の確保
  2. 拡張性の確保

どちらも RAID5 にすれば何とかなるっちゃーなるんですが、HDDベイを使い切った後で容量を増やすのが大変です。
例えば搭載できるHDDの数が 4 台で場合に全てを RAID5 にしていたら、そこから容量増やすとなると 4 台全ての容量を上げないといけません。 お財布的に優しくなさすぎるので、せめて2台換装したら容量増えるとかにしたい!

そんなアタナに Drobo が(※

そんな悩みを解決してくれる製品が世の中には既にあります。
有名なのは

Drobo 5N NAS SATA 3.5インチ 5ベイ ホットスワップ / Beyond RAID DR-5NSTD

Drobo 5N NAS SATA 3.5インチ 5ベイ ホットスワップ / Beyond RAID DR-5NSTD

とかですね。
容量が全く違うHDDを組み合わせれる上に冗長性を確保してくれるという優れものです。
容量が足りなくなったら一番容量の小さなディスクを交換すればOKという簡潔っぷり。

ただし値段がお高い・・・!

ですよねー、という感じで、箱だけでも結構いい値段(6諭吉以上)します。
HP の Microserver が 1.5諭吉とかで買えてしまう事を知っていると、なかなかお財布の紐を緩ませることができません。

しかーし、ありがたい事に Drobo で使われてる技術(Beyond RAID)の概要は公開されてます!

Beyond RAID とは

以下が概要です。

http://en.wikipedia.org/wiki/Drobo#BeyondRAID

ざっくり言うと、RAID1 か RAID5 でHDDを横断する領域をいくつか作って、その領域をまとめあげる事で大容量のストレージを作る感じですね。
これのイケてる点は HDD が 1 台消えても大丈夫な上に、状況によっては HDD を 1 台交換するだけでストレージの容量がアップすること。
最低 2 台の HDD を大容量の物に交換すれば確実に容量が増えます。
ココらへんの管理を全自動でいい感じにこなしてくれる上にホットスワップもできるとくれば、そりゃ Drobo は高いですよね。
非常によく出来てらっしゃる、めっちゃ欲しい。

しかーし、RAID 周りは mdadm でOKだし、領域をまとめのは LVM で行けますね。
ということは、頑張れば全手動 Beyond RAID が作れるのでは!

というわけで作ってみました

世の中には似たような事を考える方がいるもので、先人がいました!
参考) nakanote blog UbuntuでDrobo風なNASを作る
この手順を参考にさせて頂きつつ、自分の環境やらに合わせたものを書いておきます。

結果だけ先に書くと、容量が 4 TB 程で速度が 180MB/sec 程度出るストレージができました。
トリッキーな構成だけど悪くない速度です。

環境とか

マシン HDD OS
HP ProLiant Microserver N54L WD20EARX * 3 Debian 7.0

※) OS は USB メモリにインストール
※) /dev/sda から /dev/sdc までに WD20EARX が刺さってます

領域ごとの容量設定

本来の Beyond RAID はサイズが異なるディスクをいかようにも組み合わせれるのがメリットですが、自分の環境で考えるとそこまで煩雑にHDDを追加したりしません。
追加するとしてもHDDごとに 1TB は増やすと思うので、各領域のサイズは 1 TB で良さそうです。
あと、RAID を組む際にセクタ数がずれてると面倒なので、今回は各パーティションをセクタ数単位で管理します。

1,000,000,000,000B(1 TiB ではなく 1 TB) / 512B = 1,953,125,000s

また、AFTのからみで 2048 で割り切れるセクタ数じゃないと後続のパーティションのアライメントがずれるので、その調整もします。
最近はアライメントがずれてると parted が警告してくれるので助かりますね。

1,953,125,000s より大きくて、2,048 で割り切れる最小のセクタ数
----
1,953,126,400s

というわけで、1 パーティションあたり 1,953,126,400s にします。
WD20EARX は 2 TB なので、HDDごとに 2 つのパーティションを作ります。

必要なソフトのインストール

パーティションを設定するための parted、後はソフトウェア RAID の mdadm と LVM を入れます。

# apt-get install parted mdadm lvm2

各ディスクの準備

/dev/sda から /dev/sdc まで、以下の様な感じでパーティションを設定します。

# parted /dev/sda
(parted) mklabel gpt
(parted) mkpart                                                           
---
Partition name?  []? md0
File system type?  [ext2]?                                                
Start? 2048s
End? 1953128447s
---
(parted) mkpart                                                           
---
Partition name?  []? md1                                                  
File system type?  [ext2]?                                                
Start? 1953128448s
End? 3906254847s

RAID アレイの作成

パーティションが切り終わったら、次に各パーティションをまとめて RAID5 な領域を複数作ります。

# mdadm --create --assume-clean /dev/md0 --level=5 --metadata=1.2 --raid-devices=3 /dev/sda1 /dev/sdb1 /dev/sdc1
# mdadm --create --assume-clean /dev/md1 --level=5 --metadata=1.2 --raid-devices=3 /dev/sda2 /dev/sdb2 /dev/sdc2

これで 2TB * 2 で計 4 TB の領域ができました。

LVM の設定

/dev/md0 と /dev/md1 を PV にして、それらを集めた VG を作り、そこから LV を作ります。

# pvcreate -M2 /dev/md0 
# pvcreate -M2 /dev/md1
# vgcreate storage /dev/md0 /dev/md1
# lvcreate -l 100%FREE storage

ファイルシステムの作成

そろそろ ext4 でいい気がするので ext4 でフォーマット。
/ にするわけじゃないので、スーパーユーザ用の予約領域は 0 にします。

# mkfs.ext4 -m 0 /dev/storage/lvol0

自動マウントの設定

まずは作成した LV の uuid を確認します。

# tune2fs -l /dev/storage/lvol0
....
Filesystem UUID:          ef5ba377-2f9c-47cf-8cb7-29e936f2806a
....

あとは /etc/fstab で自動的にマウントされるようにしたらOKです。

# vi /etc/fstab
....
UUID=ef5ba377-2f9c-47cf-8cb7-29e936f2806a /storage ext4 defaults 0 2
....

簡単な速度計測結果

hdparm でベンチマーク取ってみます。

# hdparm -tT /dev/storage/lvol0 

/dev/storage/lvol0:
 Timing cached reads:   3238 MB in  2.00 seconds = 1618.80 MB/sec
 Timing buffered disk reads: 554 MB in  3.00 seconds = 184.42 MB/sec

基本的に GbE 経由でアクセスするので十分な感じです。

容量を増設する場合

以下のような感じで増設ができます。

  1. HDD ベイが埋まるまでは RAID5 の領域にパーティションを追加する
    1. md 側の領域を増やす (mdadm --add と mdadm --grow)
    2. PV をリサイズする (pvresize)
    3. LV をリサイズする (lvextend)
    4. ファイルシステム側を増やす (resize2fs)
  2. HDD ベイが埋まったら HDD を換装する
    1. HDDを容量増やした物に換装する (既存の RAID5 領域が degraded に)
    2. 1 TB ごとのパーティションを作成する (parted)
    3. a で degraded になった RAID5 に b で作ったパーティションを割り当てる (mdadm --add、 mdadm --grow)
    4. b で作ったパーティションで RAID1 が新たに組める場合、組んでから LV に追加する (mdadm --create、pvcreate、vgextend、lvextend、resize2fs)
    5. b で作ったパーティションで既存の RAID1 を RAID5 に変更出来る場合は変更する (mdadm --grow と pvresize、lvextend、resize2fs)

まとめ

全手動とはいえそこまで面倒じゃないし、いい感じで使えそうです!
結構トリッキーな構成なので速度も遅いかなーと思ったんですが、実用上問題ない速度でますし。

今回このファイルサーバを作るにあたって、HP ProLiant ML115 G1 から HP ProLiant Microserver N54L に乗り換えたんですが N54L は良いですねー!
小さいし、HDDの交換しやすいし、デフォでもファンが静かだし、CPUもそこそこ回るし。
一番新しい HP ProLiant Microserver Gen8 が一気に値段上がったのが悲しいですが、このシリーズは末永く続いて欲しいところです。