Skip to content

O2CB クラスター管理

Oracle Cluster File System v2 (OCFS2) は、複数の仮想化ホスト間でアクティブ/アクティブの同時読み書き操作を実行するために設計された汎用共有ディスク・クラスターファイルシステムです。Vapor では、クラスターインフラストラクチャおよび分散ロック管理を O2CB (OCFS2 Cluster Base) スタックが処理します。

O2CB を使用することで、複数の Vapor ノードが同一の SAN LUN、iSCSI ターゲット、またはマルチパス NVMe-oF デバイスを同時にマウントでき、データの破損を起こすことなくインフラ全体で仮想マシンとクラスター化ストレージプールを並行稼働させることができます。


ハートビートモード

O2CB は 2 種類のハートビートメカニズムを通じてホストの健全性とクラスターのクオラムを監視します:

ハートビートモード説明推奨される用途
Local Heartbeat (デフォルト)マウントされた個々の OCFS2 ファイルシステムの専用ブロックにハートビートメタデータを直接書き込みます。専用デバイスが不要で構成がシンプルです。共有データストアが数個程度の小規模または単一ストレージ環境。
Global Heartbeatデータストアをマウントする前に、独立した専用のハートビート領域 (heartbeat region) ブロックデバイスに対して永続的なバックグラウンドサービスとしてハートビートを実行します。耐障害性を重視するマルチノードクラスター、エンタープライズ SAN/iSCSI 環境、または複数の共有データストアを持つ環境。

ローカルからグローバルハートビートへの移行

グローバルハートビートは、クラスターの健全性監視を個々のデータストアの I/O から分離します。個々のデータストアで一時的な I/O 遅延や停止が発生しても、専用のハートビートクオラムが正常である限り、ノードフェンシング(カーネルパニックや強制再起動)がトリガーされることはありません。

前提条件とアーキテクチャ

グローバルハートビートで完全な耐障害性を確保するには、すべてのクラスターノードにマッピングされた 3 つの共有ハートビート領域ブロックデバイスを構成し、独立したストレージプロバイダーまたは分散ストレージプールによってバックアップされることが理想的です(例: ストレージターゲット A 上の領域 1、ストレージターゲット B 上の領域 2、ストレージターゲット C 上の領域 3):

  • 共有ストレージのマッピング: クラスター内のすべてのホストは、3 つすべてのハートビートブロックデバイスをアタッチしてマッピングする必要があります。各ノードは 3 つすべての領域に割り当てられた独自のスロットへハートビートを書き込み、そこから他のノードのハートビートを読み取ります。
  • クオラムと耐障害性: O2CB は過半数クオラムルールを使用します。独立したストレージターゲットにまたがる 3 つのハートビート領域を使用することで、単一のストレージサーバーやネットワークパスで障害が発生しても 2/3 のアクティブクオラムが維持され、クラスターのフェンシングを防ぎます。
  • デバイスのサイズ: 専用のハートビートデバイスは、それぞれ 500 MB 〜 1 GiB 程度で十分です。大容量ディスクは不要です。
  • マルチパス/トランスポート: 冗長ネットワークインターフェース(マルチパス iSCSI、SAN ファブリック、NVMe-oF など)を介して、3 つのハートビートブロックデバイスをすべてのクラスターノードにマッピングします。
  • デバイスの可用性: 起動時に各ホストでブロックデバイスが永続的に検出・マッピングされるように構成してください。

移行手順(ステップ・バイ・ステップ)

アクティブなクラスターを Local から Global ハートビートモードへ移行するには、以下の手順を順番に実行します:

[ステップ 1: VM 静止化] ──► [ステップ 2: メンテナンス開始] ──► [ステップ 3: グローバル設定]

[ステップ 6: メンテ終了] ◄── [ステップ 5: SB メタデータ更新] ◄── [ステップ 4: 3領域追加]

ステップ 1: ワークロード/VM の静止化 (Quiesce)

クラスター全体のハートビートパラメータを変更する前に、共有データストア上のすべてのアクティブな I/O を停止する必要があります:

  1. 実行中の仮想マシンを対象クラスター外のストレージプールへライブマイグレーションするか、VM を正常にシャットダウンします。
  2. OCFS2 マウントポイントに対して開かれたファイルハンドルを保持しているプロセスやコンテナがないことを確認します。

ステップ 2: 全ノードでメンテナンスモードを開始

