目次


予算に収まる大規模で高速かつ安定的なストレージ

ZFS と RAID-Z を使用して高速のストレージ・サーバーを構築し、保守する

Comments

ZFS と RAID-Z の紹介

ZFS は現在利用可能なファイルシステムの中で最も高度なファイルシステムの 1 つです。ZFS は Zettabyte File System の頭文字をとったものですが、そのストレージ能力 (最大 256 x 1015 ゼタバイト) をそのまま表現しています。別の言い方をすると、1 ゼタバイトは 1,073,741,824 テラバイトと同じです。

このユニークで強力なツールには、さまざまな側面があります。ここではスケーラブルで冗長性を持つストレージ・サーバーの構築に関連する側面に焦点を絞ります。そのために RAID-Z を使用します。RAID-Z は名前からもわかるように、RAID 技術と似ています (より具体的に言えば、RAID-5 と似ています)。

RAID をよく理解している人であれば、RAID-Z がどんなデバイス (またはコントローラー) によってディスクとデータを処理しているのか不思議に思うかもしれません。RAID-Z では、すべての処理はファイルシステム自体によって行われます。ただし RAID-Z は他の類似技術とは異なり、破損したブロックを即座に自己修復し、ユーザーの手を煩わせません。RAID-Z は常にデータのチェックサムを検証して完全性を確認し、また再構築が必要なブロックを特定することができます。RAID-Z はそうした操作を、要求されたデータがユーザーに渡される前に行います。

RAID-Z と ZFS の両方をサポートするオペレーティング・システムはいくつかあるため、どのオペレーティング・システムを選ぶかは皆さんのお好み次第です。この記事で紹介する例と手法のほとんどは、どの OS にも適用でき、どの OS でも適切に動作するはずです。

ストレージの設計

皆さんには現在、どの程度の容量が必要なのでしょう? 1 年後にどの程度の容量が必要になると予測しているのでしょう?そのセットアップに適したハードディスク・ドライブの数は何台なのでしょう?作業を始める前に、これらの質問をすべて検討するとよいでしょう。ここでは最適な準備ができるように、これらの設計上の決定事項のそれぞれについて説明していきます。

オペレーティング・システム

ZFS ファイルシステムの機能とパフォーマンスをフルに活用するために、ZFS ファイルシステムをネイティブでサポートするオペレーティング・システムを使用することを強くお勧めします。これから説明する例ではすべて、オペレーティング・システムとして OpenIndiana を使用します (OpenIndiana は Open Solaris から分岐してコミュニティーによって保守が行われています)。そのため、コマンドや端末操作は OpenIndiana 環境を反映しています (OpenIndiana について詳しくは「参考文献」を参照)。

ただし、Linux を使い慣れており、この記事で実現する結果と同じ結果を得るための対応するコマンドを理解している人の場合には、選択したディストリビューションでは ZFS ファイルシステムをポーティングした zfs-fuse がサポートされているかどうかを確認する必要があります。

ストレージ空間

ストレージ空間は他の選択肢に直接影響するため、ストレージ空間がどの程度必要であるかを設計フェーズの最初に検討することが非常に重要です。またストレージ空間は、どのような方式の RAID-Z 構成が必要であるかによっても影響されます (この点については「RAID-Z の選択肢」セクションで詳しく説明します)。

ストレージ全体の一部として OS を含めてはなりません。OS は別のハードディスク・ドライブにインストールすることをお勧めします。そうした方が、共有ファイルシステムに影響を与えることなく容易にシステムの再インストールや修復を行うことができます。

どの程度のストレージ空間を想定している場合であれ、その想定と RAID-Z に必要な台数 (例えば、この記事の場合のように少なくとも 5 台のハードディスク・ドライブが必要、など) とが一致しているかどうかを確認する必要があります。サイズの異なるハードディスク・ドライブ (例えば 5 x 2 テラバイトのドライブと 1 x 1 テラバイトのドライブなど) を使用して RAID-Z を構築することもできますが、ZFS は実質的に、プール内にある最小容量のハードディスク・ドライブによってハードディスク・ドライブを定義します。

