BigAdmin System Administration Portal
特集記事
Print-friendly VersionPrint-friendly Version

ZFS 概要およびガイド

Don Turnbull、2007 年 3 月 (2009年 3 月に更新)

ZFS リソース
 
 

ZFS は、Solaris 10 オペレーティングシステムのストレージ管理における、Sun Microsystems のもっとも新しい手法です。ZFSは、POSIX準拠ファイルシステムおよび複数の管理ツールセットをボリューム管理システムとともに組み合わせます。アプリケーション自体を考えれば、従来のファイルシステムの動作とはまったく変わりませんが、大幅に改善されたパフォーマンスおよび処理能力を提供します。最後に、ZFSは、システム管理者に最良のボリューム管理およびバックアップ解決策に匹敵する広範囲のツールを提供します。

このガイドの目的は、初めてZFSを設定する場合に有用な概要を提供することです。ZFSは、このガイドで言及されないほかの機能およびオプションを多く組み込みます。これらの機能は特定の状況に役立ちますが、この一般的な概要に記載するものではありません。詳細な情報については、zfs(1M) および zpool(1M) のマニュアルページを参照してください。参照ドキュメントは docs.sun.com にもあります。もう 1 つの役立つリソースは 「OpenSolaris ZFS コミュニティー」です。その他のリソースについては、後述の「詳細情報」の節を参照してください。


一般的な概念

ストレージプール

ZFS は物理デバイスを「ストレージプール」と呼ばれる論理的なプールへ編成します。オペレーティングシステムの可視な各ディスクおよび配列論理ユニット番号 (LUN) はいずれも、ZFS プールに含まれます。ZFS は、従来のストレージ構造とは多少異なるベースにありますが、これらの機能はこのガイドでは言及していません。

ストレージプールは、冗長性がないストライプ化ディスク (RAID 0)、ミラー化ディスク (RAID 1)、ストライプ化ミラーセット (RAID、1+0)、またはパリティーによるストライプ化ディスク (RAID Z) の組み合わせになります。追加ディスクは、いつでもプールに追加できますが、同じ RAID レベルで追加する必要があります。たとえば、プールが RAID 1 で設定される場合、ディスクは、プールが作成されたときに使用された同じレベル数のミラー化セットとしてのみプールに追加することができます。ディスクがプールに追加されたときに、追加ストレージが自動的にその時点から使用されます。

注: プールにディスクを追加すると、データの書き込みがプール上で行われるときに、新しいディスクへ書き込まれます。既存データは自動的に再分配されませんが、変更された時に再分配されます。

プールへディスクを編成する場合、次の問題を考慮します。

  • ディスク競合。ストレージプールの中で全体のディスクを使用します。各ディスクパーティーションからストレージプールを構築する場合、プールとプールに含まれないパーティションの間で競合が起こる可能性があります。複数のストレージプールに同じディスクを含めないでください。
  • コントローラ競合。利用可能なコントローラの間で予測される負荷の平衡を保とうとします。たとえば、Oracle データベース用のディスクを設定する場合、インデックステーブルスペースを保持するプールとは異なるコントローラに割り当てられたディスクで、データテーブルスペースを保持するプールを構築してください。ディスクのコントローラ番号はディスクデバイスファイル名の「c」のあとにある数によって表されます (/dev/dsk/c1t0d0 はコントローラ 1 のディスクです)。
  • ファイルシステムのレイアウト。複数のファイルシステムは単一のストレージプールに構築することができます。類似ファイルシステムを格納するためにプールのサイズおよび構成を計画します。たとえば、10 のファイルシステムに対して 10 のプールを構築するのではなく、2 つのプールを構築して、プール内の競合を回避するために各プール中のファイルシステムを編成すれば、パフォーマンスはより向上します (つまり、インデックスとテーブルデータには同じプールを使用しません)。

注: RAID-Z は、より高いパフォーマンスと有用性でストライプセットをより容易に拡張できる、ZFS 用の特有の RAID-5 実装です。

