適用先 SUSE Linux Enterprise High Availability Extension 12

17 ストレージ保護

High Availabilityクラスタスタックでは、データの整合性の保護が最優先されます。これは、データストレージへの未調整の同時アクセスを防止することによって達成されます。たとえば、Ext3ファイルシステムは、クラスタに一回だけマウントされ、OCFS2ボリュームは、他のクラスタノードとの調整が可能になるまでマウントされません。正常に機能するクラスタでは、Pacemakerによって、リソースがそれらの同時並行性の制限を超えてアクティブであるかどうかが検出され、復元が開始されます。さらに、そのポリシーエンジンがそれらの制限を超えることは決してありません。

ただし、ネットワークのパーティション分割やソフトウェアの誤動作により、いくつものコーディネータが選択される状況となる可能性があります。このいわゆるスプリットブレインシナリオが発生した場合は、データが破損することがあります。したがって、このリスクを軽減するため、クラスタスタックには、いくつもの保護レイヤが追加されています。

この目的に貢献する第一のコンポーネントは、IOフェンシング/STONITHです。これにより、ストレージアクティベーション以前の他のすべてのアクセスが確実に終了されるからです。その他のメカニズムとしては、管理やアプリケーションの欠陥に対してシステムを保護するcLVM2の排他的アクティベーションやOCFS2のファイルロッキングサポートがあります。これらをご使用のセットアップに適合するように組み合わせると、スプリットブレインシナリオの悪影響を確実に防止できます。

この章では、ストレージ自体を活用するIOフェンシングについて説明し、次に、排他的ストレージアクセスを確保する追加保護レイヤについて説明します。これら2つのメカニズムを組み合わせると、より高度な保護を実現できます。

17.1 ストレージベースのフェンシング

1つ以上のSTONITHブロックデバイス(SBD)、watchdogサポート、external/sbd STONITHエージェントを使用することで、スプリットブレインシナリオを確実に回避することができます。

17.1.1 概要

すべてのノードが共有ストレージへのアクセスを持つ環境で、デバイスの小さなパーティションをSBDで使用できるようにフォーマットします。パーティションのサイズは、使用されるディスクのブロックサイズによって異なります(512バイトのブロックサイズの標準SCSIディスクには1MB、4KBブロックサイズのDASDディスクには4MB必要です)。SBDは、そのデーモンの設定後、クラスタスタックの他のコンポーネントが起動される前に各ノードでオンラインになります。SBDデーモンは、他のすべてのクラスタコンポーネントがシャットダウンされた後で終了されます。したがって、クラスタリソースがSBDの監督なしでアクティブになることはありません。

このデーモンは、自動的に、パーティション上のメッセージスロットの1つを自分自身に割り当て、自分へのメッセージがないかどうか、そのスロットを絶えず監視します。デーモンは、メッセージを受信すると、ただちに要求に従います(フェンシングのための電源切断や再起動サイクルの開始など)。

デーモンは、ストレージデバイスへの接続性を絶えず監視し、パーティションが到達不能になった場合は、デーモン自体が終了します。このため、デーモンがフェンシングメッセージから切断されることはありません。これは、クラスタデータが別のパーティション上の同じ論理ユニットにある場合、追加障害ポイントになることはありません。ストレージ接続を失えば、ワークロードは終了します。

保護は、watchdogサポートによって増大します。近代的なシステムは、ソフトウェアコンポーネントによってチックルまたはフィードされる必要のあるhardware watchdogをサポートします。ソフトウェアコンポーネント(通常はデーモン)は、watchdogに定期的にサービスパルスを書き込みます。デーモンがwatchdogへのフィードを停止する場合、ハードウェアはシステムの再起動を強制します。この機能は、SBDプロセス自体の障害(IOエラーで終了またはスタックするなど)に対する保護を提供します。

Pacemaker統合が有効になっている場合、デバイスの過半数が失われてもSBDはセルフフェンスを行いません。たとえば、クラスタにA、B、Cの3つのノードが含まれており、ネットワーク分割によってAには自分自身しか表示できず、BとCはまだ通信可能な状態であるとします。この場合、2つのクラスタパーティションが存在し、1つは過半数(B、C)であるためにクォーラムがあり、もう1つにはクォーラムがない(A)ことになります。過半数のフェンシングデバイスに到達できないときにこれが発生した場合、ノードAはすぐに自らダウンしますが、BとCは引き続き実行されます。

17.1.2 SBDデバイスの数

SBDは、1~3台のデバイスの使用をサポートします。