ハートビートモードを変更する前に、クラスター内のすべてのノードで共有データストアをアンマウントし、O2CB カーネルスタックから登録解除する必要があります:

  1. Vapor Web コンソールで、Storage > O2CB Cluster に移動します。
  2. 各ノードで Enter Maintenance をクリックします。
  3. Vapor はアクティブなロックを検証し、すべてのアクティブな OCFS2 ファイルシステムを安全にアンマウントして、ローカルハートビートを停止し、実行中のカーネルメモリからクラスターを登録解除します。

ステップ 3: ハートビートモードを Global に切り替え

  1. いずれかのクラスターノードで、上部ヘッダーのアクションメニュー()を開き、Set Heartbeat Mode (global) をクリックします。
  2. 確認ダイアログで、モードを local から global に変更することを確認します。
  3. Vapor は /etc/ocfs2/cluster.confheartbeat_mode = global に更新し、クラスターメンバー間で変更を複製します。

ステップ 4: 3 つのハートビート領域デバイスを追加

  1. Heartbeat Regions カードで、Add Heartbeat をクリックします。
  2. 最初の共有ハートビート LUN のブロックデバイスパス(例: /dev/mapper/mpath-hb1/dev/sdb)を入力します。
  3. Create をクリックします。
    • ブロックデバイスが未フォーマットの生デバイス($\le 1\text{ GiB}$)の場合、Vapor は自動的に mkfs.ocfs2 --global-heartbeat で初期化し、領域 UUID を抽出します。
  4. 領域 2 と領域 3 についても同様の手順を繰り返します。

ステップ 5: 既存データストアのディスク上クラスタースタックメタデータを更新

OCFS2 ボリュームが最初にローカルハートビートモードでフォーマットされた場合、ディスク上のスーパーブロックには local と記録されています。実行中の O2CB カーネルスタックがグローバルモードのときにローカルモードのボリュームをマウントしようとすると、以下のエラーで失敗します: mount.ocfs2: Heartbeat mode is invalid while trying to join the group

新しいグローバルハートビートスタックに合わせて既存のデータストアを更新するには:

  1. 共有データストアのブロックデバイスまたは WWN パスを特定します(例: /dev/disk/by-id/wwn-0x60000...)。
  2. ディスク上のクラスタースタックと稼働中のスタックを確認します:
    bash
    sudo o2cluster -o /dev/disk/by-id/<wwn-id>
    # 出力例: o2cb,<cluster-name>,local
  3. ファイルシステムがアンマウントされている状態で、ディスク上のスーパーブロックを更新します:
    bash
    sudo tunefs.ocfs2 --update-cluster-stack /dev/disk/by-id/<wwn-id>
    (確認プロンプトが表示されたら y を入力)
  4. ディスク上のスタックが一致したことを確認します:
    bash
    sudo o2cluster -o /dev/disk/by-id/<wwn-id>
    # 出力例: o2cb,<cluster-name>,global
    (注意: これにより共有ディスクのスーパーブロックが更新されるため、1 つのノードでこのコマンドを実行すれば、すべてのクラスターメンバーに自動的に反映されます)。

ステップ 6: ハートビートを開始してメンテナンスモードを終了

  1. Vapor Web コンソールで、Sync to Kernel をクリックして新しいクラスター設定とノードを登録します。
  2. Actions (⋮) > Start Heartbeat を選択して、カーネル内で 3 つのグローバルハートビート領域を開始します。
  3. 各ノードで Exit Maintenance をクリックします。
  4. Vapor はストレージプールを起動し、OCFS2 共有ファイルシステムを再マウントして、すべての仮想化ストレージプールをオンラインに戻します。
  5. 仮想マシンを起動するか、共有ストレージプールへマイグレーションして戻します。

Vapor Web コンソールでの O2CB 管理

Vapor の Web コンソールで、Storage > O2CB Cluster に移動して O2CB クラスターの状態を管理および監視します。

1. クラスターのステータスと操作