ヒント 1:
より多くのディスクが含まれるほど、ストレージプールの性能が向上します。各プールにできるだけ多くのディスクを含むようにし、各プール上に複数のファイルシステムを構築してください。

ZFSファイルシステム

ZFSはオペレーティングシステムにPOSIX準拠のファイルシステムインターフェースを提供します。まとめると、ZFS ファイルシステムは、UFS ファイルシステムのように見えて動作しますが、ZFSファイルははるかに大きく、ZFS ファイルシステムもはるかに大きくなり、適切に設定されると ZFSの性能はさらによくなる点で異なります。

注: ファイルシステムを作成するために、どのくらいの大きさが必要かを知る必要はありません。

ZFSファイルシステムは、ストレージプールのサイズまで自動的に拡大します。

ZFS ファイルシステムはただ 1 つだけのストレージプールに構築する必要がありますが、1 つのストレージプールには複数の定義されたファイルシステムを持つことができます。ストレージプール中の各ファイルシステムは、それぞれストレージプール中ですべての未使用スペースへのアクセスを持ちます。ある 1 つのファイルシステムがスペースを使用すると、スペースを占領するファイルの削除によってそのスペースがプールに解放されるまで、スペースはそのファイルシステムのために予約されます。この間、同じプールをベースとするすべてのファイルシステム上の利用可能な空きスペースは減少します。

ZFSファイルシステムは、/etc/vfstab ファイルで管理する必要はありません。特に論理デバイスファイルは ZFS プールに構築して、vfstab ファイルを使用してマウントされることが可能です。ただし、ここではこれについての説明は記述していません。ZFS ファイルシステムをマウントする一般的な方法は、プールに対して単にそれを定義することです。特に設定されなかった場合、すべての定義済みZFS ファイルシステムは、ブート時に自動的にマウントされます。

最後に、ZFSファイルシステムのデフォルトマウントポイントは、プールの名前およびファイルシステムの名前に基づきます。たとえば、プール indexes 中に data1 と名付けられたファイルシステムは、/indexes/data1 としてマウントされます。必要に応じて、ファイルシステムが作成されたときまたはそのあとで、このデフォルト名は上書きできます。


コマンド行インタフェース

コマンド行インタフェースは主に zfszpool コマンドから構成されます。これらのコマンドを使用すると、任意のシステムのすべてのストレージデバイスを構成して利用可能にすることができます。グラフィカルインタフェースは Sun の管理センターを通じて利用できます。詳細情報について、docs.sun.com (英語) 上の SMC のドキュメントを参照してください。

たとえば、proddb.mydomain.com という名前の新しいサーバーがデータベースサーバーとして使用されると仮定します。テーブルとインデックスは別のディスク上に置く必要がありますが、ディスクはより高度なサービス利用のために、使用可能なスペースを最大にしなければなりません。従来のシステムでは、少なくとも 2 つの配列が個別のストレージコントローラ上に構成され、RAID または論理ボリュームマネージャーから提供されたデバイスファイル上に構築されたハードウェア RAID または論理ボリューム管理 (たとえば Solaris ボリュームマネージャー) や UFS ファイルシステムによってサーバーが利用可能になります。この節では、この同じタスクが ZFS でどのように行われるかを説明します。

ZFS の計画

ヒント 2:
format コマンドを使用して、利用可能なデバイスのリストを決定し、それらのデバイス構成の問題を解決します。