1台のデバイス

最も単純な実装です。すべてのデータが同じ共有ストレージ上にあるクラスタに適しています。

2台のデバイス

この設定は、主に、ホストベースのミラーリングを使用しているものの3つ目のストレージデバイスが使用できない環境で役立ちます。1つのミラーログにアクセスできなくなっても、SBDは終了せず、クラスタは引き続き実行できます。ただし、SBDにはストレージの非同期分割を検出できるだけの情報が与えられていないので、ミラーログが1つだけ使用可能なときにもう一方をフェンスすることはありません。つまり、ストレージアレイのいずれかがダウンしたときに、2つ目の障害に自動的に耐えることはできません。

3台のデバイス

最も信頼性の高い設定です。障害または保守による1台のデバイスの機能停止から回復できます。SBDは複数のデバイスが失われた場合のみ自らを終了させます。2つ以上のデバイスにまだアクセス可能であれば、フェンシングメッセージを正しく送信することができます。

この設定は、ストレージが1つのアレイに制約されていない、比較的複雑なシナリオに適しています。ホストベースのミラーリングソリューションでは、1つのミラーログに1つのSBDを設定し(自分自身はミラーしない)、iSCSI上に追加のタイブレーカを設定できます。

17.1.3 ストレージベースの保護のセットアップ

ストレージベースの保護を設定するには、次の手順に従う必要があります。

次の手順は、すべてrootとして実行する必要があります。手順を開始する前に、次の要件が満たされているかどうか確認してください。

重要
重要: 要件
  • 環境内にすべてのノードが到達できる共有ストレージが存在する必要があります。

  • 共有ストレージセグメントが、ホストベースのRAID、cLVM2、DRBD*を使用してはなりません。

  • ただし、信頼性向上のため、ストレージベースのRAIDとマルチパスの使用は推奨されます。

17.1.3.1 SBDパーティションの作成

デバイスの起動時に1MBのパーティションを作成することを推奨します。SBDデバイスがマルチパスグループ上にある場合は、MPIOのパスダウン検出によって遅延が発生することがあるので、SBDが使用するタイムアウトを調整する必要があります。msgwaitタイムアウト後、メッセージがノードに配信されたと想定されます。この時間は、マルチパスの場合、MPIOがパスの障害を検出し、次のパスに切り替えるために必要な時間です。これは、ご使用の環境でテストする必要があるかもしれません。ノード上で実行しているSBDデーモンがウォッチドッグタイマを十分な速さで更新していない場合、ノード自体が終了します。選択したタイムアウトを特定の環境でテストします。1台のSBDデバイスしかないマルチパスストレージを使用する場合は、発生したフェールオーバーの遅延に特別の注意を払ってください。

注記
注記: SBDパーティションのデバイス名

次の手順では、このSBDパーティションを/dev/SBDで参照します。これは、ご使用の実際のパス名で置き換えてください(たとえば、/dev/sdc1)。

重要
重要: 既存データの上書き

SBD用に使用するデバイスには、何もデータがないようにしてください。sdbコマンドは、さらに確認を要求せずに、デバイスを上書きします。

  1. 次のコマンドで、SBDデバイスを初期化します。

    root # sbd -d /dev/SBD create

    これによって、デバイスにヘッダが書き込まれ、デフォルトのタイミングでこのデバイスを共有する最大255ノードのスロットが作成されます。

    SBD用に複数のデバイスを使用する場合は、次のように、-dオプションを複数回指定することでデバイスを設定します。

    root # sbd -d /dev/SBD1 -d /dev/SBD2 -d /dev/SBD3 create
  2. SBDデバイスがマルチパスグループ上にある場合は、SBDが使用するタイムアウトを調整します。これは、SBDデバイスの初期化時に指定できます(すべてのタイムアウトは秒単位で指定)。

    root # /usr/sbin/sbd -d /dev/SBD -4 1801 -1 902 create

    1

    -4オプションはmsgwaitタイムアウトを指定するために使用されます。上の例では、180秒に設定されます。

    2

    -1オプションはwatchdogタイムアウトを指定するために使用されます。上の例では、90秒に設定されます。

  3. 次のコマンドで、デバイスに何が書き込まれたか確認します。

    root # sbd -d /dev/SBD dump 
    Header version     : 2
    Number of slots    : 255
    Sector size        : 512
    Timeout (watchdog) : 5
    Timeout (allocate) : 2
    Timeout (loop)     : 1
    Timeout (msgwait)  : 10