最適なパフォーマンスを得るためには、ハードディスク・ドライブには同じブランドで同じサイズのものを使用する必要があります。

RAID-Z の選択肢

RAID-Z を構築するにはさまざまな構成方法を利用することができます。ここではそのうちの 2 つについて説明し、次にこのプロジェクトで最終的に選択した方式について詳細に説明します。

RAID-Z はフォルト・トレランス性が最も低い方式です。この方式ではプールに 1 台のパリティー・ディスクがあります。複数のドライブで問題が発生すると、ストレージ・プールは破損して回復不能になります。

RAID-Z2 はパリティー用として 2 台のディスクを使用します。この 2 台のディスクのおかげで、ディスクの破損や動作不良といった問題が発生した場合にも安全です。RAID-Z2 を適切にセットアップするためには 2 台のハードディスク・ドライブが余分に必要ですが、RAID-Z2 は単純な RAID-Z よりもフォルト・トレランス性が高い方式です。

RAID-Z2 を構築するには少なくとも合計 5 台のドライブが必要であり (2 台はパリティーに使用されます)、全体としてのストレージに使用できるのは 3 台のドライブということになります。例えば 2 テラバイトのドライブを使用する場合は約 6 テラバイトのストレージが得られることになります。

ハードディスク・ドライブ

先ほど触れたように、同じブランドで同じサイズのドライブを使用することがベストです。ドライブ・プールを構成する場合、最もよく似たハードディスク・ドライブを使用した方が安全です。

理想的には、ストレージ・サーバーを構築する際には少なくとも 1 台余分にハードディスク・ドライブを購入し、遅延発生の可能性を減らします。入手したハードディスク・ドライブに製造上の問題があることは珍しくありません。

拡張とスケーラビリティー

ハードディスク・ドライブを追加するとデータがストレージ空間全体に分散されるため、速度が向上します。そのため、目標とするストレージ空間と合計サイズとが一致しているかどうかを確認することが重要です。マザーボードを拡張できる SATA コントローラーがいくつかありますが、事前に計画しておかないと、そうしたコントローラーがボトルネックとなる可能性があります。

スケーラブルで拡張可能なストレージにする上で重要な要素として、以下の 3 つがあります。

  1. ハードディスク・ドライブの数
  2. 全体的なストレージ容量
  3. ハードディスク・ドライブによるサーバー容量

私はごく最近、16 テラバイトのストレージ・サーバーを構築しましたが、このサーバーはその 2 倍の容量にまで拡張可能な機能を備えています。そのため、予想外の拡張に対応することができ、また予算を抑えることもできました。

プールを作成する

私達は当初、オペレーティング・システムを別のドライブにインストールすることにし、それとは別に利用できるデバイスが 5 台ありました。後でストレージ・プールを作成する際にデバイスを指定できるように、各デバイスのラベルをメモしておく必要があります。

リスト 1. デバイス・ラベルを検出する
root@raidz:~# format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
0. c7d0 DEFAULT cyl 4092 alt 2 hd 128 sec 32
/pci@0,0/pci-ide@1,1/ide@0/cmdk@0,0
1. c9t0d0 DEFAULT cyl 1022 alt 2 hd 128 sec 32
/pci@0,0/pci8086,2829@d/disk@0,0
2. c9t1d0 DEFAULT cyl 1022 alt 2 hd 128 sec 32
/pci@0,0/pci8086,2829@d/disk@1,0
3. c9t2d0 DEFAULT cyl 1022 alt 2 hd 128 sec 32
/pci@0,0/pci8086,2829@d/disk@2,0
4. c9t3d0 DEFAULT cyl 1022 alt 2 hd 128 sec 32
/pci@0,0/pci8086,2829@d/disk@3,0
5. c9t4d0 DEFAULT cyl 1022 alt 2 hd 128 sec 32
/pci@0,0/pci8086,2829@d/disk@4,0

