7 Oracle Cluster File Systemバージョン2の管理
警告:
Oracle Linux 7は現在延長サポート中です。詳細は、Oracle Linux拡張サポートおよびOracleオープン・ソース・サポート・ポリシーを参照してください。
できるだけ早くアプリケーションとデータをOracle Linux 8またはOracle Linux 9に移行してください。
この章では、Oracle Cluster File Systemバージョン2 (OCFS2)ファイル・システムを構成および使用する方法について説明します。
OCFS2について
Oracle Cluster File Systemバージョン2 (OCFS2)は、クラスタでの使用を目的とした、パフォーマンスに優れた可用性の高い共有ディスク型の汎用ファイル・システムです。OCFS2ボリュームは、クラスタ化されていないスタンドアロン・システムにもマウントできます。
ext4
やbtrfs
などの代替ファイル・システムと比較して、ocfs2
をローカルでマウントする利点はないように思われますが、OCFS2では、btrfsファイル・システムでcp --reflinkコマンドを使用する場合と同様に、reflinkコマンドを使用して個々のファイルのコピーオンライト・クローンを作成できます。通常、このようなクローンによって、VMイメージやLinuxコンテナなどの非常によく似たファイルの複数のコピーを格納する場合にディスク領域を節約できます。また、ローカルOCFS2ファイル・システムをマウントすると、後でそれを変換せずにクラスタ・ファイル・システムに移行できます。reflinkコマンドの使用時は、結果となるファイルシステムが元のファイルシステムのクローンのように動作することに注意してください。これは、それらのUUIDが同一だということです。reflinkを使用してクローンを作成するときは、tunefs.ocfs2コマンドを使用してUUIDを変更する必要があります。詳細は、ボリューム・パラメータの問合せおよび変更を参照してください。
-
仮想マシン・イメージへの共有アクセスをホストするOracle VM。
-
Linuxゲスト・マシンでファイル・システムを共有できるOracle VMおよびVirtualBox。
-
データベース・クラスタのOracle Real Application Cluster (RAC)。
-
ミドルウェア・クラスタのOracle E-Business Suite。
OCFS2には、エンタープライズ・レベルのコンピューティング環境でのデプロイメントに適した次のような多くの機能があります。
-
停電またはシステム・クラッシュの発生時にファイル・システムの一貫性を確保する順序付きのライトバック・データ・ジャーナルのサポート。
-
512バイトから4KBの範囲にわたるブロック・サイズと、4KBから1MBの範囲にわたるファイル・システム・クラスタ・サイズ(どちらも2の累乗単位で増分)。サポートされている最大ボリューム・サイズは16TBで、これは4KBのクラスタ・サイズに相当します。4PBもの巨大ボリューム・サイズも、クラスタ・サイズ1MBの場合は理論的に可能ですが、この上限値はテストされていません。
-
大規模ファイルを効率的に格納できるエクステント・ベースの割当て。
-
高いパフォーマンスと効率的な格納を目的とするスパース・ファイル、インライン・データ、未書込みエクステント、ホール・パンチング、reflinkおよび割当て予約の最適化された割当てサポート。
-
大量のオブジェクトが含まれる場合でも、そのディレクトリに対する効率的なアクセスを可能にするディレクトリの索引付け。
-
破損したinodeおよびディレクトリを検出するためのメタデータ・チェックサム。
-
通常のファイル、ディレクトリ、シンボリック・リンクなどのファイル・システム・オブジェクトに
name:value
ペアを無制限にアタッチできる拡張属性。 -
従来のファイル・アクセス権モデルに加えられたPOSIX ACLおよびSELinuxの拡張セキュリティ・サポート。
-
ユーザーおよびグループの割当て制限のサポート。
-
32ビットと64ビットおよびリトル・エンディアン(x86、x86_64、ia64)とビッグ・エンディアン(ppc64)の各アーキテクチャが混在するノードの異機種間クラスタのサポート。
-
クラスタ・ノードからの同時アクセスを管理する分散ロック・マネージャ(DLM)付きの、簡単に構成できるカーネル内クラスタ・スタック(O2CB)。
-
バッファ型、直接、非同期、スプライスおよびメモリー・マップ型のI/Oのサポート。
-
ext3
ファイル・システムと同様のパラメータを使用するツール・セット。
OCFS2の詳細は、https://oss.oracle.com/projects/ocfs2/documentation/を参照してください。
ローカルOCFS2ファイル・システムの作成
ローカルにマウントし、クラスタに関連付けないOCFS2ファイル・システムを作成するには、次のコマンドを使用します。
sudo mkfs.ocfs2 -M local --fs-features=local -N 1 [options] device
localvol
のローカルにマウント可能なOCFS2ボリュームを/dev/sdc1
に作成します。
sudo mkfs.ocfs2 -M local --fs-features=local -N 1 -L "localvol" /dev/sdc1
tunefs.ocfs2ユーティリティを使用して、ローカルOCFS2ファイル・システムをクラスタ使用に変換できます。次に例を示します。
sudo umount /dev/sdc1 sudo tunefs.ocfs2 -M cluster --fs-features=clusterinfo -N 8 /dev/sdc1
この例では、ノード・スロットの数も1から8に増やしているため、最大8個のノードによるファイル・システムをマウントが可能になります。
OCFS2のインストールおよび構成
この項では、OCFS2を使用するようにクラスタを設定する手順について説明します。
OCFS2のクラスタの準備
最高のパフォーマンスを得るには、クラスタ内の各ノードに2つ以上のネットワーク・インタフェースが存在する必要があります。1つのインタフェースは、パブリック・ネットワークに接続してシステムへの一般的なアクセスを可能にします。もう1つのインタフェースは、ノード間のプライベート通信に使用します(クラスタ・ノードによる共有リソースへのアクセスの調整方法および相互の状態の監視方法を確認するクラスタ・ハートビート)。これらのインタフェースは、ネットワーク・スイッチを介して接続する必要があります。クラスタの構成を続行する前に、すべてのネットワーク・インタフェースが構成され、稼働していることを確認してください。
2つのクラスタ・ハートビート構成を選択できます。
-
共有デバイスごとのローカル・ハートビート・スレッド。このモードでは、ノードはOCFS2ボリュームのマウント時にハートビート・スレッドを開始し、ボリュームのマウント解除時にスレッドを停止します。これがデフォルトのハートビート・モードです。多くのOCFS2ボリュームをマウントするノードには、大きなCPUオーバーヘッドがかかります。これは、各マウントで、別々のハートビート・スレッドが必要なためです。マウント数が多いと、1つのマウントでのハートビートI/Oタイムアウトが原因で、ノードが自身をクラスタからフェンシングするリスクが高まります。
-
特定の共有デバイスでのグローバル・ハートビート。OCFS2ボリュームがディスク・デバイス全体を占有しており、パーティションでない場合、そのOCFS2ボリュームをグローバル・ハートビート・デバイスとして構成できます。このモードでは、クラスタがオンラインになるとデバイスへのハートビートが開始し、クラスタがオフラインになるとハートビートが停止します。多くのOCFS2ボリュームをマウントするクラスタでは、このモードをお薦めします。グローバル・ハートビート・デバイスの半分以上でハートビートI/Oタイムアウトが発生した場合、ノードはクラスタから自身をフェンシングします。したがって、1つのデバイスの障害に対する冗長性を確保するために、少なくとも3つのグローバル・ハートビート・デバイスを構成する必要があります。
図7-1に、ネットワーク・スイッチを介してLANおよびネットワーク・ストレージ・サーバーに接続された4ノードのクラスタを示します。各ノードおよびストレージ・サーバーは、ローカル・クラスタ・ハートビートに使用するプライベート・ネットワークにもスイッチを介して接続されます。
図7-1- プライベート・ネットワークを使用したクラスタ構成

