UNRAIDを試してみた

Linus Tech Tips (https://www.youtube.com/user/LinusTechTips/) でも紹介されていた UNRAID を試してみた。 

unraid.net

 

UNRAIDはよくある FreeBSD 型のソフトウェアRAIDNASアプリアンスだが、従来のものとは異なる独自路線を貫いている。

一言で言うと、「一日のデータ処理量はHDD一個に収まるぐらいだが、総データ量はバックアップが億劫になるぐらい大量にあって、且つデータロスは最低限に抑えたい」というニッチなものだ。

製品はUSBメモリにファイルを展開する方式で、30日間の機能無制限体験版 (要インターネット接続)が付いてくる。トライアル期間後は要ライセンス購入。

UNRAIDは RAID3 や RAID4 のようなパリティドライブ固定式のソフトウェアRAID方式だが「データをストライプしない」という特徴がある。

RAIDにおいてパリティのデータは他のドライブ上の情報を XOR 演算する等で求められるが、パリティ計算だけについて考えれば各ドライブ内のファイルシステムはまったく関係が無いわけだ。

極端なことを言うと 4台HDD構成で HDD1 を NTFS、HDD2 を exFAT、HDD3 を ext4 にしてもパリティは問題なく計算ができ (実際にUNRAIDがサポートするのは xfs, btrfs, reiserfs)、HDDロスト時にも残存ドライブの情報を元に欠損したHDDの情報を逆算できる。

RAIDの場合はデータをストライプすることによってパフォーマンス向上を狙うが、パリティドライブ数+1のHDD欠損で全データをロストする。UNRAIDでは各データドライブは通常のファイルシステムのまま運用されるので、複数のHDDが欠損しても残存HDD上のデータは専用の復旧ソフトの必要もなしに復元できる。必要なのは対象ファイルシステムに対応したLinux の Live Boot メディアだけだ。

尚、従来のRAID5/6ではパフォーマンス高速化のために以下のような最適化がとられているが UNRAIDはこれらの最適化を悉く外してきている。

従来のRAID5の最適化:

  • データストライプによる複数HDDの同時利用によるパフォーマンス高速化
    → ただしデータロストの危険性あり
  • パリティドライブ非固定によるHDD消耗の均等化
    → ただしHDD複数台同時故障の危険性あり
  • 一斉書き込みによる書き込み操作の単純化

 UNRAIDでの状態:

  • データをストライプしないので複数HDD同時欠損でも完全データロストしない(ただし1デバイス分の帯域しか使えないので転送速度が遅い)
    → 全ドライブ同時書込みをしないのでHDDの回転モーター同調の問題が発生しにくく、NASグレードのHDDを必ずとも必要としない(私見
  • パリティドライブが固定なのでパリティドライブが消耗しやすく、故障の予測が立てやすい
  • パリティ書込み時に他のドライブの内容を読み取ってからパリティ計算するので処理に二手間かかって遅い

UNRAID の問題だが、RAIDのパフォーマンス最適化を悉く外してきているためとんでもなく書き込み処理が遅いこと(特にパリティ計算による2重レイテンシーが致命的)だ。

そこでUNRAIDのパフォーマンスに関わってくるのがキャッシュドライブという名のワークエリアだ。キャッシュドライブはxfs / btrfs (2台でRAID1をする場合は btrfsのみ)でフォーマットされた作業エリアで、通常UNRAIDはキャッシュドライブに変更分のデータを書き込み、夜間にまとめてUNRAIDアレイに反映するという方式をとる。言ってみれば ソフトウェアRAID1から自動バックアップできる高可読性ソフトウェアRAID5/6がセットになっているわけだ。

一日の作業量がキャッシュドライブの容量に収まるのであれば読み書きは極めて速い。10GBe 等にも対応しているので適切に構築されたUNRAIDサーバであれば動画編集にもまったく問題なく対応ができるレベルだ。

UNRAIDでは分散構造のファイル階層を採用しており、キャッシュドライブと各HDDの中を横断したファイル階層をもっている。もし HDD1 に /share/backup/file1.txt というファイルがあり、HDD2 に /share/backup/file2.txt というファイルがある場合、外から見ると一つのフォルダに双方のファイルがあるように見える。

各HDDにファイルが書き込まれる時にはネットワーク共有毎に設定できる三つの分散アルゴリズムのうちの一つが使用される。

  • High-Water: 水槽から溢れた水が隣の水槽に注ぎ込むイメージ。HDD1を50%まで使い、HDD2を50%まで使い、全部50%まで貯めたらHDD1を75%まで貯める、という方式
  • Most-Free: 空き領域が一番多いHDDに配置
  • Fill-up: HDD1から順番に配置し、一杯になったら次のHDDに移動

UNRAIDアレイ上のフォルダ構造の分割はファイルの書き込み毎に行われるが、一度ファイルの書き込みが始まると対象HDDは固定になる。最初に0バイトファイルを作成した後でファイルを拡張し、対象HDDの空き領域を超えるデータ書き込みを行うと「容量不足エラー」になるのだ。同じファイルを2度目に書き込むと別HDDに配置されるので問題回避できるが同様の問題はキャッシュドライブ側でも発生する(キャッシュドライブの容量を超過する書き込みは自動的にUNRAIDアレイに直書きになる)。サーバ間引っ越しでデータを大量に書き込んでキャッシュドライブ容量を超過すると一時的に容量不足エラーで爆死する(再実行で直る)。

※ キャッシュドライブの容量内で運用している場合はUNRAIDアレイに変更を反映する時点でファイルサイズが固定化しているためこの問題は発生しない。

 

尚、UNRAID は FreeBSD系のNASソフトウェアであり、当然のように同系統のSMBの制限によって制約される。ファイル名 255バイト制限だ。

UNRAID の対応ファイルシステムは xfs (最大ファイル名 255バイト)、btrfs (255バイト), reiserfs (4Kバイト) と長いファイル名に対応している reiserfs にも対応しているが、これは以前のバージョンとの下位互換性のために用意されているだけで reiserfs を使うことによってファイル名長の制限を回避することはできない(推奨は xfs)。

という感じで通常のNASユーザーには使いづらいことだらけだが、PBクラスのストレージ容量を扱って 且つRAID破損によるデータロストを避けたいのでれば十分に検討しても良いものだ。ライセンス価格は接続HDD数ごとに分かれているが、大量HDDでも価格は安い。

unraid.net

 

ネットワーク回りではUNRAID は FreeBSDと同様に マルチギガ (10GBe+) 等に対応しており、複数NICの場合は bonding モード (複数NICのロードバランス)とbridge モード (子ネットワークノードからの通信が親ノードに流れる)に対応しており、NASに接続した 10GBe 側から通常の Gigabit ネットワークに通信を流すような運用も可能だ (DHCPが通過するかは未確認)。

また、Dockerや仮想マシンの実行機能も備えており、夜間処理用にハイパフォーマンスCPUを備えても、処理能力は無駄にはならない(コミュニティアプリストアからパッケージの導入も可能)。

尚、筆者は低消費電力CPUのオンボードSATAで手軽にホームNAS、と考えて Athlon 3000G (2C4T、35W TDP) でシステム構築したがUNRAIDアレイ直書き時のスループットが 40MB/秒で最初のサーバ間コピーが長すぎて泣く泣く 2720A SGL を購入して Windows Server運用に切り替えた。