Specify disk (enter its number):

format コマンドを発行してラベル (または ID) を検出していますが、選択するための数字は入力していません。Ctrl-C を入力してプロンプトを終了します。

ここではデバイス 0 に OS をインストールしましたが、その後、デバイス 0 とは別に 5 台のデバイスを追加することにしました。そのため、ストレージ・プールのためのラベルは以下のようになります。

  • c9t0d0
  • c9t1d0
  • c9t2d0
  • c9t3d0
  • c9t4d0

ZFS には魅力的な機能があり、ZFS 自体が素早くファイルシステムを作成してくれます。ハードディスク・ドライブのフォーマットや再フォーマットには時間がかかることが多いものですが、このケースでファイルシステムの作成に要した時間は約 2 秒です。平均的に、ファイルシステムの作成に要する時間はハードディスク・ドライブのサイズによらず、数秒程度に収まるはずです。

リスト 2. ストレージ・プールを作成する
zpool create tank raidz2 c9t0d0 c9t1d0 c9t2d0 c9t3d0 c9t4d0

zpool create tank コマンドはファイルシステムに対し、ドライブを何台か構築してフォーマットし、このストレージ・プールに tank というラベルを付けるように指示しています。ここでは RAID-Z のタイプとして raidz2 を指定しましたが、raidzraidz3 を選択することもできます。選択された 5 台のデバイスの ID はリスト 1 に示すとおりです。

これで、もう 1 つの重要なステップが完了しました。ストレージ・プールは既にマウントされ、使用できるようになっています。

リスト 3. プールが作成できたことを確認する
root@raidz:~# df -h
Filesystem             size   used  avail capacity  Mounted on
swap                   642M    16K   642M     1%    /tmp
swap                   642M    44K   642M     1%    /var/run
rpool/export/home      7.8G    21K   4.1G     1%    /export/home
rpool                  7.8G    77K   4.1G     1%    /rpool
tank                   5.8G    34K   5.8G     1%    /tank

簡潔にするためにコマンドの出力は短縮してありますが、tank が約 6 ギガバイトとして表示されており、既にファイルシステムのルート・レベルにマウントされていることがわかると思います。ここでは 2 台のディスクによるパリティーを選択したので、実質的なストレージ・サイズは他の 3 台のデバイスの合計に近くなります。これでストレージ・プールがマウントされて使用できるようになったので、ディスクとディスク・アレイ全体のヘルス・ステータスをチェックしましょう。

リスト 4. ストレージ・プールのステータス
root@raidz:~# zpool status tank
pool: tank
state: ONLINE
scrub: none requested
config:

NAME        STATE     READ WRITE CKSUM
tank        ONLINE       0     0     0
raidz2      ONLINE       0     0     0
c9t0d0      ONLINE       0     0     0
c9t1d0      ONLINE       0     0     0
c9t2d0      ONLINE       0     0     0
c9t3d0      ONLINE       0     0     0
c9t4d0      ONLINE       0     0     0

errors: No known data errors

必要な場合には、ストレージ・プール tank の中にネストされたファイルシステムを作成することもできます。そのようにすると、ストレージの一部を他とは異なる要求に対応させたい場合で、パーミッションが共有ファイルシステム自体に関連付けられている場合に非常に便利です。ただし、共有ファイルシステムが 1 つしかない場合にはファイルシステムをネストさせると複雑になる可能性があります。

リスト 5. 共有ファイルシステムを追加する
root@raidz:/tank# zfs create tank/bar 
root@raidz:/tank# zfs list
NAME                        USED  AVAIL  REFER  MOUNTPOINT
rpool                      3.74G  4.07G  77.5K  /rpool
rpool/ROOT                 2.99G  4.07G    19K  legacy
rpool/swap                  512M  4.43G   137M  -
tank                        160K  5.83G  34.8K  /tank
tank/bar                   34.0K  5.83G  34.0K  /tank/bar