ご覧のように、タイムアウトがヘッダにも保存され、それらに関するすべての参加ノードの合意が確保されます。

17.1.3.2 ソフトウェアウォッチドッグのセットアップ

ウォッチドッグを他のソフトウェアが使用していない場合は、ウォッチドッグがシステムをSBD障害から保護します。

重要
重要: ウォッチドッグタイマへのアクセス

他のソフトウェアは、ウォッチドッグタイマにアクセスしないでください。一部のハードウェアベンダーは、システムのリセット用にウォッチドッグを使用するシステム管理ソフトウェアを提供しています(たとえば、HP ASRデーモンなど)。ウォッチドッグをSBDで使用する場合は、そのようなソフトウェアを無効にしてください。

SUSE Linux Enterprise High Availability Extensionでは、カーネル内のウォッチドッグサポートはデフォルトで有効化されています。これは、ハードウェア指定のウォッチドッグドライバを提供する、さまざまなカーネルモジュールを標準装備しています。High Availability ExtensionはウォッチドッグにフィードするソフトウェアコンポーネントとしてSBDデーモンを使用します。17.1.3.3項 「SBDデーモンの起動」で説明されているとおりに設定した場合、それぞれのノードをsystemctl start pacemaker.serviceでオンラインにする際に、SBDデーモンが自動的に開始されます。

通常、ハードウェアに適したウォッチドッグドライバがシステムブート中に自動的にロードされます。softdogが最も一般的なドライバですが、実際のハードウェア統合のあるドライバの使用を推奨します。例:

  • HPハードウェアでは、これは、hpwdtドライバで行います。

  • Intel TCOを含むシステムでは、iTCO_wdtドライバを使用できます。

選択肢のリストについては、/usr/src/KERNEL_VERSION/drivers/watchdogを参照してください。または、次のコマンドで、ご使用のカーネルバージョンでインストールされたドライバをリストで表示します。

root # rpm -ql kernel-VERSION | grep watchdog

ほとんどのウォッチドッグドライバ名はwdwdt、またはdogなどの文字列を含むため、次のコマンドを使用して、現在ロードされているドライバを確認します。

root # lsmod | egrep "(wd|dog)" 

ウォッチドッグドライバを自動的にロードするには、ドライバ名を示した行を含む/etc/modules-load.d/watchdog.confというファイルを作成します。詳細については、modules-load.dのマニュアルページを参照してください。

ウォッチドッグのタイムアウトを変更する場合は、他の2つの値(msgwaitおよびstonith-timeout)も変更する必要があります。ウォッチドッグタイムアウトは主に、ストレージレイテンシに基づくものです。この値は、ほとんどのデバイスで、このタイムフレーム内に読み込み操作を正常に完了する必要があることを指定しています。完了しない場合、ノードは自己フェンシングします。

次の式は、これら3つの値の関係を簡潔に示しています。

例 17.1 STONITHデバイスとしてSBDを使用したクラスタのタイミング
Timeout (msgwait) = (Timeout (watchdog) * 2)
stonith-timeout = Timeout (msgwait) + 20%

たとえば、タイムアウトウォッチドッグを120に設定した場合は、msgwaitを240に、stonith-timeoutを288に設定する必要があります。cs_make_sbd_devicesにより出力を確認できます。

root # cs_make_sbd_devices --dump
==Dumping header on disk /dev/sdb
Header version     : 2.1
UUID               : 619127f4-0e06-434c-84a0-ea82036e144c
Number of slots    : 255
Sector size        : 512
Timeout (watchdog) : 20
Timeout (allocate) : 2
Timeout (loop)     : 1
Timeout (msgwait)  : 40
==Header on disk /dev/sdb is dumped

新しいクラスタをセットアップした場合は、ha-cluster-initコマンドで、先に示した考慮事項を反映できます。

17.1.3.3 SBDデーモンの起動