次の手順は新しいシステム上で ZFS を設定する前に行なってください。すべてのコマンドは、root ユーザーまたは root 権限を持つユーザーによって実行してください。

  • どのデバイスがローカルシステムで利用可能かを判断します。

    ZFS を構成する前に、どのディスクがシステムで利用可能かを明確にすることが重要です。

  • これらのデバイスがオペレーティングシステム中で正しく設定されていることを確認します。

    プラットフォームおよびデバイスが異なる場合は、Solaris OS で問題なく使用できるように異なる構成手順が必要です。詳細については、ストレージデバイスと OS のドキュメントを参照してください。

  • どのプールおよびファイルシステムが必要になるかを計画します。

    システムの使用予測を検討し、どのプールが必要になるか、各プール内にどのファイルシステムを置くかを決定します。ファイルシステムは、プールからプールに移行できるため、この予測を正確にする必要はありません。正しいバランスになるように予測してください。

  • どのデバイスをどのプールに含めるかを決定します。

    デバイスのリストとプールのリストを照合して、ディスクとコントローラの競合問題および利用可能なデバイスにすでに適用されていた任意のハードウェア RAID の問題を説明してください。

その他の計画情報は docs.sun.com (英語) で見つけることができます。

実行例では、JBOD (ただのディスクの束) あるいは非 RAID 管理されたストレージの 2 つのボディが、サーバーに付けられています。ZFSを使用する場合にハードウェアRAIDシステムを回避する理由はありませんが、この例はハードウェアRAIDシステムがなくより明確です。次のテーブルリストは、接続したストレージデバイスの中にある物理デバイスを示します。

c2t0d0
c4t0d0
c3t0d0
c5t0d0
c2t1d0
c4t1d0
c3t1d0
c5t1d0
c2t2d0
c4t2d0
c3t2d0
c5t2d0
c2t3d0
c4t3d0
c3t3d0
c5t3d0

データからインデックスを分ける必要に基づいて、indexes および tables と名付けた 2 つのプールを使用することを決定します。コントローラ競合を回避するために、コントローラ 2 および 4 からのディスクはすべて indexes プールに配置され、コントローラ 3 および 5 からのディスクはすべて tables プールの中で配置されます。両方のプールは最大の使用可能容量を得るためにRAID-Zによって構成されます。

ストレージプールの作成

ストレージプールは zpool コマンドで作成されます。すべてのコマンドオプションの詳細については、zpool(1M) のマニュアルページを参照してください。ただし、次のコマンド構文は新しい ZFS プールを構築します。


#  zpool create <pool_name> [<configuration>] <device_files>