ここでは、別の共有ファイルシステムのように表示される bar という名前の共有ファイルシステムを作成しました。共有ファイルシステムの作成はうまく行きましたが、tank/bar として約 6 ギガバイトが使用可能と表示されたからといって混乱しないでください。共有スペース全体を 2 倍にしたわけではなく、便利なように、ストレージ・プール全体のうちどの程度を利用できるかが表示されているのです。

回復

これでストレージ・プールをセットアップできたので、データが破損していないか、あるいはハードディスク・ドライブに欠陥がないか、確認しておく必要があります。幸いなことに、ZFS と RAID-Z により、そうしたタスクの管理を容易に行うことができます。このセクションでは、ハードディスク・ドライブの故障やシステム全体の障害によってオペレーティング・システムが回復できない場合のシミュレーションをします。

ハードディスク・ドライブの故障

このシナリオでは、意図的に 1 台のハードディスク・ドライブにサーバーがアクセスできないようにしました。その場合に ZFS がどのようなレポートを出力するかを見てみましょう。

リスト 6. 故障したドライブのステータス
root@raidz:~# zpool status tank
pool: tank
state: DEGRADED
status: One or more devices could not be opened.  
Sufficient replicas exist for the pool to continue functioning in 
a degraded state.
action: Attach the missing device and online it using 'zpool online'.
scrub: none requested
config:

NAME        STATE     READ WRITE CKSUM
tank        DEGRADED     0     0     0
raidz2      DEGRADED     0     0     0
c9t0d0      ONLINE       0     0     0
c9t1d0      ONLINE       0     0     0
c9t2d0      ONLINE       0     0     0
c9t3d0      ONLINE       0     0     0
c9t4d0      UNAVAIL      0     0     0  cannot open

errors: No known data errors

ストレージ・プールの状態が劣化しています (STATE が DEGRADED になっています)。このステータス・コマンドから、ストレージ・プールで何が起こっているのか、どのハードディスク・ドライブが故障しているように見えるかがわかります。また、このストレージが完全に利用可能であることも重要ですので注意してください。最大 2 台のハードディスク・ドライブに障害が同時に発生しても耐えられる raidz2 を選択したことを思い出してください。このシナリオをもう少し実際の状態に近いものにするために、いくつかのログ・ファイルをストレージにコピーし、DEGRADED の状態をシミュレートしました。

故障したハードディスク・ドライブを交換した後、再度サーバーを起動し、その結果を観察しました。

リスト 7. DEGRADED の状態から回復する
root@raidz:~# zpool status tank
pool: tank
state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
using 'zpool clear' or replace the device with 'zpool replace.'
scrub: resilver completed after 0h0m with 0 errors on Tue Nov  9 07:25:23 2010
config:

NAME        STATE     READ WRITE CKSUM
tank        ONLINE       0     0     0
raidz2      ONLINE       0     0     0
c9t0d0      ONLINE       0     0     0
c9t1d0      ONLINE       0     0     0
c9t2d0      ONLINE       0     0     0
c9t3d0      ONLINE       0     0     0
c9t4d0      ONLINE       0     0     2  31.5K resilvered

errors: No known data errors

私達が何も操作しなくても共有ファイルシステムが完全に回復されただけではなく、この出力を見ると、何が発生したのか、どんなアクションが実行されたのか、この結果 (ファイルの破損など) に満足できない場合にどんな選択肢があるのかについての詳細もわかります。

resilvered タグは、この特定のドライブに対してそれだけの量のデータが ZFS によって再構築されたことを意味しています。

オペレーティング・システムが回復不能