SBDデーモンは、クラスタスタックの不可欠なコンポーネントです。このデーモンは、クラスタスタックの実行中や、あるいはクラスタスタックの一部がクラッシュしたときでも、実行している必要があります。そうすれば、クラスタスタックをフェンシングできます。

  1. ブート時のSBDデーモンの起動を有効にするには、次のコマンドを使用します。

    root # systemctl enable sbd.service
  2. ha-cluster-initを実行します。このスクリプトによりSBDが正しく設定され、設定ファイル/etc/sysconfig/sbdが、Csync2で同期される必要のあるファイルのリストに追加されます。

    SBDを手動で設定する場合は、次の手順を実行します。

    CorosyncのinitスクリプトでSBDを開始および停止するには、ファイル/etc/sysconfig/sbdを編集し、次の行を検索して、SBDをSBDデバイスで置き換えます。

    SBD_DEVICE="/dev/SBD"

    1行目で複数のデバイスを指定する必要がある場合は、セミコロンで区切って指定します(デバイスの順序は任意で構いません)。

    SBD_DEVICE="/dev/SBD1; /dev/SBD2; /dev/SBD3"

    SBDデバイスがアクセス不能な場合は、SBDデーモンが開始できなくなり、Corosyncの起動を抑止します。

    注記
    注記: ブート時にサービスを開始

    SBDデバイスがノードからアクセスできなくなった場合は、ノードが無限の再起動サイクルに入ることあります。これは技術的には正しい振る舞いですが、管理ポリシーによっては、まず間違いなく面倒な問題となるでしょう。そのような場合には、ブート時にCorosyncおよびPacemakerを自動的に開始しないのがよいでしょう。

  3. 先に進む前に、systemctl restart pacemaker.serviceを実行して、SBDがすべてのノード上で開始しているようにします。

17.1.3.4 SBDのテスト

  1. 次のコマンドを使用すると、ノードスロットとそれらの現在のメッセージがSBDデバイスからダンプされます。

    root # sbd -d /dev/SBD list

    ここに、SBDとともに起動されたすべてのクラスタノードが一覧され、メッセージスロットにはclearが表示されるはずです。

  2. ノードの1つにテストメッセージを送信してみます。

    root # sbd -d /dev/SBD message nodea test
  3. ノードがシステムログファイルにメッセージの受信を記録します。

    Aug 29 14:10:00 nodea sbd: [13412]: info: Received command test from nodeb

    これによって、SBDがノード上で実際に機能し、メッセージを受信できることが確認されます。

17.1.3.5 フェンシングリソースの設定

  1. SBDのセットアップを完了するには、次のように、SBDをCIB内でSTONITH/フェンシングメカニズムとしてアクティブにします。

    root # crm configure
    crm(live)configure# property stonith-enabled="true"
    crm(live)configure# property stonith-timeout="40s"
    crm(live)configure# primitive stonith_sbd stonith:external/sbd \
       op start interval="0" timeout="15" start-delay="10"
    crm(live)configure# commit
    crm(live)configure# quit

    リソースのクローンを作成する必要はありません。どちらにせよ問題が発生すればそれぞれのノードをシャットダウンすることになるからです。

    どの値がstonith-timeoutに設定されているかは、msgwaitタイムアウトによって異なります。msgwaitタイムアウトは、基盤のIOシステムで許可されている最大タイムアウトより長い必要があります。たとえば、プレーンなSCSIディスクの場合は、30秒です。msgwaitタイムアウト値を30秒に設定する場合、stonith-timeoutを40秒に設定すると適切です。

    ノードスロットは自動的に割り当てられるので、手動のホストリストを定義する必要はありません。

  2. 以前設定した他のフェンシングデバイスを無効にします。現在、この機能にはSBDメカニズムが使用されるからです。

一度リソースが起動すれば、クラスタは共有ストレージフェンシング用に正常に設定されます。クラスタは、ノードのフェンシングが必要になると、この方法を使用します。

17.1.3.6 sg_persistリソースの設定

  1. rootとしてログインし、シェルを起動します。

  2. 設定ファイル/etc/sg_persist.confを作成します。

    sg_persist_resource_MDRAID1() {
          devs="/dev/sdd /dev/sde"
          required_devs_nof=2
    }
  3. 次のコマンドを実行して、プリミティブリソースsg_persistを作成します。

    root # crm configure
    crm(live)configure# primitive sg ocf:heartbeat:sg_persist \
        params config_file=/etc/sg_persist.conf \
               sg_persist_resource=MDRAID1 \
               reservation_type=1 \
        op monitor interval=60 timeout=60
  4. sg_persistプリミティブをマスタ-スレーブグループに追加します。

    crm(live)configure# ms ms-sg sg \
        meta master-max=1 notify=true
  5. aliceサーバ上にマスタを設定し、bobノード上にスレーブを設定します。

    crm(live)configure# location ms-sg-alice-loc ms-sg inf: alice
    crm(live)configure# location ms-sg-bob-loc ms-sg 100: bob
  6. いくつかのテストをします。リソースがマスタ/スレーブステータスの場合は、マスタサーバ上で、/dev/sdc1をマウントして、書き込むことができます。ただし、スレーブサーバ上では書き込むことができません。