上部のカードにはリアルタイムのステータスと操作コントロールが表示されます:

  • クラスター情報: 有効なクラスター名、ハートビートモード、構成済みノード総数、およびアクティブなハートビート領域数を表示します。
  • ステータスバッジ:
    • Online(緑): クラスターがカーネルメモリに登録されアクティブです。
    • Offline(グレー): クラスターが停止または登録解除されています。
    • Not in Kernel(黄): 設定ファイルには存在しますが、カーネルに登録されていません。
  • 主なアクション:
    • Register Cluster / Sync to Kernel: cluster.conf を自動解析し、実行中のカーネルメモリに全ノードを同期します。
    • Enter Maintenance / Exit Maintenance: ホストのメンテナンス作業前に、アクティブなファイルシステムを安全にアンマウントし、クラスターから登録解除します。
  • アクションメニュー ():
    • Start Heartbeat / Stop Heartbeat: グローバルハートビートサービスの開始/停止(グローバルモードのみ)。
    • Set Heartbeat Mode: localglobal のハートビートモードを切り替えます。
    • Unregister Cluster: カーネルメモリからクラスターオブジェクトをアンロードします。
    • Delete Cluster: /etc/ocfs2/cluster.conf からクラスター定義を削除します。

2. ノード管理

Nodes セクションでは、クラスターメンバーの確認、追加、削除が行えます:

+---------------------------------------------------------------------------------------------------+
| Node Name    Number    IP Address       Port     Status                          Actions          |
+---------------------------------------------------------------------------------------------------+
| reg2-1       1         10.99.16.20      7777     [Local] [✓ In Kernel]          —                |
| reg2-2       2         10.99.16.21      7777     [✓ In Kernel]                   [Remove]         |
| reg2-3       3         10.99.16.22      7777     [✓ In Kernel]                   [Remove]         |
| reg2-4       4         10.99.16.250     7777     [⚠ Not in Kernel]               [Remove]         |
+---------------------------------------------------------------------------------------------------+

ノードステータスインジケーター:

  • Local バッジ: このノードが現在アクセスしているローカルの Vapor ホストであることを示します。
  • ✓ In Kernel(緑バッジ): 稼働中の Linux カーネルメモリでノードが正常に認識されていることを確認します。
  • ⚠ Not in Kernel(黄バッジ): ノードが /etc/ocfs2/cluster.conf に定義されているものの、実行中のカーネルメモリに読み込まれていない状態を示します。Sync to Kernel をクリックしてオンライン登録してください。

ノードの追加:

  1. Nodes の下にある Add Node フォームを展開します。
  2. Node Name(例: n04host-4)、Node Number(スロット番号)、IP Address、および Port(デフォルト 7777)を入力します。
  3. Add Node をクリックします。
  4. Vapor はノードを /etc/ocfs2/cluster.conf に保存し、即座にオンライン登録を実行してダウンタイムなしでカーネルメモリへ同期します。

ノードの削除:

  • ノードの横にある Remove をクリックすると、設定ファイルから該当エントリが削除されます。

3. ハートビート領域 (グローバルモード)

グローバルハートビートモードが有効な場合、Heartbeat Regions セクションで次の操作を行えます:

  • ブロックデバイスのパス(例: /dev/mapper/mpatha/dev/sdb)を追加してクラスターハートビートに参加させる。
  • 不要になったまたは廃止されたハートビートデバイスを削除する。

メンテナンスモードのワークフロー

ストレージネットワークに影響を及ぼす作業(スイッチのファームウェア更新、マルチパスの再構成、HBA/NIC の交換など)を行う前に、ホストをメンテナンスモードに設定してください:

  1. クラスターヘッダーの Enter Maintenance をクリックします。
  2. Vapor が安全性の事前チェックを実行します:
    • マウントされているすべての OCFS2 ファイルシステムを特定。
    • 仮想マシンの仮想ディスクやアクティブなワークロードがストレージを使用していないか検証。
  3. すべてのアクティブな OCFS2 ストレージプールを正常にアンマウントします。
  4. ハートビートサービスを停止し、O2CB スタックからノードを登録解除します。
  5. 物理的な作業が完了したら、Exit Maintenance をクリックしてクラスターを再登録し、ハートビートを開始して共有データストアを再マウントします。

VM がアクティブな状態での強制アンマウントは厳禁です

アクティブな OCFS2 ファイルシステムをアンマウントせずにホストを突然停止させると、スプリットブレインによるデータ破損を防ぐために O2CB のセルフフェンシング(カーネルパニックまたは強制即時再起動)がトリガーされます。


REST API リファレンス

Vapor は O2CB クラスター管理用の完全な REST API を提供します:

メソッドエンドポイント説明
GET/storage/o2cb/clusters構成されているすべての O2CB クラスターを一覧表示。
POST/storage/o2cb/clusters新しい O2CB クラスター定義を作成。
GET/storage/o2cb/clusters/{name}クラスターの詳細設定およびノード一覧を取得。
DELETE/storage/o2cb/clusters/{name}O2CB クラスター設定を削除。
GET/storage/o2cb/clusters/{name}/statusクラスターのライブカーネル状態を照会。
POST/storage/o2cb/clusters/{name}/registerクラスターを動的に登録し、ノードをカーネルに同期。
POST/storage/o2cb/clusters/{name}/unregisterカーネルメモリからクラスターの登録を解除。
GET/storage/o2cb/clusters/{name}/nodesカーネル状態を含む構成済みメンバーノード一覧を取得。
POST/storage/o2cb/clusters/{name}/nodes新規メンバーノードを追加し、オンラインで自動登録。
DELETE/storage/o2cb/clusters/{name}/nodes/{node}メンバーノードを削除。
GET/storage/o2cb/clusters/{name}/heartbeats構成されているすべてのハートビート領域を取得。
POST/storage/o2cb/clusters/{name}/heartbeatsハートビート領域デバイスを追加。
DELETE/storage/o2cb/clusters/{name}/heartbeats/{device}ハートビート領域デバイスを削除。
PUT/storage/o2cb/clusters/{name}/heartbeat-modeハートビートモードを設定(local または global)。
GET/storage/o2cb/clusters/{name}/maintenance/preflightメンテナンスモード開始前の事前チェックを実行。
POST/storage/o2cb/clusters/{name}/maintenance/enter安全に O2CB メンテナンスモードを開始。
POST/storage/o2cb/clusters/{name}/maintenance/exitメンテナンスモードを終了し、データストアを再マウント。

CLI リファレンス

SSH またはコンソールアクセス権を持つ管理者は、標準の CLI ツールを使用して O2CB の状態を確認できます:

bash
# カーネルメモリ内のクラスター状態を確認
sudo o2cb cluster-status <クラスター>

# 設定を実行中のカーネルに登録
sudo o2cb register-cluster <クラスター>

# カーネルからクラスター登録を解除
sudo o2cb unregister-cluster <クラスター>

# カーネル configfs 内のアクティブノードを確認
ls -la /sys/kernel/config/cluster/<クラスター>/node/

# グローバルハートビートサービスの開始と停止
sudo o2cb start-heartbeat <クラスター>
sudo o2cb stop-heartbeat <クラスター>

# ディスク上のクラスタースタックと稼働中スタックの確認
sudo o2cluster -o /dev/disk/by-id/<device>
sudo o2cluster -r

# 稼働中のクラスターに合わせてディスク上のファイルシステムクラスタースタックを更新
sudo tunefs.ocfs2 --update-cluster-stack /dev/disk/by-id/<device>

トラブルシューティングとベストプラクティス

1. 「Not in Kernel」ノードの不整合の解決

  • 原因: ノードが /etc/ocfs2/cluster.conf に直接追記されたか、クラスターがオフラインのときに追加されました。
  • 対処法: Vapor UI の Sync to Kernel ボタンをクリックするか、CLI で sudo o2cb register-cluster <クラスター名> を実行します。

2. ネットワークファイアウォールの要件

  • 参加するすべてのクラスターノードは、TCP ポート 7777 で双方向通信できる必要があります。ストレージネットワークインターフェース間で通信を許可してください:
    bash
    sudo ufw allow 7777/tcp
    # または firewalld:
    sudo firewall-cmd --permanent --add-port=7777/tcp && sudo firewall-cmd --reload

3. マウント時のハートビートモード不一致

  • 現象: mount.ocfs2: Heartbeat mode is invalid while trying to join the group
  • 原因: 稼働中のクラスターが global ハートビートモードであるのに対し、ディスク上のファイルシステムが local モードとして記録されている。
  • 対処法: ボリュームがアンマウントされた状態で sudo tunefs.ocfs2 --update-cluster-stack /dev/disk/by-id/<device> を実行します。

4. フェンシングとクオラムルール

  • OCFS2 は過半数クオラムアルゴリズムを使用します。ノード間で通信が途絶した場合、データの整合性を保護するために少数派パーティションは自動的にセルフフェンシング(即時再起動)します。ストレージインターフェースには必ず冗長ネットワークリンク(Bonding / マルチパス)を構成してください。