このセクションでは、ブートできないというシステム・エラーを再現します。システムは重要なストレージと区別され、別のハードディスク・ドライブにインストールされているので、共有ファイルシステムと関連付けられたデバイスには触らずに、同じハードディスク・ドライブにシステムを再インストールすることができます。

先ほどとまったく同じように、zpool コマンドを使用してストレージを診断し、そのストレージを再度接続できるかどうかを判断します。

リスト 8. 再インストール後のストレージ・プールのステータス
root@reinstalled:~# zpool status
pool: rpool
state: ONLINE
scrub: none requested
config:

NAME        STATE     READ WRITE CKSUM
rpool       ONLINE       0     0     0
c7d0s0      ONLINE       0     0     0

errors: No known data errors

この結果から、インストールは成功したものの、まだストレージ・プールが検出されていないことがわかります。

リスト 9. ストレージ・プールを検出する
root@reinstalled:~# zpool import
pool: tank
id: 11026414298329032494
state: ONLINE
status: The pool was last accessed by another system.
action: The pool can be imported using its name or numeric identifier and
the '-f' flag.
see: http://www.sun.com/msg/ZFS-8000-EY
config:

tank        ONLINE
raidz2      ONLINE
c9t0d0      ONLINE
c9t1d0      ONLINE
c9t2d0      ONLINE
c9t3d0      ONLINE
c9t4d0      ONLINE

素晴らしい結果です。これがストレージ・プールです。このプールは完璧な状態にあり、いつでもインポートできる状態になっています。

リスト 10. ストレージ・プールをインポートし、検証する
root@reinstalled:~# zpool import tank
cannot import 'tank': pool may be in use from other system, it was 
last accessed by raidz (hostid: 0x4013af) on Tue Nov  9 07:31:33 2010
use '-f' to import anyway
root@reinstalled:~# zpool import -f tank
root@reinstalled:~# zpool status tank
pool: tank
state: ONLINE
scrub: none requested
config:

NAME        STATE     READ WRITE CKSUM
tank        ONLINE       0     0     0
raidz2      ONLINE       0     0     0
c9t0d0      ONLINE       0     0     0
c9t1d0      ONLINE       0     0     0
c9t2d0      ONLINE       0     0     0
c9t3d0      ONLINE       0     0     0
c9t4d0      ONLINE       0     0     0

errors: No known data errors
root@reinstalled:~# df -h
Filesystem             size   used  avail capacity  Mounted on
/                      7.8G   2.8G   4.2G    41%    /
/devices                 0K     0K     0K     0%    /devices
swap                   800M   368K   800M     1%    /etc/svc/volatile
rpool/export           7.8G    21K   4.2G     1%    /export
rpool                  7.8G    79K   4.2G     1%    /rpool
tank                   5.8G   104K   5.8G     1%    /tank

ここではプールをインポートしようとしましましたが、出力レポートを見ると、このプールが別のシステム (この場合は先ほどインストールしたシステム) で使用されている可能性があることがわかります。強制的にインポートを行ってステータスを確認してみると、何もエラーが返されません。最後に、マウントされたかどうかとマウントされた場所をチェックし、このプールが以前とまったく同じであることを確認します。

これで、一般的なシナリオを最後まで実行し、ほとんど手間もなくストレージを回復することができました。

共有

共有は単純です。このセクションでは NFS を使用した共有について説明します。NFS は、さまざまな種類の Linux や UNIX を含め、いくつかのオペレーティング・システムでサポートされています。

ZFS はネイティブで NFS をサポートしているため、皆さんはファイルシステムと共有形式、そして共有の場所を知っていればよいのです。

リスト 11. NFS を使用した共有
root@reinstalled:~# zfs set sharenfs=on tank

この場合、tank は共有ファイルシステムであり、ローカル・ネットワーク内の NFS 上で直ちに共有されます。また、特定の共有ファイルシステムにパーミッションを設定することもできます。ただし、共有ファイルシステムのルートを共有した場合、ルートの子として既に存在する (あるいは今後作成される) 共有ファイルシステムをすべて自動的に共有することになるので注意してください。