通常、Filesystemリソース(たとえば、OCFS2)でこのリソースを使用したい場合があります。この場合、次の手順を実行する必要があります。

  1. OCFS2プリミティブを追加します。

    crm(live)configure# primitive ocfs2 ocf:heartbeat:Filesystem \
        params device="/dev/sdc1" directory="/mnt/ocfs2" fstype=ocfs2
  2. ベースグループからクローンを作成します。

    crm(live)configure# clone cl-group basegroup
  3. ms-sgcl-groupの関係を追加します。

    crm(live)configure# colocation ocfs2-group-on-ms-sg inf: cl-group ms-sg:Master
    crm(live)configure# order ms-sg-before-ocfs2-group inf: ms-sg:promote cl-group
  4. editコマンドで、すべての変更内容を確認します。

  5. 変更をコミットします.

17.1.3.7 その他の情報

http://www.linux-ha.org/wiki/SBD_Fencing

17.2 排他的ストレージアクティベーションの確保

このセクションでは、共有ストレージへのアクセスを1つのノードに排他的にロックする低レベルの追加メカニズムであるsfexを紹介します。ただし、sfexは、STONITHと置き換えることはできないので注意してください。sfexには共有ストレージが必要なので、上記で説明したexternal/sbdフェンシングメカニズムは、ストレージの別のパーティションで使用することをお勧めします。

設計上、sfexは、同時並行性を必要とするワークロード(OCFS2など)とともに使用することはできませんが、従来のフェールオーバースタイルのワークロードの保護層として機能します。これは、実際にはSCSI-2予約と似ていますが、もっと一般的です。

17.2.1 概要

共有ストレージ環境では、ストレージの小さなパーティションが1つ以上のロックの保存用に確保されます。

ノードは、保護されたリソースを取得する前に、まず、保護ロックを取得する必要があります。順序は、Pacemakerによって強制され、sfexコンポーネントは、Pacemakerがスプリットブレイン条件に制約されても、ロックが2回以上付与されないことを保証します。

ノードのダウンが永続的にロックをブロックせず、他のノードが続行できるように、これらのロックも定期的に更新される必要があります。

17.2.2 設定

次に、sfexで使用する共有パーティションの作成方法と、CIBでsfexロック用にリソースを設定する方法を説明します。1つのsfexパーティションは任意の数のロックを保持できますが、デフォルトは1に設定されています。ロックごとに1KBのストレージスペースを割り当てる必要があります。

重要
重要: 要件
  • sfex用の共有パーティションは、保護するデータと同じ論理ユニットにある必要があります。

  • 共有されたsfexパーティションは、ホストベースのRAIDやDRBDを使用してはなりません。

  • cLVM2論理ボリュームの使用は可能です。

手順 17.1 sfexパーティションを作成する
  1. sfexで使用する共有パーティションを作成します。このパーティションの名前を書き留め、以降の手順の/dev/sfexをこの名前で置き換えます。

  2. 次のコマンドで、sfexメタデータを作成します。

    root # sfex_init -n 1 /dev/sfex
  3. メタデータが正しく作成されたかどうか検証します。

    root # sfex_stat -i 1 /dev/sfex ; echo $?

    現在、ロックがかかっていないので、このコマンドは、2を返すはずです。

手順 17.2 sfexロック用リソースを設定する
  1. sfexロックは、CIB内のリソースを介して表現され、次のように設定されます。

    crm(live)configure# primitive sfex_1 ocf:heartbeat:sfex \
    #	params device="/dev/sfex" index="1" collision_timeout="1" \
          lock_timeout="70" monitor_interval="10" \
    #	op monitor interval="10s" timeout="30s" on_fail="fence"
  2. sfexロックによってリソースを保護するには、保護対象とsfexリソース間の必須の順序付けと配置の制約を作成します。保護対象のリソースがfilesystem1というIDを持つ場合は、次のようになります。

    crm(live)configure# order order-sfex-1 inf: sfex_1 filesystem1
    crm(live)configure# colocation colo-sfex-1 inf: filesystem1 sfex_1
  3. グループ構文を使用する場合は、sfexリソースを最初のリソースとしてグループに追加します。

    crm(live)configure# group LAMP sfex_1 filesystem1 apache ipaddr

17.3 その他の情報

http://www.linux-ha.org/wiki/SBD_Fencingおよびman sbdを参照してください。

このページを印刷