Windows Server 2008 Failover Cluster のネットワーク障害

こんにちは、プラットフォーム クリティカル レスポンス チームの姚 (ヨウ) です。

今日は、最近お客様からお問い合わせいただいた Windows Server 2008 Failover Cluster において発生したネットワーク障害についてお話します。

はじめに現象について説明します。

Windows Server 2008 の 2 ノード (NodeA と NodeB とします) の Failover Cluster 環境で、両ノードで、DHCP Client サービスと IPv6 を無効に設定します。
両ノードを順番に再起動すると、後に起動してくるノードがクラスタに参加できない現象が発生します。

この現象を回避するためには、DHCP Client サービスまたは IPv6 を有効にするか、両方を有効に設定する必要があります。

この現象が発生する理由について説明しますが、はじめにクラスタ ノードがクラスタ参加する際のノード間通信の設立について簡単にお話します。

Windows Server 2008 Failover Cluster ではノード間通信は、Microsoft Failover Cluster Virtual Adapter (netft.sys) を使用し、行います。
ノードがクラスタに参加するとき、以下の流れで通信を設立します。

1. Microsoft Failover Cluster Virtual Adapter に、IPv6 のおよび IPv4 のリンクローカル アドレスを設定します。
このとき、以下のような内容がクラスタ ログに記録されます。

INFO  <StartupConfig localNodeId='1' testMode='false' newCluster='false'
INFO      <ClusterName> CLSx86 </ClusterName>
INFO      <PaxosTag> 82:82:1785 </PaxosTag>
INFO      <ConfiguredNodes> (0 1 2) </ConfiguredNodes>
INFO      <NodeWeights> (0) </NodeWeights>
INFO      <Nodes>
INFO          <Node name='NODE1x86' id='1'/>
INFO          <Node name='node2x86' id='2'/>
INFO      </Nodes>
INFO      <LocalHiveFile> C:\Windows\Cluster\CLUSDB </LocalHiveFile>
INFO      <LocalHiveKey> Cluster </LocalHiveKey>
INFO      <ParametersKey> System\\CurrentControlSet\\Services\ClusSvc\Parameters </ParametersKey>
INFO      <Virtual IPv6> fe80::68f0:c2dd:c460:f67d%13:~3343~ </Virtual IPv6>
INFO      <Virtual IPv4> 169.254.1.57:~3343~ </Virtual IPv4>
INFO      <NoVersionCheck> false </NoVersionCheck>
INFO      <Cookie> c44b87ae-5519-48a5-afff-c54763b5f175 </Cookie>
INFO      <ClusterGuid> 8351ad75-0996-4635-b11f-f5af8fc70c17 </ClusterGuid>
INFO      <WitnessHiveFile> \\?\Volume{573709c3-984e-11df-83df-00155d51bb6d}\Cluster\0.hive </WitnessHiveFile>
INFO      <WitnessHiveKey> 0.Cluster </WitnessHiveKey>
INFO      <WitnessResourceId> bb70571c-3adc-4d9d-abb0-37611adf6719 </WitnessResourceId>
INFO  </StartupConfig>

また、Microsoft Failover Cluster Virtual Adapter の通信で IPv4 と IPv6 のどちらを使用するかを選出します。
このとき、以下のログが記録されます。
Microsoft Failover Cluster Virtual Adapter は自身の IPv6 (リンクローカル アドレス) を優先的に使用いたします。

INFO  [HM] Trying to select best endpoints among 169.254.1.57:~3343~, fe80::68f0:c2dd:c460:f67d:~3343~ (first pair) and 169.254.2.180:~3343~, fe80::29bd:9e63:ede9:6456:~3343~ (second pair)
INFO  [StreamDb] Route virtual fe80::68f0:c2dd:c460:f67d:~0~ to virtual fe80::29bd:9e63:ede9:6456:~0~ added

2. ノード上で別ノードと通信可能かつクラスタに使用できる物理 NIC およびその NIC の IP と別のノードの IP とのペアのルーチンを netft.sys のルーチンテーブルに登録します。
このとき、以下のような内容がクラスタ ログに記録されます。

以下のレジは、60.60.60.1 と 60.60.60.2 間のルーチンを追加しております。

INFO  [NETFT] Added route <struct mscs::FaultTolerantRoute>
INFO    <realLocal>60.60.60.1:~3343~</realLocal>
INFO    <realRemote>60.60.60.2:~3343~</realRemote>
INFO    <virtualLocal>fe80::68f0:c2dd:c460:f67d:~3343~</virtualLocal>
INFO    <virtualRemote>fe80::29bd:9e63:ede9:6456:~3343~</virtualRemote>
INFO    <Delay>1000</Delay>
INFO    <Threshold>5</Threshold>
INFO    <Priority>99</Priority>
INFO    <Attributes>1</Attributes>
INFO  </struct mscs::FaultTolerantRoute>

3. netft.sys のルーチンテーブルから最適なルーチンを選出し、このルーチンをトンネルとして Microsoft Failover Cluster Virtual Adapter のパケットを送信します。
これによって、ノード間通信が設立されます。

ノードの物理 NIC では、IPv4 か IPv6 のどちらの設定を使用しても動作は変わりません。

DHCP Client サービスを無効化に設定しますと、Microsoft Failover Cluster Virtual Adapter の DHCP 設定を実施できなくなり、netft.sys は Microsoft Failover Cluster Virtual Adapter 間の IPv4 の通信ができないとして判断いたします。
IPv6 を無効化に設定しますと、Microsoft Failover Cluster Virtual Adapter 間の IPv6 の通信ができなくなります。

DHCP Client サービスと IPv6 がどちらかが有効であれば、ノード通信が可能なので、問題はありません。
しかし、DHCP Client サービスおよび IPv6 を同時に無効に設定したら、ノード間 (厳密に言えば netft.sys 間) の通信ができなくなりますので、クラスタ ノードの参加に失敗いたします。

また、クラスタの参加の失敗後、該当ノードのクラスタ サービスが起動できなくなる可能性もあります。

ちなみに、私の Windows Server 2008 R2 の環境でも同じ現象を確認しております。

クラスタ ノードの設定を再度確認していただければと思います。

IPv6 を有効または無効設定する手順は以下の技術公開情報を参照ください。

Windows Vista、Windows 7、および Windows Server 2008 で特定の IPv6 (Internet Protocol version 6) を無効にする方法
https://support.microsoft.com/kb/929852/ja

- 参考情報
Windows Server 2008 Failover Clusters: Networking (Part 1)
https://blogs.technet.com/b/askcore/archive/2010/02/12/windows-server-2008-failover-clusters-networking-part-1.aspx

Windows Server 2008 Failover Clusters: Networking (Part 2)
https://blogs.technet.com/b/askcore/archive/2010/02/22/windows-server-2008-failover-clusters-networking-part-2.aspx