• フェールオーバー クラスターのハートビートについて

    *1   2013/8/27  Windows Server 2008 以降の動作についての補足を追記しました。

    こんにちは。Windows プラットフォーム サポートの戸田です。

    日々のサポート業務の中で、よくお問い合わせを頂く内容についてご紹介します。

    今回は MSCS や WSFC でときどきお問い合わせを頂く「ハートビート」についての記事となります。新旧クラスター関連の記事で使用されている 「ハートビート (Heart beat)」 という表現について、この場を借りて一旦整理したいと思います。また、ハートビートに関する設定値についてもご紹介します。

    まず、一般的にコンピューター用語のハートビートとは分散コンピューティングにおいて相手コンピュータの生存確認を行うための仕組みです。フェールオーバー クラスターの用語では、ハートビート ネットワークとハートビート パケットがあります。混同しやすいところがありますのでまずは簡単に違いを説明します。

    なお、この文書内で使用するプライベート ネットワーク、パブリック ネットワークという表現は、それぞれ以下のイメージを指しています。

    • プライベート ネットワーク … クラスター ノード間を結ぶ Closed なネットワーク。
    • パブリック ネットワーク … クラスター ノード間を結び、クライアント アクセス ポイントが割り当てられたネットワーク。一般的にはネットワーク クライアントからのアクセスが可能な構成となります。

    ハートビート ネットワークについて

    MSCS においてノードの正常性確認のための専用ネットワークを指す用語です。

    クラスターを構成するノードでは随時ステータスの同期を行っており、もし同期に失敗するノードが見つかった場合には、そのノードはクラスターから切り離されます(切り離されたノードはクラスター サービスの再起動が行われ、あらためてクラスターに参加を試みます)。
    この同期処理のために用意する専用のプライベート ネットワークのことをハートビート ネットワークと呼びます。
    このハートビート ネットワークはクラスターの安定動作のために非常に重要視されており、固有の設定が必要とされています。詳細については以下の KB をご一読ください。

    クラスター サーバーでのプライベート "ハートビート" の推奨構成
    http://support.microsoft.com/kb/258750/ja
     (WSFC 環境ではこの KB に記載されたハートビート固有の設定は行わない様にしてください。)

    このハートビート ネットワークの推奨設定は Windows Serrver 2003 MSCS までは必要でしたが Windows Server 2008 WSFC 以降ではこの特別なネットワーク設定を行う必要がなくなりました。もちろん Windows Server 2008 WSFC でもこの同期処理が重要である点は同じですので、ノード間で相互接続が可能なネットワークは必要です (ノード間の相互ネットワークは単一障害点を避けるため、複数の経路を用意頂くことを強く推奨しています)。しかし、MSCS からのデザイン変更によって、「(特別な設定を持つ) ハートビート ネットワーク」を用意する必要がなくなったため、他のクラスター ネットワークとの設定差がなくなり、冗長性を高く保つことができるようになっています。

    ハートビート パケットについて

    ノード間を結ぶ相互ネットワークが疎通可能であるかどうかを確認するために定期的に送受信を行うパケットのことをハートビート パケットまたは単にハートビートと呼びます。
    ハートビートは即時応答性を重要視するため UDP プロトコルが使用され、クラスター サービスとして予約されたポート 3343 を使用し、クラスターで使用可能なすべてのネットワーク毎に送受信が行われます。

    ハートビート パケットの送受信の間隔は以下のとおりです。

    • Windows Server 2003 までは 1.2 秒毎
    • Windows Server 2008 以降では 1 秒毎

    補足
      Windows NT Server をベースにした MSCS では内部通信専用のプライベート ネットワークでのみ、ハートビート パケットの送受信が行われていました。そのため相手ノードの生存確認のためのネットワークとして、言葉通り「ハートビート ネットワーク」の意味合いが強いものでした。Windows 2000 Advanced Server 以降の MSCS ではネットワーク毎の疎通確認を目的として、クラスターで使用するネットワーク全てにおいて、ハートビート パケットの送受信が行われるようにデザインが変更されています。

    定期的に送受信が行われるハートビートが一定の数(時間)応答が無い場合に、クラスターはハートビートの遅延、または切断として、そのネットワーク上でノード間の疎通に問題があることを認識します。しかし、ノード間の疎通に失敗することがわかっても、送受信相手からの応答がないことがわかるのみで、障害発生箇所が途中のネットワーク経路なのか、相手ノードの問題なのかを確認することができません。そのため、クラスターはパブリック ネットワークでこのような状況が検知された場合にはさらに障害箇所の特定の為に、「外部ホスト」に対して、疎通確認を行い、障害箇所の特定を試みます。この「外部ホスト」とは各ノード共通でアクセス可能なネットワーク上の "第三者" のコンピュータで、デフォルト ゲートウェイなどです。疎通確認は ping を実行し、ICMP 応答の有無を以て障害箇所を探します。

    この動作は、簡単にまとめると以下のような流れになります。

    1. ハートビートの応答がなくなったことを検出したら、お互いのノードでネットワークの状態を「パーティション分割」に、各ネットワーク接続を「到達不能」の状態にセットします。
    2. 各ノードで「外部ホスト」への ping を実施し、その応答を確認します。
    3. ping の結果に差があった場合・・・
      1. 応答があったらこのノードのネットワークは正常なので、ネットワーク接続を「稼働中」の状態にセットします。
      2. 応答がないときは、このノードのネットワークは問題があるとしてネットワーク接続を「失敗」の状態にセットし、関連づけられた IP アドレス リソースを所有していたら失敗にしてフェールオーバーを促します。
    4. もし、ノード間で差がない場合には障害箇所の特定ができないので両ノードで「到達不能」のまま、状態の変化は発生しません (外部ホストが存在しないネットワークは常にこの状態となります)。この場合、相手ノードが正常であるとの確信もないので、フェールオーバーは行いません。
    5. ハートビートの送受信は常に試行しているため、疎通が正常に戻った場合には、ネットワークの状態、各ネットワーク接続のステータスを「稼働中」の状態にセットします。

    この動作は Windows Server 2000 を対象とした KB242600 にも詳細が説明されていますが、基本的な動作は Windows Server 2008 WSFC でも同様となります。

    2 ノードのサーバー クラスタにおけるネットワーク障害の検出と回復
    http://support.microsoft.com/kb/242600/ja

    *1
    Windows Server 2003 MSCS と Windows Server 2008 WSFC との動作の違いについて以下のBlogが公開されています。

    2 ノードのサーバー クラスタにおけるネットワーク障害の検出とフェールオーバー動作について
    http://blogs.technet.com/b/askcorejp/archive/2013/06/21/3580380.aspx

     なお、ネットワーク ケーブルの切断 (リンク ダウンの検出) が行われた場合には、上記の様な障害箇所の特定を行うまでもなく、クラスターはネットワーク インターフェースの障害としてこれを検知します。この場合にはどのノードの、どのネットワーク インターフェースの問題であるかは即時にわかるため、関連づけられた IP アドレス リソースは失敗のステータスからフェールオーバーの動作となります。またこの様なパブリック ネットワークの状態変化もクラスター内で同期が行われ、各ノードでステータスを共有します。ここでもし、他に正常な相互接続ネットワークが存在しない場合にはこの同期が失敗するため、前述の通り(同期ができない)クラスター サービスが再起動します。

    ハートビートが遅延してしまう場合には・・・

    ご利用のクラスター環境でこのようなハートビートの失敗が発生する様な場合にはネットワーク障害の有無についての調査を検討してみてください。ご利用のネットワークで障害が発生していた場合にはその対処を優先すべきですが、負荷の高いネットワークであったり、 WAN 環境などでパケット遅延が発生しうる可能性がある場合、Windows Server 2008 WSFC 以降ではハートビートの間隔や、障害検知までのしきい値を変更することができます。

    WSFC 環境のハートビートの既定の設定は以下となります。

    ハートビート間隔 : 1 秒
    切断検知までのしきい値 : 5 回

    1 秒間隔にハートビート パケットを送付し、このパケットが連続して 5 回失敗するとネットワークが切断されたと判断し、「パーティション分割」の状態となります。ネットワークが不安定な環境では、上記ハートビートの設定を 1 秒間隔で 5 回ではなく、2 秒間隔で 10 回まで、などに変更する事によってこのネットワークの問題に対応できる場合があります。

    この設定値は、以下のクラスター プロパティ値として管理されています。

    • クラスターが同じサブネット構成されている場合
      • SameSubnetDelay (単位:ミリ秒)
      • SameSubnetThreshold (単位:回数)
    • クラスターが異なるサブネットで構成されている場合
      • CrossSubnetDelay (単位:ミリ秒)
      • CrossSubnetThreshold (単位:回数)

    値の変更は cluster.exe コマンドで行うことができます。コマンド例をご紹介しますので状況に応じてお試し下さい。

    1. クラスタ ノードにてコマンド プロンプトを開きます。
    2. 以下のコマンドを実行すると、現在の設定値が確認できます
      cluster /prop:SameSubnetDelay
      cluster /prop:SameSubnetThreshold
    3. 以下のコマンドを実行し、設定を既定の状態から変更します( 2 秒 x 10 回 の場合)
      cluster /prop SameSubnetDelay=2000
      cluster /prop SameSubnetThreshold=10
    4. 再度 2 のコマンドを実行し、変更が反映されていることを確認します。

    この設定は 1 台のノードで実行することによりクラスター全体に即時に反映されます。

    また、Windows Server 2003 MSCS では 1.2 秒毎のハートビート間隔は変更できませんが、SP1 以降ではハートビート遅延、切断の検知に関するしきい値を変更出来る様になっています。

     An update is available that adds a file share witness feature and a configurable cluster heartbeats feature to Windows Server 2003 Service Pack 1-based server clusters
     http://support.microsoft.com/kb/921181/en-us

    MSCS では 3 回のハートビートを受信しなかった場合にネットワークの切断が検出(イベント ID 1123 が記録) され、6 回を超えて受信しなかった場合には相手ノードとの切断と検出されます。
    これらの値はそれぞれプロパティ値 HeartBeatLostInterfaceTicks、HeartBeatLostNodeTicks で変更が可能で、以下の cluster.exe コマンドで変更を行うことができます。

    cluster /priv HeartBeatLostInterfaceTicks=<回数>
    cluster /priv HeartBeatLostNodeTicks=<回数>

    MSCS では値の反映にはクラスター サービスの再起動が必要です。これらの詳細については、以下の公開情報をご確認ください。

    Windows 2000 ベースおよび Windows Server 2003 ベースのサーバー クラスタにおけるイベント ID 1123 とイベント ID 1122 のログの概要
    http://support.microsoft.com/kb/892422/ja

    ご利用頂いているクラスター環境でネットワークが安定しない等の問題をお持ちの場合には、これらハートビートに関する設定変更についてもご検討をいただければと思います。

    また、ネットワーク経路に問題が無い場合にも疎通が不安定となる事象などもありますので、以下も併せてご確認をいただければと思います。

    クラスタのネットワークが不安定になる?
    http://blogs.technet.com/b/askcorejp/archive/2010/06/16/3338445.aspx

     

  • ネットワーク ケーブルを抜いたときにフェールオーバーしない

    こんにちは。Windows プラットフォーム サポートの戸田です。

    日々のサポート業務の中で、よくお問い合わせを頂く内容についてご紹介します。

    Windows Server 2008 以降の WSFC (Windows Server Failover Clustering) は高可用性ソリューションとしての認識からか、クラスター環境を構築後に障害テストを実施いただくお客様が多くおられます。
    実際にはネットワーク ケーブルの抜挿を試されることが多いようですが、その結果フェールオーバーしないとのお問い合わせを頂くことがあります。


    具体的には以下の様なお問い合わせです。

    「フェールオーバーのテストを行おうとネットワーク ケーブルを抜いたが、イベント ID 1126 や 1129 が記録されるものの、IP アドレス リソースが失敗せずフェールオーバーもしない。」

    - 参考資料
      Event ID 1126 - Cluster Network Connectivity
        http://technet.microsoft.com/en-us/library/dd354065(v=ws.10).aspx

      Event ID 1129 - Cluster Network Connectivity
        http://technet.microsoft.com/en-us/library/dd353962(v=ws.10).aspx

    このときフェールオーバー クラスター マネージャーからネットワークの状態を見ると「パーティション分割」や「到達不能」のステータスになっているかと思います。

    この場合、メディア検出機能が無効化されていないかどうかを確認してみてください。

    Windows 2000 Server の MSCS (MicroSoft Cluster Service) の頃は、クロス ケーブルを使用してプライベート ネットワークを構成した場合、ノードの再起動をするとネットワークの役割が変わってしまう問題がありました。
    そのため、クロス ケーブルを使用するときにはメディア検出機能を無効にする設定が推奨とされていました。この話は Windows 2000 Server の頃の設定ですが、これが未だに行われている可能性があります。

    - 参考資料
      クラスタ ネットワークの役割が自動的に変更される
        http://support.microsoft.com/kb/254651/ja

      Windows で TCP/IP のメディア検出機能を無効にする方法
        http://support.microsoft.com/kb/239924/ja

    また Windows Server 2008 環境でも AD をインストールするとこのメディア検出機能が無効化されます。

    WSFC ではこのメディア検出機能を利用しているので、ネットワーク ケーブルの切断 (リンク ダウン) クラスターに検知させたい場合には、メディア検出機能が有効になっているかどうかを確認してみてください。

     

    もうひとつ。以下のようなお問い合わせもありました。

    「ネットワーク ケーブルを抜いてフェールオーバーのテストを行っていたが、最初はフェールオーバーしたのに、現在は IP アドレスのリソースが障害のまま、フェールオーバーしなくなった。」

    この振る舞いは、対象のリソースやグループ (クラスター化されたサービスまたはアプリケーション) のプロパティ設定に起因する動作の可能性があります。

    以下のプロパティ設定を確認してみてください。

    - IP アドレス リソースのプロパティ設定 ([ポリシー]タブ)

      ・「指定期間内での再起動の試行回数」(既定値: 1 回)
      ・「再起動期間 (mm:ss) 」(既定値: 15 分)

    この設定の場合、リソースが失敗となった際の動作として 15 分以内に 1 回までのオンラインの再試行が許可されますが、この再試行に失敗するとグループ障害としてフェールオーバーの動作に移ります。

    - グループのプロパティ設定 ([フェールオーバー]タブ)

      ・「指定した期間内の最大エラー数」(既定値: ノード数 - 1 回)
      ・「期間 (時間)」(既定値: 6 時間)

    この設定の場合 (リソース障害による) グループのフェールオーバーは 6 時間 以内に 1 回までのフェールオーバーが許可されています。

    これらのしきい値を超えた場合には、そのリソースは失敗状態となり、最終的にフェールオーバーは行われなくなります。
    このしきい値を越えたという情報はクラスターの内部変数で記憶されており、これをクリアするためには上記のしきい値の期間が経過するか、クラスターの再起動が必要となります。

    - 参考資料
      <リソース> プロパティ : [ポリシー] タブ
        http://technet.microsoft.com/ja-jp/library/cc725685(WS.10).aspx

      クラスター化されたサービスまたはアプリケーションの設定の変更
        http://technet.microsoft.com/ja-jp/library/cc755151(v=ws.10).aspx


    もし上記の様な操作でフェールオーバーテストを実施いただくときには、テスト目的としてこれらのプロパティ設定 (「指定期間内での再起動の試行回数」や「指定した期間内の最大エラー数」) を予め大きくしておくと良いと思います。


     

  • Windows server 2008 と Windows server 2008 R2 で VSS 12289 のイベントが記録される問題について

    こんにちは
     
    Windows テクノロジー サポートの服部です。
     
    最近いただいたお問い合わせについて今回もご紹介します。

    Windows server 2008 や Windows server 2008 R2 環境のサーバーで
    WSB (Windows Server Backup) を実行したとき、次のような VSS 12289 のイベントが記録される場合があります。
     
    -----
     
    イベント:アプリケーション
    種類:エラー
    日付:yyyy/mm/dd
    時刻:h:mm:ss
    ソース:VSS
    イベントID:12289
    タスクのカテゴリ:なし
    説明:
    ボリューム シャドウ コピー サービス エラー:
    予期しないエラー

    VSS_E_WRITER_STATUS_NOT_AVAILABLE.
    An older active writer session state is being overwritten by a newer session.
    The most common cause is that the number of parallel backups has exceeded the
    maximum supported limit です。hr = 0x80042409。
     
    操作:
     PostSnapshot イベント
     コンテキスト:
     Maximum supported sessions: 64
     Completed sessions: 8
     Active sessions: 64
     Aborted sessions: 0
     Writer failed sessions: 0
     
    New snaphot set: {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
    Old snapshot set: {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
    Old operation: 1014
    Old state: 1
    Old failure: 0
     
    実行コンテキスト: Writer
     ライタ クラス ID: {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
     ライタ名: NTDS
     
    -----
     
     
    Windows Server Backup (WSB) など、VSS を用いたバックアップが実施されると、VSS
    と VSS writer の間でセッションが作られます。

    VSS 12289 のエラーは、このセッションの最大値を超えたことを示すエラーとなります。
    これは、WSB と VSS writer 間の通信における問題に起因して発生します。
    具体的には、バックアップ完了後、完了通知の送信時に WSB が正常に応答を返さないため、VSS Writer 側で完了したことを示すフラグがセットできないことが原因となります。

    これにより、バックアップを実施する度に、アクティブなセッションが増加し続けます。
    その結果、アクティブ セッション数が最終的に Windows Server 2008 における最大値である 64 を超えた時点以降、WSB 等のバックアップの度に、このエラーが記録されるようになります。
     
    さて、ここで気になるのは、この問題は、サーバーの運用に何か影響を与えないのか、ということかと思います。
     
    サー��ー運用への影響
    ---------------------
     
    気になる障害情報ですが、現時点では、VSS 12289 のイベントが記録されることによる障害発生の情報はありません。
     
    この問題が発生した場合も、実際には VSS Writer 側でフラグがセットされる以外の終了処理は完了しているため、スナップ ショットの作成処理に特に問題はなく、バックアップ処理に対して、特に影響がないためと考えられます。
     
     
    今回と同じメッセージで、実際にバックアップに影響を与えるエラーが出た場合は、バックアップ側でもエラーを検知する事になります。
     
    このため、最終的にバックアップが正常終了しているのであれば、バックアップ データは正常であると判断して問題はないと言えます。
     
     
    回避方法について
    -----------------
     
    問題が無いとは言え、イベントが記録されるのは困る、というご意見も当然のようにあるかと思われます。
     
    この問題を回避するための方法としては、システムの再起動があります。
     
    システム再起動を行うことでセッション数がクリアされますので、これによって該当のエラーは一定期間 (アクティブ セッション数が 64 を超えるまで) は記録されなくなります。
     
    なお、この問題の修正につきましては、次期バージョンの OS では修正されるとの情報もございますが、残念ながら、Windows server 2008 や Windows server 2008 R2 での修正の予定は確認できておりません。
     
    恐れ入りますが、VSS 12289 のイベントが記録されました場合は、イベントは無視していただくか、定期的なシステム再起動をご検討いただきますようお願いいたします。