プライベート・ネットワークを使用せずにOCFS2を構成および使用することもできますが、このような構成では、I/Oハートビートのタイムアウトが原因でクラスタからのノード・フェンシングが発生する可能性が高まります。
ファイアウォールの構成
プライベート・クラスタ通信のためにクラスタが使用するインタフェースでのアクセスを可能にするように、各ノードのファイアウォールを構成または無効化します。デフォルトでは、クラスタはポート7777を通じてTCPとUDPの両方を使用します。
着信TCP接続およびUDPデータグラムをポート7777で許可するには、次のコマンドを使用します。
sudo firewall-cmd --zone=zone --add-port=7777/tcp --add-port=7777/udp sudo firewall-cmd --permanent --zone=zone --add-port=7777/tcp --add-port=7777/udp
クラスタ・ソフトウェアの構成
各ノードが同じバージョンのOCFS2ソフトウェアと互換バージョンのOracle Linux Unbreakable Enterprise Kernel (UEK)を実行しているのが理想的です。クラスタは、クラスタのローリング・アップデートの実行中などに、OCFS2とUEKソフトウェアのバージョンが混在していても実行可能です。最も低いバージョンのソフトウェアを実行しているクラスタ・ノードによって、使用可能な機能のセットが決定されます。
-
kernel-uek
-
ocfs2-tools
ノート:
グローバル・ハートビート機能を使用する場合、ocfs2-tools-1.8.0-11
以降をインストールする必要があります。
クラスタ・スタックの構成ファイルの作成
構成ファイルを作成するには、o2cbコマンドまたはテキスト・エディタを使用します。
-
次のコマンドを使用してクラスタ定義を作成します。
sudo o2cb add-cluster cluster_name
たとえば、4つのノードが含まれるmycluster
というクラスタを定義するには、次のようにします。sudo o2cb add-cluster mycluster
コマンドによって、構成ファイル
/etc/ocfs2/cluster.conf
が作成されます(まだ存在していない場合)。 -
ノードごとに、次のコマンドを使用してノードを定義します。
sudo o2cb add-node cluster_name node_name --ip ip_address
ノードの名前は、
/etc/sysconfig/network
で構成されているシステムのHOSTNAME
の値と同じである必要があります。IPアドレスは、クラスタ内のプライベート通信のためにノードが使用するものです。たとえば、クラスタmycluster
内でIPアドレスが10.1.0.100のnode0
というノードを定義するには、次のようにします。sudo o2cb add-node mycluster node0 --ip 10.1.0.100
OCFS2はIPv4アドレスのみをサポートすることに注意してください。 -
クラスタでグローバル・ハートビート・デバイスを使用する場合、次のコマンドを使用します。
sudo o2cb add-heartbeat cluster_name device1 . . . sudo o2cb heartbeat-mode cluster_name global
ノート:
ディスク・デバイス全体を使用するようにグローバル・ハートビートを構成する必要があります。ディスク・パーティション上でグローバル・ハートビート・デバイスは構成できません。
たとえば、/dev/sdd
、/dev/sdg
、および/dev/sdj
をグローバル・ハートビート・デバイスとして使用するには、次のコマンドを使用します。sudo o2cb add-heartbeat mycluster /dev/sdd sudo o2cb add-heartbeat mycluster /dev/sdg sudo o2cb add-heartbeat mycluster /dev/sdj sudo o2cb heartbeat-mode mycluster global
-
クラスタ構成ファイル
/etc/ocfs2/cluster.conf
をクラスタ内の各ノードにコピーします。ノート:
クラスタ構成ファイルに追加した変更は、クラスタ・スタックを再起動するまで有効になりません。
/etc/ocfs2/cluster.conf
では、ローカル・ハートビートを使用するmycluster
という4ノード・クラスタを定義しています。
node: name = node0 cluster = mycluster number = 0 ip_address = 10.1.0.100 ip_port = 7777 node: name = node1 cluster = mycluster number = 1 ip_address = 10.1.0.101 ip_port = 7777 node: name = node2 cluster = mycluster number = 2 ip_address = 10.1.0.102 ip_port = 7777 node: name = node3 cluster = mycluster number = 3 ip_address = 10.1.0.103 ip_port = 7777 cluster: name = mycluster heartbeat_mode = local node_count = 4
node: name = node0 cluster = mycluster number = 0 ip_address = 10.1.0.100 ip_port = 7777 node: name = node1 cluster = mycluster number = 1 ip_address = 10.1.0.101 ip_port = 7777 node: name = node2 cluster = mycluster number = 2 ip_address = 10.1.0.102 ip_port = 7777 node: name = node3 cluster = mycluster number = 3 ip_address = 10.1.0.103 ip_port = 7777 cluster: name = mycluster heartbeat_mode = global node_count = 4 heartbeat: cluster = mycluster region = 7DA5015346C245E6A41AA85E2E7EA3CF heartbeat: cluster = mycluster region = 4F9FBB0D9B6341729F21A8891B9A05BD heartbeat: cluster = mycluster region = B423C7EEE9FC426790FC411972C91CC3
ここでは、クラスタのハートビート・モードがglobal
として示されており、ハートビート領域がそのブロック・デバイスのUUIDによって表されています。
-
cluster:
、heartbeat:
、およびnode:
の各ヘッダーが最初の列に存在する必要があります。 -
各パラメータ・エントリは、タブの空白1つ分インデントする必要があります。
-
クラスタ、ハートビート・デバイス、またはノードを定義する各セクションが空白行で区切られている必要があります。
クラスタ・スタックの構成
-
クラスタの各ノードで次のコマンドを実行します。
sudo /sbin/o2cb.init configure
次の表に、入力を要求される値を示します。プロンプト 説明 Load O2CB driver on boot (y/n)
ブート時にクラスタ・スタック・ドライバをロードするかどうか。デフォルトの応答は
n
です。Cluster stack backing O2CB
クラスタ・スタック・サービスの名前。デフォルトおよび通常の応答は
o2cb
です。Cluster to start at boot (クリアするには"none"を入力)
クラスタ構成ファイル
/etc/ocfs2/cluster.conf
で定義したクラスタの名前を入力します。Specify heartbeat dead threshold (>=7)
ノードが無反応であるとみなされる前に、応答なしで経過させる2秒単位のハートビートの数。入力する値を計算するには、必要なしきい値時間を2で割って1を加えます。たとえば、しきい値時間を120秒に設定するには、値61を入力します。デフォルト値は、60秒のしきい値時間に対応する31です。
ノート:
システムでマルチパス・ストレージを使用する場合、推奨値は61以上です。
Specify network idle timeout in ms (>=5000)
ネットワーク接続が無反応であるとみなされる前に、経過させるミリ秒数。デフォルト値は、30,000ミリ秒です。
ノート:
結合したネットワーク・インタフェースの場合、推奨値は30,000ミリ秒以上です。
Specify network keepalive delay in ms (>=1000)
別のノードにキープアライブ・パケットを送信する間隔のミリ秒単位の最大遅延。デフォルトおよび推奨値は2,000ミリ秒です。
Specify network reconnect delay in ms (>=2000)
ネットワーク接続が切断された場合に再接続を試行する間隔のミリ秒単位の最小遅延。デフォルトおよび推奨値は2,000ミリ秒です。
クラスタ・スタックの設定を確認するには、/sbin/o2cb.init statusコマンドを入力します。sudo /sbin/o2cb.init status
Driver for "configfs": Loaded Filesystem "configfs": Mounted Stack glue driver: Loaded Stack plugin "o2cb": Loaded Driver for "ocfs2_dlmfs": Loaded Filesystem "ocfs2_dlmfs": Mounted Checking O2CB cluster "mycluster": Online Heartbeat dead threshold: 61 Network idle timeout: 30000 Network keepalive delay: 2000 Network reconnect delay: 2000 Heartbeat mode: Local Checking O2CB heartbeat: Active
この例では、クラスタはオンラインであり、ローカル・ハートビート・モードを使用しています。ボリュームが構成されていない場合、O2CBハートビートは、
Active
ではなくNot active
として示されます。次の例は、3つのグローバル・ハートビート・デバイスを使用するオンライン・クラスタのコマンド出力を示しています。
# /sbin/o2cb.init status
Driver for "configfs": Loaded Filesystem "configfs": Mounted Stack glue driver: Loaded Stack plugin "o2cb": Loaded Driver for "ocfs2_dlmfs": Loaded Filesystem "ocfs2_dlmfs": Mounted Checking O2CB cluster "mycluster": Online Heartbeat dead threshold: 61 Network idle timeout: 30000 Network keepalive delay: 2000 Network reconnect delay: 2000 Heartbeat mode: Global Checking O2CB heartbeat: Active 7DA5015346C245E6A41AA85E2E7EA3CF /dev/sdd 4F9FBB0D9B6341729F21A8891B9A05BD /dev/sdg B423C7EEE9FC426790FC411972C91CC3 /dev/sdj
-
ネットワーキングが有効になった後、ブート時に開始するように
o2cb
およびocfs2
サービスを構成します。sudo systemctl enable o2cb sudo systemctl enable ocfs2
これらの設定によって、システムの起動時にノードでOCFS2ボリュームを自動的にマウントできます。
クラスタ操作のためのカーネルの構成
カーネル設定 | 説明 |
---|---|
|
パニック後、システムが自動的に自己リセットを行う前の秒数を指定します。 値が0の場合、システムはハングして、トラブルシューティングのためにパニックの詳細情報を収集できます。これはデフォルト値です。
自動リセットを有効にするには、0以外の値を設定します。メモリー・イメージ( |
|
カーネルoopsが発生した場合にシステムでパニックを起こすように指定します。クラスタ操作に必要とされるカーネル・スレッドがクラッシュした場合、システムは自己リセットを行う必要があります。それ以外の場合、他のノードはあるノードの応答が遅れているのか、応答できないのかを区別できず、その結果クラスタ操作がハングする可能性があります。 |
panic
およびpanic_on_oops
の推奨値を設定します。 sudo sysctl kernel.panic=30 sudo sysctl kernel.panic_on_oops=1
/etc/sysctl.conf
ファイルに追加します。
# Define panic and panic_on_oops for cluster operation kernel.panic=30 kernel.panic_on_oops=1
クラスタ・スタックの起動および停止
次のリストに、クラスタ・スタックに対して様々な操作を実行する場合に使用できるコマンドを示します。
-
/sbin/o2cb.init status: クラスタ・スタックのステータスを確認します。
-
/sbin/o2cb.init online: クラスタ・スタックを起動します。
-
/sbin/o2cb.init offline: クラスタ・スタックを停止します。
-
/sbin/o2cb.init unload: クラスタ・スタックをアンロードします。
OCFS2ボリュームの作成
コマンド・オプション | 説明 |
---|---|
-bblock-size --block-sizeblock-size |
ファイル・システムを対象とするI/Oトランザクションの単位サイズと、inodeおよびエクステント・ブロックのサイズを指定します。サポートされるブロック・サイズは、512 (512バイト)、1K、2Kおよび4Kです。デフォルトおよび推奨ブロック・サイズは、4K (4KB)です。 |
-Ccluster-size --cluster-sizecluster-size |
ファイル・データを割り当てるために使用する領域の単位サイズを指定します。サポートされるクラスタ・サイズは、4K、8K、16K、32K、64K、128K、256K、512Kおよび1M (1MB)です。デフォルトのクラスタ・サイズは、4K (4KB)です。 |
--fs-feature-level=feature-level |
ファイル・システム機能のセットを選択できます。
|
--fs_features=feature |
スパース・ファイル、未書込みエクステント、バックアップ・スーパーブロックのサポートなどの個々の機能を有効化または無効化できます。詳細は、 |
-Jsize=journal-size --journal-optionssize=journal-size |
先行書込みジャーナルのサイズを指定します。指定されていない場合、サイズは-Tオプションに指定するファイル・システムの用途タイプから決定され、それ以外の場合はボリューム・サイズから決定されます。ジャーナルのデフォルト・サイズは、 |
-Lvolume-label --labelvolume-label |
異なるクラスタ・ノードで簡単に識別できるわかりやすいボリュームの名前を指定します。 |
-Nnumber --node-slotsnumber |
ボリュームに同時にアクセスできるノードの最大数を指定します(これは、ファイル・システム・ジャーナルなどのシステム・ファイルではノード・スロットの数によって制限されます)。最高のパフォーマンスを得るには、ノード・スロットの数をノード数の2倍以上に設定します。後でノード・スロットの数を増加すると、ジャーナルはディスク・プラッタの外縁部に隣接して配置されなくなるため、パフォーマンスが低下する可能性があります。 |
-Tfile-system-usage-type |
ファイル・システムの用途タイプを指定します。
|
myvol
というラベル付きで/dev/sdc1
上でOCFS2ボリュームを作成します。デフォルト値は4KBブロック、クラスタ・サイズ、8ノード・スロット、256MBジャーナルで、デフォルトのファイル・システム機能をサポートしています。
sudo mkfs.ocfs2 -L "myvol" /dev/sdc1
dbvol
というラベル付きで/dev/sdd2
上にOCFS2ボリュームを作成します。この場合、クラスタ・サイズは128KBに、ジャーナル・サイズは32MBに設定されます。 sudo mkfs.ocfs2 -L "dbvol" -T datafiles /dev/sdd2
/dev/sde1
上にOCFS2ボリュームを作成します。
sudo mkfs.ocfs2 -C 16K -J size=128M -N 16 --fs-feature-level=max-features --fs-features=norefcount /dev/sde1
ノート:
LVM論理ボリュームにOCFS2ボリュームを作成しないでください。LVMはクラスタ対応ではありません。
作成後にOCFS2ボリュームのブロックおよびクラスタ・サイズを変更することはできません。tunefs.ocfs2コマンドを使用すると、一定の制限付きでファイル・システムの他の設定を変更できます。詳細は、tunefs.ocfs2(8)
マニュアル・ページを参照してください。
ボリュームでデータベース・ファイルを格納する場合、データベースのブロック・サイズより小さいクラスタ・サイズを指定しないでください。
ファイル・システムの大きさが数GBを超える場合、デフォルトのクラスタ・サイズ4KBでは不適切です。次の表に、様々なファイル・システム・サイズ範囲に推奨される最小クラスタ・サイズ設定を示します。
ファイル・システム・サイズ | 推奨される最小クラスタ・サイズ |
---|---|
1GB - 10GB |
8K |
10GB - 100GB |
16K |
100GB - 1TB |
32K |
1TB - 10TB |
64K |
10TB - 16TB |
128K |
OCFS2ボリュームのマウント
/etc/fstab
に_netdev
オプションを指定します。
myocfs2vol /dbvol1 ocfs2 _netdev,defaults 0 0
ノート:
ネットワーキングの開始後にo2cb
およびocfs2
サービスを開始するように有効化していない場合、ファイル・システムはマウントされません。クラスタ・スタックの構成を参照してください。
ボリューム・パラメータの問合せおよび変更
tunefs.ocfs2コマンドを使用して、ボリューム・パラメータの問合せおよび変更できます。たとえば、ボリュームのラベル、UUID、およびノード・スロット数を確認するには、次のコマンドを使用します。
sudo tunefs.ocfs2 -Q "Label = %V\nUUID = %U\nNumSlots =%N\n" /dev/sdb
Label = myvol UUID = CBB8D5E0C169497C8B52A0FD555C7A3E NumSlots = 4
ボリュームの新しいUUIDを生成します。
sudo tunefs.ocfs2 -U /dev/sda sudo tunefs.ocfs2 -Q "Label = %V\nUUID = %U\nNumSlots =%N\n" /dev/sdb
Label = myvol UUID = 48E56A2BBAB34A9EB1BE832B3C36AB5C NumSlots = 4
OCFS2のトラブルシューティング
次の項では、OCFS2で発生する問題を調査するために使用できるいくつかの方法について説明します。
デバッグ用の推奨ツール
oopsトレースを取得する場合、ノードでnetconsoleを設定することをお薦めします。
em2
のポート7777でTCPトラフィックを取得するには、次のようなコマンドを使用します。
sudo tcpdump -i em2 -C 10 -W 15 -s 10000 -Sw /tmp/`hostname -s`_tcpdump.log -ttt 'port 7777' &
ext3
ファイル・システムのdebugfsコマンドに動作が似ているdebugfs.ocfs2コマンドを使用して、OCFS2ドライバのイベントのトレース、ロック・ステータスの決定、ディクショナリ構造の再帰的検索、inodeの調査などを行うことができます。
詳細は、debugfs.ocfs2(8)
マニュアル・ページを参照してください。
o2imageコマンドでは、OCFS2ファイル・システムのメタデータ(inode、ファイル名およびディレクトリ名の情報を含む)を別のファイル・システムのイメージ・ファイルに保存できます。イメージ・ファイルはメタデータのみを格納するため、元のファイル・システムよりずっと小さくなります。debugfs.ocfs2を使用してイメージ・ファイルを開き、ファイル・システムのレイアウトを分析してファイル・システムの破損またはパフォーマンス問題の原因を特定できます。
たとえば、次のコマンドによって、デバイス/dev/sda2
上のOCFS2ファイル・システムからイメージ/tmp/sda2.img
が作成されます。
sudo o2image /dev/sda2 /tmp/sda2.img
詳細は、o2image(8)
マニュアル・ページを参照してください。
debugfsファイル・システムのマウント
OCFS2では、debugfs
ファイル・システムを使用して、ユーザー領域からそのカーネル内状態の情報へのアクセスを可能にしています。debugfs
ファイル・システムをマウントして、debugfs.ocfs2コマンドを使用できるようにする必要があります。
debugfs
ファイル・システムをマウントするには、次の行を/etc/fstab
に追加します。
debugfs /sys/kernel/debug debugfs defaults 0 0
次に、mount -aコマンドを実行します。
OCFS2トレースの構成
コマンド | 説明 |
---|---|
debugfs.ocfs2 -l |
すべてのトレース・ビットとそれらのステータスをリストします。 |
debugfs.ocfs2 -l SUPER allow |
スーパーブロックのトレースを有効にします。 |
debugfs.ocfs2 -l SUPER off |
スーパーブロックのトレースを無効にします。 |
debugfs.ocfs2 -l SUPER deny |
別のトレース・モード設定によって暗黙的に有効化されていても、スーパーブロックのトレースを禁止します。 |
debugfs.ocfs2 -l HEARTBEAT \ ENTRY EXIT allow |
ハートビート・トレースを有効にします。 |
debugfs.ocfs2 -l HEARTBEAT off \ ENTRY EXIT deny |
ハートビート・トレースを無効にします。 |
debugfs.ocfs2 -l ENTRY EXIT \ NAMEI INODE allow |
ファイル・システムのトレースを有効にします。 |
debugfs.ocfs2 -l ENTRY EXIT \ deny NAMEI INODE allow |
ファイル・システムのトレースを無効にします。 |
debugfs.ocfs2 -l ENTRY EXIT \ DLM DLM_THREAD allow |
DLMのトレースを有効にします。 |
debugfs.ocfs2 -l ENTRY EXIT \ deny DLM DLM_THREAD allow |
DLMのトレースを無効にします。 |
トレースを取得する方法の1つは、トレースを有効にしてしばらくの間スリープし、その後トレースを無効にすることです。次の例に示すとおり、不要な出力の表示を避けるには、終了後にトレース・ビットをデフォルト設定にリセットする必要があります。
sudo debugfs.ocfs2 -l ENTRY EXIT NAMEI INODE allow && sleep 10 && debugfs.ocfs2 -l ENTRY EXIT deny NAMEI INODE off
表示される情報量を制限するには、問題の理解に関係すると思われるトレース・ビットのみを有効にします。
mvなどの特定のファイル・システム・コマンドがエラーの原因であると思われる場合、次の例のコマンドを使用するとエラーのトレースに役立ちます。
sudo debugfs.ocfs2 -l ENTRY EXIT NAMEI INODE allow sudo mv source destination & CMD_PID=$(jobs -p %-) echo $CMD_PID sudo debugfs.ocfs2 -l ENTRY EXIT deny NAMEI INODE off
トレースは、マウントされたすべてのOCFS2ボリュームに対して有効になるため、適切なプロセスIDを把握することが、トレースの解釈に役立ちます。
詳細は、debugfs.ocfs2(8)
マニュアル・ページを参照してください。
ファイル・システム・ロックのデバッグ
-
debugファイル・システムをマウントします。
sudo mount -t debugfs debugfs /sys/kernel/debug
-
ファイル・システム・デバイス(この例では
/dev/sdx1
)のロック・ステータスをダンプします。echo "fs_locks" | debugfs.ocfs2 /dev/sdx1 >/tmp/fslocks 62
Lockres: M00000000000006672078b84822 Mode: Protected Read Flags: Initialized Attached RO Holders: 0 EX Holders: 0 Pending Action: None Pending Unlock Action: None Requested Mode: Protected Read Blocking Mode: Invalid
Lockres
フィールドは、DLMによって使用されるロック名です。ロック名は、ロック・タイプ識別子、inode番号および世代番号の組合せです。次のリストに、使用可能なロック・タイプを示します。-
D
: ファイル・データ。 -
M
: メタデータ -
R
: 名前変更 -
S
: スーパーブロック -
W
: 読取り/書込み
-
-
Lockres
値を使用して、ロックのinode番号および世代番号を取得します。sudo echo "stat <M00000000000006672078b84822>" | debugfs.ocfs2 -n /dev/sdx1
Inode: 419616 Mode: 0666 Generation: 2025343010 (0x78b84822) ...
-
次のコマンドを使用して、inode番号が関連付けられたファイル・システム・オブジェクトを特定します。
echo "locate <419616>" | debugfs.ocfs2 -n /dev/sdx1
419616 /linux-2.6.15/arch/i386/kernel/semaphore.c
-
ファイル・システム・オブジェクトに関連付けられたロック名を取得します。
echo "encode /linux-2.6.15/arch/i386/kernel/semaphore.c" | debugfs.ocfs2 -n /dev/sdx1
M00000000000006672078b84822 D00000000000006672078b84822 W00000000000006672078b84822
この例では、ファイル・システム・オブジェクトにメタデータ・ロック、ファイル・データ・ロックおよび読取り/書込みロックが関連付けられています。
-
ファイル・システムのDLMドメインを特定します。
echo "stats" | debugfs.ocfs2 -n /dev/sdX1 | grep UUID: | while read a b ; do echo $b ; done
82DA8137A49A47E4B187F74E09FBBB4B
-
次のコマンドでDLMドメインおよびロック名の値を使用して、DLMのデバッグを有効にします。
echo R 82DA8137A49A47E4B187F74E09FBBB4B M00000000000006672078b84822 > /proc/fs/ocfs2_dlm/debug
-
デバッグ・メッセージを調査します。
sudo dmesg | tail
struct dlm_ctxt: 82DA8137A49A47E4B187F74E09FBBB4B, node=3, key=965960985 lockres: M00000000000006672078b84822, owner=1, state=0 last used: 0, on purge list: no granted queue: type=3, conv=-1, node=3, cookie=11673330234144325711, ast=(empty=y,pend=n), bast=(empty=y,pend=n) converting queue: blocked queue:
DLMでは、ロックなし(
type=0
)、保護読取り(type=3
)および排他(type=5
)という3つのロック・モードがサポートされます。この例では、ロックはノード1 (owner=1
)によって所有され、ノード3にはファイル・システム・リソースに対する保護読取りロックが付与されています。 -
次のコマンドを実行し、
STAT
列のD
フラグによって示される中断不可能なスリープ状態にあるプロセスを検索します。ps -e -o pid,stat,comm,wchan=WIDE-WCHAN-COLUMN
中断不可能なスリープ状態にある1つ以上のプロセスが、他のノードでのハングに対応します。
flock()
)に影響する場合、問題はアプリケーションに存在する可能性があります。可能であれば、ロックの所有者を強制終了します。ハングの原因がメモリーの不足またはメモリーの断片化にある場合、重要でないプロセスを強制終了してメモリーを解放できます。最も迅速な解決策は、ロックを保持しているノードをリセットすることです。DLMリカバリ・プロセスは、無反応のノードが所有していたすべてのロックをクリアするため、クラスタは動作を継続できます。
フェンシングされたノードの動作の構成
echo panic > /sys/kernel/config/cluster/cluster_name/fence_method
前のコマンドのcluster_nameは、クラスタの名前です。システムを再起動するたびに値を設定するには、この行を/etc/rc.local
ファイルに追加します。デフォルトの動作に戻すには、panic
ではなく値reset
を使用します。
OCFS2の使用事例
次の項では、OCFS2の典型的な使用事例について説明します。
ロード・バランシング
OCFS2ノードを使用して、クライアント・システム間でリソースを共有できます。たとえば、ノードでは、SambaまたはNFSを使用して共有ファイル・システムをエクスポートできます。ノード間にサービス・リクエストを分散するには、ラウンドロビンDNSやネットワーク・ロード・バランサを使用するか、クライアントごとにどのノードを使用するかを指定します。
Oracle Real Application Cluster (RAC)
Oracle RACでは、独自のクラスタ・スタックであるクラスタ同期化サービス(CSS)を使用します。O2CBはCSSと組み合せて使用できますが、各スタックはタイムアウト、ノードおよび他のクラスタ設定に関して個別に構成できます。OCFS2を使用して投票ディスク・ファイルおよびOracle Cluster Registry (OCR)をホストすることはできますが、各ノードのローカル・ファイル・システムに存在する必要のあるグリッド・インフラストラクチャ・ユーザーのホームはホストできません。
CSSとO2CBは、両方とも定数の計算でタイ・ブレーカとして最も小さいノード番号を使用するため、ノード番号が両方のクラスタで同じであることを確認してください。必要に応じて、O2CB構成ファイル/etc/ocfs2/cluster.conf
を編集してノード番号に一貫性を確保し、すべてのノードでこのファイルを更新します。クラスタを再起動すると変更が有効になります。
Oracleデータベース
Oracleデータファイル、制御ファイル、REDOログ、投票ディスクおよびOCRをホストするボリュームをマウントする場合、noatime
オプションを指定します。noatime
オプションによって、inodeのアクセス時間の不要な更新が無効になります。
nointr
マウント・オプションを指定すると、シグナルによる進行中のI/Oトランザクションへの割込みを防ぐことができます。
デフォルトでは、init.ora
パラメータのfilesystemio_options
によって、Oracleデータファイル、制御ファイルおよびREDOログへの直接I/Oを実行するようにデータベースに指示します。また、投票ディスクおよびOCRを含むボリュームに対してdatavolume
マウント・オプションを指定する必要もあります。このオプションは、Oracleユーザーのホーム・ディレクトリまたはOracle E-Business Suiteをホストするボリュームには指定しないでください。
データベース・ブロックがディスク全体に断片化されることを避けるには、ファイル・システム・クラスタ・サイズが少なくともデータベース・ブロック・サイズ(通常は8KB)と同じ大きさである必要があります。mkfs.ocfs2コマンドにファイル・システムの用途タイプをdatafiles
として指定すると、ファイル・システム・クラスタ・サイズは128KBに設定されます。
mtime
)を更新しません。mtime
の値はメモリー内で更新されますが、OCFS2は、アプリケーションがファイルを拡張するか切り捨てないかぎり、またはtouchコマンドなどを使用してファイル・メタデータを変更する操作を実行しないかぎり、ディスクに値を書き込みません。この動作の結果として、同じファイルについて異なるタイムスタンプをレポートする異なるノードが出現します。次のコマンドを使用して、ファイルのディスク上のタイムスタンプを表示できます。
sudo debugfs.ocfs2 -R "stat /file_path" device | grep "mtime:"