■はじめに | ||||||||||||||||||||||||||||||||||||
■ストレージ構成再考 | ||||||||||||||||||||||||||||||||||||
こちらのページにまとめたように,現在の内蔵ディスク
の状況は,hdc に接続していた 5A250J0 がディスククラッシュにより交換のやむなきを得て,
現在は WD2500JB に交換したという変更はあるものの,250GB*3の合計750GBの構成に変りは
ありません.そしてこれに対応すべく,バックアップ方法を
こちらのページに記載したように,IEEE1394a で接続した
250GBディスク4本で取るようにしました.しかし,X4HD-1394 を Linux で使用すると何故か
Hot Plug 周りでトラブることがあり,難渋していたのは先のページに記載した通りです. その後, MPEG2 ハードエンコードキャプチャカード が 調子良く Linux で動き, Webベースで容易に録画予約出来るようになった関係で, ディスク使用量やファイルの出入りも半端でなくなりました.そして何とかディスク容量を 増やしたいと考えたものの,Terminator TU のベイ数の制約からこれ以上ディスクを追 加できず,より大容量の物に交換するにしても,400GBのディスクは依然高値安定.そして それよりも何よりも『内蔵ディスク容量を増やす』ということは『バックアップ手段の再検討』 も必要になってきます. そのようなわけで,
と,いう3つのニーズを満たすべくストレージ構成再考を行うことにしました. 実現手段にはいくつかの方法が考えられますが,最も単純なのは『外付けディスクを USB/IEEE1394で数珠繋ぎに沢山接続する』という方法です.しかし,ゴロゴロと机の下に 単体の外付けディスクが転がっているという状況は,想像しただけでゾッと します.ACアダプタがコンセントにタコ足配線になり,少しでも足を少し伸ばしたらディスク を蹴飛ばしてディスクが転倒!そしてクラッシュ!なんてことになりかねません… 改めて今回要求される事柄を具体的に検討しますと,以下のような感じになります.
|
||||||||||||||||||||||||||||||||||||
■Software RAID | ||||||||||||||||||||||||||||||||||||
複数ディスクを使用し,フラットな領域として使用すると共に耐障害性を持たせる方法
としては,RAIDの利用が考えられます.RAIDと言うと,真っ先にエンタープライズ向けの
ハードウエア RAID アレイ,またはストライピング等を行って高速アクセス可能にする
コンシューマ向けのRAIDチップ/カード(*)(RAID1:ミラーが出来るものも大半ですが)が
想像されます.しかし,前者はコスト的に高いために導入が困難で,後者は今回の用途
には向きません.辛うじて手が届く価格帯に,ミドル〜ハイエンドユーザ向けの RAID5
に対応した RAID カードも販売されてはいますが,現在 TU には PCI の空きスロットは
ありません.そのため,この類のカードの導入も選択肢として外れます. (*)この手のチップ/カードは,ドライバ側でソフト的に処理を行うものも 多く,実際には Software RAID と言っても良い物が大半です. ではどういった方法で…と,なるわけですが,Linux には md ドライバというものが 存在し,大抵のディストリビューションでは kernel に内蔵されています.そして md ドライバは特殊なカードを使用せず, ソフト的に RAID アレイを構築できるように なっており,Linux から単体ディスクとして利用できるディスクを束ねて RAID 化する ことが可能になります. RAID に関する詳細な解説は割愛させて頂きますが,今回の用途に使用する場合は RAID5 が最も適切であると考えられます.例えば 250GB のディスク3本でRAID5アレイ を構築した場合,実容量 500GB.4本で構築した場合は 750GB のフラットな空間を確保 することが可能となります.そしてディスクの内容は,冗長化して複数ディスクに分散し て記録されるため(RAID5の場合はパリティも記録される),アレイを構成するディスクが 1本がクラッシュした場合でもそのままサービスは停止しません.そして故障したディスク 1本を交換してリビルドを行うことにより,ディスク上のデータそのままで元の耐障害性を 持った構成に戻すことが出来ます. その他 md ドライバを使用して Software RAID を構築するメリットを列挙しますと, 以下のようになります.
RAID5 を利用する場合は,パリティ計算のために XOR 演算を多用するわけですが,昔は 良好な性能を得るために専用演算チップを用いるのが一般的でした.その 関係もあり, 『Software RAID は実用的なスピードで動作しない』と言われていた時代も あったわけですが,最近は滅茶苦茶とも言えるほど CPU の高速化が行われた関係で, XOR 演算を CPU 側で行ったとしても,実用上問題のないレベルにあると言えます.逆に高速 な CPU を搭載している PC であれば,専用のハードウエアで RAID アレイを構築するよりも 高速で動作する場合もあります. しかし,IDE 接続などで Software RAID を構築した場合,Hardware RAID では一般的 な Hot Swap が利用できません.Hot Swap とは,故障が発生したディスクを, システムの電源を落とすことなく交換可能な機構です.そのため,IDE ベースの Software RAID の場合,ディスクを交換する場合は本体の電源を落とす必要があり,RAID化 していないディスクよりも耐障害性が高いとは言え,無停止システムというわけには行かな くなります. と,まぁ様々なメリット・デメリットがあるわけですが,今回のような用途には Software RAID の導入は非常に魅力的なソリューションと言えます.一方,多少コストを かけても良いので手間を省きたいということであれば,以下のような製品を利用するのも 良いかと思います.
○内蔵用 Hardware IDE RAID
○RAID5に対応した低価格NAS
|
||||||||||||||||||||||||||||||||||||
■IEEE1394a 外付けディスクでSoftware RAID5 | ||||||||||||||||||||||||||||||||||||
さて,具体的な話に戻しますと,今回は複数台のディスクを
USB/IEEE1394a 経由で接続し, Software RAID5 化して運用するという方針
が決まりました.次に行うべきは構成の決定です. まずは使用するディスクですが,低発熱,高信頼性,低価格の3点を考慮し, Western Digital 製の WD2500JB にしました.1台辺りの容量は 250GB です. そして必要台数の試算に移るわけですが,最低限,内蔵ディスクのバックアップ のために3台が必要になります.そして RAID5 化するためには冗長化のために 1台余計に必要になりますので,合計4台です.これで実容量 750GB の RAID アレイが構築可能になります. しかし,今回は『耐障害性を高める』という方針もありますので,1台はスペア ディスクとして用意し,ホットスタンバイ(*2)にすることにしました.これでディス クが故障したことに気が付かずに放置していても,2台目が壊れるまでは冗長性が 確保されます.と,ここまでで合計ディスク数は5台になりました.
(*2)ホットスタンバイ: 次に接続形態ですが,単体の外付けディスクを数珠繋ぎで接続するのは何かと 不便なため,出来るだけ1台のケースにまとめて収納したいと考えたわけですが, この手の製品を調べてみますと,4台内蔵タイプの1つ上のグレードは,8台の ディスクを内蔵するタイプが一般的です.そして接続インターフェイスは USB2.0 のものが少なくなり,IEEE1394a のものばかりです. 具体的な製品としてこのような用途に合致する物を探してみますと, こちらでちらっと触れたように, このような製品 が存在します.先のページでも触れましたが,発売当初は少々トラブルも あったようですが,現在は対策されているだろうと考え,これを導入することにしました. また,リンク先のページでは Century 扱いのものが紹介されていますが,同じ製品 (OEM元が同じでモデルも同じ)である Owltech OWL-EB58P を購入することにしました. OWLTECH 扱いの方を選択したのは,値段と入手性を考えてのことです. と,ここまで読み進めておそらく結末の想像が付いたかと思いますが,結局の所, 『繋がるだけ繋げてしまえ』とばかりに8台接続することにしました.WD2500JB の 価格は 2004/12月の時点で 13,790円になっていたため,新規に6台購入.そしてこれまで 外付けケースに入れて使用していた2台を使い回し,内蔵用の合計8台を用意しました. そして故障時の交換用にということで,後日新たに2台調達しました. また,沢山のドライブを内蔵するため,冷却に関しても何らかの手を打った方が良いと 考え,ケース本体の他に,マウンターとしての機能もある,Lian Li EX-34B も2台購入 して使用することにしました. |
||||||||||||||||||||||||||||||||||||
■IEEE1394a 外付けケース | ||||||||||||||||||||||||||||||||||||
■Owltech OWL-EB58P | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
■Lian Li EX-34B | ||||||||||||||||||||||||||||||||||||
静音化対策を行った Terminator と比較すると流石にうるさく感じますが,所謂マシン ルームに置くような RAID アレイと比較するとその静かさは雲泥の差.一般のデスクトップ PC と比較しても,少しうるさい程度の部類に収まると思います. |
||||||||||||||||||||||||||||||||||||
■SoftRAID化 | ||||||||||||||||||||||||||||||||||||
■SoftRAID化の準備 | ||||||||||||||||||||||||||||||||||||
ディスクを一通り取り付け,PC 本体に IEEE1394a で接続することにより,
単体ディスクとして認識出来るようになります.RAID化の前に内蔵した8台
全てのディスクがきちんと認識されることをまずは確認します. IEEE1394 経由で接続した場合,Linux では SCSI ディスクとして認識される わけですが,USB/IEEE1394/SCSI に他に何も接続していない場合は,内蔵した8台 のディスクは sda 〜 sdh としてデバイス名がアサインされます.物理的にどの ディスクがどの名前にアサインされたか,そしてケース上で対応するアクセスラン プはどれか等,この時点で確認しておくのが良いでしょう. 例えは hdparm -tT /dev/sda を実行すると,sda の速度を計測することが 出来ます.このときにどのディスクが動作しているかを見るわけです. 私の環境では,本体からディジーチェーンで遠い順にsdaから振られていることが 分かりました. 次に SoftRAID 化の準備として,各ディスクをパーティション分けします.fdisk コマンドを使用し,各ディスク上に容量をフルに使用するパーティションで切って いきます(sda1〜sdh1を作成). なお,パーティションIDはデフォルトでは 83(Linux) になりますが,fdisk の t コマンド(領域のシステム ID を変更する)を使用し,fd (Linux raid 自動) にしておいてください.
|
||||||||||||||||||||||||||||||||||||
■SoftRAID化に使用するパッケージ | ||||||||||||||||||||||||||||||||||||
md ドライバを使用した SoftRAID は,Linux のディストリビューションによって
利用できるフロントエンドコマンドが異なり,若干設定方法が異なります.私は
Vine3.1(相当) を使用している関係で,ここでは raidtools を使用して設定する
方法に関して解説することにします, まず,"rpm -qa |grep raid"と実行し, raidtools のパッケージがインストール されていることを確認して下さい.インストールされていない場合はインストールし て下さい.私の環境では,raidtools-1.00.3-8vl2 がインストールされていました.
|
||||||||||||||||||||||||||||||||||||
■/etc/raidtabの設定 | ||||||||||||||||||||||||||||||||||||
md を使用した RAID アレイは,/dev/md? として認識されます.1つのみ RAID
アレイを構築する場合,/dev/md0 となります.そして今回は
という構成のため,/etc/raidtab は以下のように記述しました(各項目の意味が 分かりやすいようにコメントも入れてありますが,これは抜いておいて下さい).
|
||||||||||||||||||||||||||||||||||||
■RAID アレイを構築 | ||||||||||||||||||||||||||||||||||||
mkraid /dev/md0を実行し,上記 /etc/raidtab で指定した構成通りの
RAID アレイを構築します. なお,コマンドを実行すると即リターンされますが,この段階では RAID アレイ の構成が書き込まれて利用できる状態になっているだけであり,実際には『RAIDアレイ』 としては不完全です./prc/mdstatを cat すると分かりますが,この時点では, リビルドをかけている状態と同じになります.そのため,この処理が終わるまでは パフォーマンスが著しく低下します. RAIDアレイの(再)構築終了までの概算時間は /proc/mdstat で確認することが 出来ますが,IEEE1394a 外付けディスクを使用した私の構成では,約24時間もの時間 が必要でした.IDE 接続や SCSI 接続の場合は,数時間で終わると思います. |
||||||||||||||||||||||||||||||||||||
■/dev/md0のフォーマット | ||||||||||||||||||||||||||||||||||||
/dev/md0 は,普通の1台のディスクとして見えます.当然ながらフォーマット
しないと利用できません(ただし,パーティション分けの必要はありません/出来ません). そこで任意のファイルシステム形式でフォーマットを行いましょう.容量が容量ですので ext2 のようなジャーナリングを行わない形式を利用しますと,fsck 等を行わざるを得ない 状況に陥る場合があった際に泣きを見ます.大抵の Linux ディストリビューションの kernel には,ジャーナリングに対応した形式として, ext3 や reiserfs が元々入っています. 使い慣れている ext3 形式でも良かったのですが,Software RAID で利用する場合に パフォーマンスが良く,何かと操作が軽い reiserfs を利用することにしました( mkfs.reiserfs /dev/md0 でフォーマット). ext3 でフォーマットを行うとかなり長時間待たされますが,reiserfs でフォーマットを 行うと,あっという間に終了します.なお,多少速度は落ちますが,RAID アレイの (再)構築中であってもフォーマットは行えますので,平行してフォーマットを行っておいた 方が良いでしょう. |
||||||||||||||||||||||||||||||||||||
■RAID アレイの mount と利用 | ||||||||||||||||||||||||||||||||||||
フォーマットが終わったら,mount して使用してみましょう.適当なディレクトリ
を作成し,mount コマンドでマウントします.なお,mount の実行やファイルの書き込み
等は RAID アレイの(再)構築中であっても問題なく行えます.
特にエラー無く mount され,ファイルの読み書きが出来ていれば,これで Software RAID を用いた RAID アレイの構築は完了です. |
||||||||||||||||||||||||||||||||||||
■運用と障害時の対応 | ||||||||||||||||||||||||||||||||||||
■起動時の自動認識 | ||||||||||||||||||||||||||||||||||||
Vine3.1 の場合,起動時に自動的に md ドライバが立ち上がり,その時点で
Linux のコントロール下に置かれているディスクをチェックし,前述した
『RAID自動認識』になっているパーティションが存在した場合,自動で md? と
して当該 RAID アレイを利用可能にします.この機構は,ディスクが IDE や SCSI
等で接続されていれば問題なく利用できるのですが,USBやIEEE1394接続のような
場合は若干問題が発生します.何故なら,md ドライバが動き始めた時点で RAID
アレイとして設定されているディスクが認識されていないからです. より具体的に説明すると,USB や IEEE1394 接続のディスクを利用するためには, まず USB や IEEE1394 を利用するためのドライバが読み込まれ,デバイスが接続 されたことが認識され,そして接続されたデバイスに対応したドライバが動作する ことによってようやく利用可能になります.しかし,これら一連のシーケンスは, mdドライバが起動した後,遙か彼方でようやく実行されるようになっています. そこでエレガントな対応策ではありませんが,md ドライバが読み込まれる直前で 外付けディスクを利用するために必要なドライバを強引に読み込ませることにしました. 編集を行ったファイルは,/etc/rc.d/rc.sysinit です.
太字で書いた部分を追加します.この変更により,起動時に自動的に『外付け IEEE1394a ディスクを認識→ md ドライバスタート → RAID アレイのスタート』というシーケンスが 実行されるようになります. 難点は,一度 RAID の整合性チェックに行くようになるため,起動シーケンス終了までに 2,3分余計にかかるようになってしまったことでしょうか…. なお,USB 外付けディスクを使用して RAID 化したい場合は,必要モジュールが 異なりますので,適時読み替えて設定を変更するようにしてください. |
||||||||||||||||||||||||||||||||||||
■障害時の自動復旧と障害対応 | ||||||||||||||||||||||||||||||||||||
RAID化することにより『RAIDアレイ』としての耐障害性は高まりますが,ディスク
単体としての信頼性は単体ディスクとして利用した場合と変りません.すなわち,
壊れるときは壊れ,許容台数を超えてディスクがクラッシュした場合は,RAID アレイ
としても崩壊するということです. 明日クラッシュするか,○年後にクラッシュするかは神のみぞ知るですが, いずれはディスクは壊れます.そのときに慌てないために,どう対処したら良いかと いうのを本格運用前に予行演習しておいた方が良いでしょう. 下記の状態は,たまたま何かの拍子にディスクが1台死んだ状態になった ときの様子です.
このように,『sdg1[6](F)』となっており,sdgのディスクがクラッシュしたことが 示されています.そしてホットスペアとして sdh1 を確保していたので,sdg1 の代わり にこの領域が利用され,再構築されている様子が分かります. まずは死んだディスクを RAID アレイから論理的に抜くことにします.
と,このように,故障した sdg ドライブが RAID アレイから抜かれたことが 確認できます.一応補足しておきますと,RAID の再構築が終わるまでは,ホット スペアとして確保されおり,再構築に利用されているディスクは spare 扱いに なります(上記 sdh1). 壊れたディスクを物理的に交換し(再構築中にshutdownしてから電源を落とし, 交換してもかまいません),再構築終了後にもう一度現在の状態を見ると以下の ようになります.なお,以下の表示を行った際には,sdg1 は再度 RAID アレイに 参加させるためにパーティションは既に切ってあります.
sdh1 がスペア扱いではなく,実稼働領域としてアサインされているのが確認 できます. 次に交換した sdg1 を RAID アレイに追加します.
と,このように,sdg1 がスペアディスクとして追加されたことが分かります.
|
||||||||||||||||||||||||||||||||||||
■障害時の対応2 | ||||||||||||||||||||||||||||||||||||
複数の変換基盤を使用していたり,外部配線によるケーブリングの不安要因が
存在する場合,ケーブルがコネクタから脱落し,複数台のディスクが一度に見え
なくなるという事故が発生する可能性があります.このような場合,RAID5では
2台以上のディスクがクラッシュしたのと同じ状態になり,RAID アレイはサービス
を停止します.そして再びケーブルを接続して再起動したとしても,そのままでは
復活することはありません. md ドライバは,(persistent-superblock 設定次第ですが)RAID を構成する ディスクに対し,当該のパーティションはどの RAID アレイに属しているか等の 情報を書き込み,かつ,定期的にステータス情報をアップデートします.この 機構が存在することにより,ディスクの接続順が変り,デバイス名が変更になった 場合でも自動的に調整され,問題なく利用することが出来るわけです.しかし, 上記のような障害を抱えた場合はこの仕組みが徒となり,RAID アレイから一旦 外れたパーティションは,対応を行わない限り,再び元の RAID アレイに参加する ことが出来ません. このような状態に陥った /dev/md0 を復活させる場合は,発生した障害を 物理的に解決した後,mkraid コマンドを以下のように実行します.
この『あるオプション』は誤用すると非常に重篤な障害を引き起こすため, ドキュメント化するなとのことですので,ここではあえて書きません.この オプションを抜いてコマンドを実行し,その際に表示されるメッセージを読んで 『あるオプション』とは何かを見付けてみて下さい. この他,RAID の構成を変更しようとする際に,一度 RAID アレイに参加させた パーティションを使い回そうとすると,『既にデータが書き込まれている』 とのエラーでコマンドが実行できない場合があります.これも上記の 『あるオプション』を使用することにより,問題を回避することが出来ます. なお,/etc/raidtab の内容は,最新の構成に適時アップデートしておくことを お勧めします.再構築が発生した際などには構成が変ることになり,障害発生時に このファイルの設定を元に障害復旧しようとすると,逆に深刻なダメージを与える ことになってしまいます. |
||||||||||||||||||||||||||||||||||||
■容量の拡張 | ||||||||||||||||||||||||||||||||||||
ディスクを8台内蔵可能なケースを購入し,最初は4台で運用するが,いずれは
8台フルに使いたいということを考えている人も多いと思います.Software RAID
を使用する場合,このようなニーズにも柔軟に対応可能です. まず,元々の RAID アレイの構成(拡張前)を /etc/raidtab.org ,拡張後 の構成を /etc/raidtab というファイル名で保存しているとします.内容はraidtab 形式です.つまり,拡張後は nr-raid-disks や デバイス設定が増える形になって いると思います. まず,追加するディスクのパーティション分けをして Linux から認識させ, 次に 『raidreconf -o /etc/raidtab.org -n /etc/raidtab -m /dev/md0』 と, コマンドを実行します.すると RAID アレイの容量が拡大します. 次に,ext2 の場合は resize2fs,ReiserFS の場合は resize_reiserfs を使用し, 例えば 『resize_reiserfs /dev/md0』 のように実行します.このようにする ことにより,容量を拡張することが可能です. ただし,250GB と 400GB のパーティションを混在させて総容量を増やすような ことは出来ませんのでご注意下さい.必ず容量の小さいパーティションの方に合わ せられることになります. |
||||||||||||||||||||||||||||||||||||
■まとめ | ||||||||||||||||||||||||||||||||||||
運用開始から半年が経とうとしていますが,その間目立ったトラブルもなく,至って順調に
動作しています.やはりフラットな広大な空間は使い勝手も良く,ディスククラッシュが
即データの消失に繋がらない領域ということも相まって,非常に満足の行くものになりました.
安定稼働した結果,内蔵ディスクのバックアップも頻繁に行えるようになり,システムトータル
としての耐障害性も高まったと言えましょう. しかし,速度は IEEE1394a にぶら下がっているためか,Linux からベタに使用すると 20MB/sec 程の速度が出るのですが,利用時の CPU 負荷がやや高く,特に samba 経由で 複数クライアントからファイルの読み書きが発生した際には大幅にパフォーマンスが低下します. そういった意味では,IEEE1394a 外付けディスクで構築した Software RAID アレイは, 高いパフォーマンスを必要とする用途には不向きであるように思います (インターフェイスカードにボトルネックがあるような気もします.使用している インターフェイスチップ/カードによっては,良好なパフォーマンスが出るのかもしれません). とは言え,私が当初考えていた用途にはピッタリはまり,大容量の倉庫として大活躍中です. そんなこともあり,ガシガシ使っていたら以下のような状態になってしまいました.これでも, 大量の DVD-R にデータを書き出した後の状態です…
RAID アレイを構成するディスクを 400GB のディスクに置き換える日も,そう遠いことでは 無いかもしれません… ※ディスクを使用してのバックアップ方法の記事をSoftware Disign 2005年3月号に書かせて頂く 際に,紙面の関係で大幅に内容を割愛する必要が発生しました.本ページの内容は,この記事の 補足という形で雑誌の発売に間に合わせて公開するつもりでおりましたが,気が付いたら5月まで ずれ込んでしまいました…
|