図 1. Mac OSX で NFS 共有ファイルシステムに接続する
nfs://10.0.1.45/tank に接続する場合の Mac OSX の画面のスクリーン・ショット
nfs://10.0.1.45/tank に接続する場合の Mac OSX の画面のスクリーン・ショット

通常、サーバー上に共有ファイルシステムを構築するには時間がかかりますが、ファイルシステム自体が NFS などの特定のプロトコルによる共有機能を持っているため、それを有効に活用することができます。

先ほどの共有ファイルシステムには、保護やパーミッションが設定されていなかったので、この共有ファイルシステムを変更し、ネットワーク内の特定のサブネットに対して読み書きアクションを実行できるようにしてみましょう。

リスト 12. ZFS 共有ファイルシステムにネットワーク・ベースのパーミッションを設定する
zfs set sharenfs=rw=@10.0.0.0/8 tank

この種のネットワーク制限を有効にするために追加の構成は必要ありません。このコマンドが送信されると即座にアクセスが制限され、指定されたサブネット以外はこの共有ファイルシステムに対する読み書きができなくなります。

パーミッションの設定は特定のユーザーやグループのみがアクセスできるように微調整することができ、また実装や構成はシステムごとに異なる可能性があります。

まとめ

ZFS は、さまざまなオペレーティング・システム上で動作するようにポーティングされてきました。現在はさまざまなバージョンの UNIX や Linux で ZFS を利用することができます。

ZFS と RAID-Z に関して説明すべきことは他にもたくさんありますが、この記事では共有ファイルシステムを構築する上で最も重要な項目について、設計時の決定からネットワークを介したストレージの共有まで説明しました。

ZFS で利用できるディスク・アレイの方式は RAID-Z のみではありません。通常はミラーリングの方が高速でメモリー使用量も少ないのですが、ミラーリングするためには同じ数のハードディスク・ドライブが必要になります。この記事で説明した例では、5 台のハードディスク・ドライブで共有ファイルシステムに対応していますが、5 台すべてを使用することはできませんでした。

複数のデバイスを保持できるストレージをサーバー上に構築し、そのストレージをネットワークで共有しようとする場合、ZFS は理想的です。ただし、少なくとも 2 台のデバイスが別にない限り、ZFS の利点のすべてを活用することはできません。デバイスの数が多ければ多いほど、高いパフォーマンスを得ることができます。

皆さんが ZFS について詳しく探る準備ができたこと、そしてこのファイルシステムが便利なものであることに気付いてくれたようであれば幸いです。


ダウンロード可能なリソース


関連トピック

  • OpenIndiana はコミュニティーで開発されたオープンソースの UNIX オペレーティング・システムであり、ZFS を完全にサポートしています。
  • Illumos は OpenSolaris オペレーティング・システムから分岐してコミュニティーで開発された完全にオープンなオペレーティング・システムです。
  • Nexenta OS は ZFS 用の Unix カーネルと Debian/Ubuntu のパッケージ・マネージャー (aptitude) を組み合わせたものです。
  • ZFS in Ubuntu は Ubuntu で ZFS を使用する方法を解説したウィキ・ガイドです。
  • ZFS のベスト・プラクティスについての資料を読んでください。
  • FreeBSD は FreeBSD で ZFS を使用するための完全なガイドです。
  • ZFS の歴史と機能についての説明を読んでください。
  • ZFS と他の RAID 方式の比較資料を見てください。
  • developerWorks の Open source ゾーンをご覧ください。オープンソース技術を使用した開発や、IBM 製品でオープンソース技術を使用するためのハウ・ツー情報やツール、プロジェクトの更新情報など、豊富な情報が用意されています。

コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=742562
ArticleTitle=予算に収まる大規模で高速かつ安定的なストレージ
publish-date=07292011