コマンドは、新規プールの名前およびパスのないディスクデバイスファイル名 (たとえば、/dev/dsk/c#t#d# ではなく、c#t#d#) を入れるようにユーザーに要求します。さらに、mirror あるいは raidz などの構成フラグが使用される場合、デバイスのリストは要求された構成を使用して設定されます。そうでない場合、命名されたすべてのディスクはストライプ化されますが、パリティーまたはその他の高度な利用可能な機能は一切提供されません。

ヒント 3:
特定のマウントポイントを定義する -m オプション、またはデフォルトのマウントポイントへの相対ルートパスを再定義する -R オプションをチェックアウトします。

引き続く例では 、それぞれに最低限のコントローラ競合がある 8 枚のディスクの 2 つの RAID-Z ストレージプールを構築するための zpool コマンドを示します。

# zpool create indexes raidz c2t0d0 c2t1d0 c2t2d0 \
  c2t3d0 c4t0d0 c4t1d0 c4t2d0 c4t3d0
# zpool create tables raidz c3t0d0 c3t1d0 c3t2d0 \
  c3t3d0 c5t0d0 c5t1d0 c5t2d0 c5t3d0

これらのコマンドの影響は indexes および tables の名前で2つのプールを作成することです。各プールはRAID-Zストライプ化およびデータ冗長性機能を持ちます。ZFS プール名は、文字列 mirrorraidzspare、あるいは c# から始まる文字列 (ここで # は 0 - 9 の任意の数字) を除くすべての文字から始まる名前にすることができます。ZFS プール名には文字、数字、ダッシュ、下線あるいはピリオドだけを含むことができます。

ファイルシステムの作成

作成されたデフォルトのファイルシステムがシステムのニーズを十分に満たしていない場合、zfs コマンドを使用して追加のファイルシステムを作成することができます。コマンドオプションの詳細については、zfs(1M) のマニュアルページを参照してください。

たとえば実行例では、2 つのデータベースは新しいストレージ上で構成され、管理の目的で indexestables プールにそれぞれのマウントポイントを持つ必要があります。zfs コマンドを使用して、目的とするファイルシステムを次のように作成します。


# zfs create indexes/db1
# zfs create indexes/db2
# zfs create tables/db1
# zfs create tables/db2

注: ファイルシステムを命名する場合、注意してください。異なるプール中の異なるファイルシステムが同じ名前を再使用することは可能ですが、混乱させる可能性があります。

結果は各 /indexes および /tables の下で db1db2 のマウントポイントが別々に追加されます。マウント出力では、次のようなメッセージが表示されます。

/indexes/indexes/db1 そして /indexes/db2 の利用可能なスペースは indexes プールの中で定義された全部のスペースです。同様に、/tables/tables/db1 そして /tables/db2 の利用可能なスペースは tables プールの中で定義された全部のスペースです。各定義済みファイルシステムのために別個のコントロールおよび管理インタフェースを提供するために、各プールの中のファイルシステム db1 および db2 は、個別のファイルシステムとしてマウントされます。

ヒント 4:
zfs コマンドのset オプションを使用して、各ファイルシステムのマウントポイントおよびその他のプロパティーを処理します。

情報の表示

プールとファイルシステムについての詳細情報は、zpool および zfslist コマンドを使用して表示できます。その他のコマンドは同様に存在します。完全なリストについて、zfs および zpool のマニュアルページを読んでください。


# zpool list

NAME            SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
indexes         240M    110K    240M     0%  ONLINE     -
tables          240M    110K    240M     0%  ONLINE     -

# zfs list

NAME            USED    AVAIL  REFER  MOUNTPOINT
indexes         107K    208M   25.5K  /indexes
indexes/db1     24.5K   208M   24.5K  /indexes/db1
indexes/db2     24.5K   208M   24.5K  /indexes/db2
tables          107K    208M   25.5K  /tables
tables/db1      24.5K   208M   24.5K  /indexes/db1
tables/db2      24.5K   208M   24.5K  /indexes/db2

監視

監視についての詳細ディスカッションはこのドキュメントにはありませんが、ZFS 組み込みの監視機能の説明がないとこの概要の記述は完全ではありません。管理と同じ、システムを監視するコマンドが簡単です:


# zpool iostat <pool_name> <interval> <count>

このコマンドの作業は、オペレーティングシステムにある iostat コマンドに非常に似てます。プール名が指定されない場合、このコマンドは定義されたすべてのプールについて報告します。カウンタが指定されない場合、このコマンドは止められるまで報告します。オペレーティングシステム内の iostat コマンドとして必要とされた別のコマンドは、ZFSによって行われた実際の読み取りおよび書き込みを表示できません 。ファイルシステムへ送信およびファイルシステムから要求された読み取りと書き込みだけを表示できます。

コマンド出力は以下のとおりです:


# zpool iostat test_pool 5 10

               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
test_pool     80K  1.52G      0      7      0   153K
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0

その他のコマンドは、実行中の ZFS プールおよびファイルシステムのステータス、パフォーマンス、オプションおよび構成を管理者が確認するために使用できます。詳細については、zfs および zpool のマニュアルページを参照してください。

まとめ

zpoolzfs の単に 2 つのコマンドで、データベースサーバー proddb.mydomain.com へ 4 つのファイルシステム (2 つのインデックスと 2 つのテーブル) がマウントされます。データベースが作成されたあと、db1 のテーブルは /tables/db1 のファイルになり、db1 のインデックスは /indexes/db1 のファイルになります。2 つめのデータベース db2 の位置は、/indexes/db2/tables/db2 になります。/indexes の下のマウントポイントは、/tables よりも明確に異なるディスクとコントローラに基づきます。最後に、RAID-Z を使用すると、任意のデータが失われる前に、各プール内の 1 つのディスクを落とすことが可能です。

ディスクがコントローラによって分離されているか、スタンドアロンのドライブであるか、内部または外部であるか、ハードウェア RAID コントローラによって管理されるか、あるいは特定の技術を使用して接続されるかなどの要件は、ZFS にはありません。ZFS は、Solaris OS 内のデバイスファイルとしてそれ自体のすべてまたは一部を表すすべてのストレージデバイスを管理します。例では、このガイドの情報についての状況の提供を目的としています。ZFS 機能の完全なデモンストレーションを提供するものではありません。


サンプルスクリプト

以下は、カットとペースト操作によって、実例を実行できるサンプルスクリプトです。ローカル要件に合うように、太字で示されるスクリプトの内容をすべて変更してください:

#!/bin/sh
# This script must be run as root or as a user with appropriate
# role-based access control (RBAC) privileges.

##################################################################
#
# Create pools
#
# Creating pools also creates mount points. If you do not need
# more mount points than pools and the pool names are acceptable
# for mount points, you need not do more than create the pools.
#
# Create as many pools as you want.  Pools define the groups of
# disks under management. All disks in a pool must be managed
# in the same way (RAID-Z, mirrored, and so on), but each pool
# may have a different raid level. Use pools in the same way
# traditional RAID manager LUNs are used.
#
# Create first pool. Change the pool name (indexes), the raid flag
# (raidz), and the disk names (c#t#d#) to suite your local
# requirements. Read the zpool man page to determine the available
# options for the raid flag.

zpool create indexes raidz c2t0d0 c2t1d0 c2t2d0 c2t3d0 c4t0d0 c4t1d0 c4t2d0 c4t3d0

# Create second pool.  Change the pool name (tables), the raid flag
# (raidz), and the disk names (c#t#d#) to suite your local
# requirements. Read the zpool man page to determine the available
# options for the raid flag.

zpool create tables raidz c3t0d0 c3t1d0 c3t2d0 c3t3d0 c5t0d0 c5t1d0 c5t2d0 c5t3d0

##################################################################
#
# Create mounts
#
# Creating mounts may not be necessary as each pool forms a mount
# by default. However, if you need more than one mount point per
# pool, use the following commands to provide distinct mount
# points based on the pools created above.  All mount points have
# access to the full amount of free space in the mount point's
# designated pool. As any one mount point uses space, available
# space for all mount points decreases.
#
# Create the first mount point. The mount will be in the path
# shown from root unless changed later. Be sure to change the
# pool name (indexes) to suit the pools created previously and the
# file system name (db1) to suit your local needs.  Please see
# the zfs man page for information on options and settings.

zfs create indexes/db1

# Create the first mount point. The mount will be in the path
# shown from root unless changed later. Be sure to change the
# pool name (indexes) to suit the pools created previously and the
# file system name (db2) to suit your local needs.  Please
# see the zfs man page for information on options and settings.

zfs create indexes/db2

# Create the first mount point. The mount will be in the path
# shown from root unless changed later. Be sure to change
# the pool name (tables) to suit the pools created previously
# and the file system name (db1) to suit your local needs.
# Please see the zfs man page for information on options and
# settings.

zfs create tables/db1

# Create the first mount point. The mount will be in the path
# shown from root unless changed later. Be sure to change the
# pool name (tables) to suit the pools created previously and
# the file system name (db2) to suit your local needs.  Please
# see the zfs man page for information on options and settings.

zfs create tables/db2


追加情報

更新

2009 年 3 月:

  1. 「ZFSのための計画」の物理デバイスのテーブルを更新しました。
  2. 「ストレージプールの作成」の「プールは自動的にオンラインになって、/data1 と /data2 に対する ZFS ファイルシステムとして個別にマウントされます。」の記述を削除しました。
  3. 「サンプルスクリプト」の data1 と data2 をプール「indexes」と「tables」に変更し、fs1 と fs2 を ZFS の db1 とdb2 に変更しました。
  4. BigAdmin の ZFS ハブを追加しました。


Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License.


BigAdmin