SharePoint Server 2013 分散キャッシュ サービスのエラーへの対応方法

こんにちは。
SharePoint サポート チームの成田です。

今回は SharePoint Server 2013 の分散キャッシュ サービスのエラーの対処方法ついて記載したいと思います。
SharePoint Server 2013 から [分散キャッシュ サービス] というサービスが新たに増えたことはご存知の方も多いと思います。
この分散キャッシュ サービスは、Security Token Service が発行したトークンやニュース フィードの情報など、ファーム内の複数の SharePoint サーバーで共通して使用され、かつ頻繁にアクセスされる情報をキャッシュする際に使用されます。
分散キャッシュ サービスにキャッシュされる情報については下記の Technet をご確認ください。

SharePoint Server 2013 のミニブログ機能、フィード、分散キャッシュ サービスの概要
https://technet.microsoft.com/ja-jp/library/jj219700(v=office.15).aspx

分散キャッシュは Windows Server の機能である AppFabric キャッシュ サービス (SharePoint Server 2013の前提条件と共にインストールされます) をベースとしており、各分散キャッシュ サーバーはキャッシュ ホストの役割を持ち、キャッシュ ホストはキャッシュ クラスターを構成しています。(SharePoint の "ファーム" とは別の概念です)
このような分散キャッシュ サービスですが、構成に失敗する事例が多く報告されており、イベント ログや診断ログに大量のエラーが記録されることがありますのでご注意ください。
例えば、下記のようなエラーが記録されます。(これ以外であっても、エラーに分散キャッシュ、AppFabric、Velocity などのキーワードがある場合は分散キャッシュ関連のエラーと考えて問題ありません。)

【Application】
-----
ソース:Application Error
イベントID:1000
レベル:エラー
ユーザー:N/A
EventData:
"障害が発生しているアプリケーション名: DistributedCacheService.exe、バージョン: 1.0.4632.0、タイムスタンプ: 0x4eafeccf
障害が発生しているモジュール名: KERNELBASE.dll、バージョン: 6.1.7601.17965、タイム スタンプ: 0x506dcae6
例外コード: 0xe0434352
障害オフセット: 0x000000000000bccd
障害が発生しているプロセス ID: 0x141c
障害が発生しているアプリケーションの開始時刻: 0x01ce34ce54006afa
障害が発生しているアプリケーション パス: C:\Program Files\Windows Server 用 AppFabric 1.1\DistributedCacheService.exe
障害が発生しているモジュール パス: C:\Windows\system32\KERNELBASE.dll
レポート ID: b49c6901-a0c2-11e2-97c3-00155def6442"
-----
-----
ソース:.NET Runtime
イベントID:1026
レベル:エラー
ユーザー:N/A
EventData:
"Application: DistributedCacheService.exe Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: Microsoft.ApplicationServer.Caching.DataCacheException
Stack:
   at Microsoft.ApplicationServer.Caching.VelocityWindowsService.StartServiceCallback(System.Object)
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext,System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()"
-----

【Microsoft-Windows-Application Server-System Services/Admin】
-----
エラー 2014/05/14 18:08:05 Microsoft-Windows Server AppFabric Caching 111 (1) "例外により AppFabric キャッシュ サービスがクラッシュしました {Microsoft.ApplicationServer.Caching.DataCacheException: ErrorCode<ERRService0001>:SubStatus<ES0001>:サービスを初期化できませんでした。ユーザー操作は不要です。 ---> Microsoft.Fabric.Common.OperationCompletedException: Operation completed with an exception ---> System.TimeoutException: 操作がタイムアウトしました。
   --- 内部例外スタック トレースの終わり ---
   場所 Microsoft.Fabric.Common.OperationContext.End()
   場所 Microsoft.Fabric.Common.SharedCommunicationObject.EndOpen(IAsyncResult result)
   場所 Microsoft.Fabric.Federation.FederationSite.EndOpen(IAsyncResult result)
   場所 Microsoft.Fabric.Data.ReliableServiceManager.EndOpen(IAsyncResult ar)
   場所 Microsoft.ApplicationServer.Caching.DOMNode..ctor(Int32 id, String displayFriendlyNodeId, Int32 port, EndpointID[] urisDOM, ServiceConfigurationManager configurationManager, ReliableServiceProvider dataStore, ServiceResolverBase& client)
   --- 内部例外スタック トレースの終わり ---
   場所 Microsoft.ApplicationServer.Caching.DOMNode..ctor(Int32 id, String displayFriendlyNodeId, Int32 port, EndpointID[] urisDOM, ServiceConfigurationManager configurationManager, ReliableServiceProvider dataStore, ServiceResolverBase& client)
   場所 Microsoft.ApplicationServer.Caching.DistributedObjectManager..ctor(EndpointID[] urisDOM, ServiceConfigurationManager configurationManager, WcfServerChannel channel)
   場所 Microsoft.ApplicationServer.Caching.DistributedObjectManager.GetInstance(EndpointID[] urisDOM, ServiceConfigurationManager configurationManager, WcfServerChannel channel)
   場所 Microsoft.ApplicationServer.Caching.ServiceLayer.ServiceStart(Boolean deleteTkt)
   場所 Microsoft.ApplicationServer.Caching.DataCacheServiceBase.ServiceStart(ServiceConfigurationManager scm, Boolean deleteTkt)
   場所 Microsoft.ApplicationServer.Caching.VelocityWindowsService.StartService(Boolean deleteTKT)
   場所 Microsoft.ApplicationServer.Caching.VelocityWindowsService.StartServiceCallback(Object context)
   場所 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   場所 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   場所 System.Threading.ThreadPoolWorkQueue.Dispatch()}。詳細についてはデバッグ ログを確認してください"
-----

また、構成情報に不整合が発生している場合、分散キャッシュ サービスを開始しようとすると Application イベント ログに以下のエラーが出力されて失敗することもあります。
-----
ソース:Microsoft-SharePoint Products-SharePoint Foundation
イベントID:7034
レベル:重大
ユーザー:<分散キャッシュ サービスの実行アカウント>
EventData: サーバー <分散キャッシュ ホスト> でサービス 分散キャッシュ のインスタンスを開始または停止できませんでした。指定されたサーバーで UI またはコマンド ラインを使用して処理を再実行してください。詳細は以下を参照してください。

cacheHostInfo is null
-----

分散キャッシュの構成に失敗する多くのケースで、キャッシュ ホスト間の通信に問題が発生していることが報告されています。
そのため、前述のようなエラーが記録される場合は、分散キャッシュ サービスの実行アカウントがキャッシュ ホスト間で必要なポートを使用して通信できるように構成することで回避する可能性があります。 下記に分散キャッシュ サービスに必要なネットワーク要件を満たし、サービスを再構成する手順を記載します。

分散キャッシュ サービスの再構成手順
====================================
1. ファーム アカウントの IE のプロキシの構成を変更する
2. Windows ファイアウォールを構成する
3. 分散キャッシュ ホストをファームから削除する
4. 分散キャッシュ ホストを再構成する

1. ファーム アカウントの IE のプロキシの構成を変更する
-------------------------------------------------------
分散キャッシュ サービスの実行アカウントは既定ではファーム アカウントが担当します。
ファーム アカウントがインターネットへプロキシ経由で通信を行えない場合、分散キャッシュ サービスを開始できない事例がありますので、下記の手順でファーム アカウントの IE のプロキシを予めオフに設定してください。
なお、分散キャッシュ サービスのアカウントをファーム アカウントから変更している場合には、変更後のアカウントに対して下記の手順をご実施ください。

1) 任意の SharePoint サーバーにファーム アカウント (SharePoint Timer Service の実行アカウント) でログオンし、IE を開始します。
2) [ツール] - [インターネット オプション] の順にクリックします。
3) インターネット オプションの設定で [接続タブ] タブをクリックし、[LAN の設定] をクリックします。
4) すべてのチェック ボックスがオフであることを確認します。オフでない場合にはオフにして [OK] をクリックして IE を閉じます。
5) 管理者権限で開始したコマンドプロンプトで以下のコマンドを実行します。

> netsh winhttp show proxy

6) コマンドの実行結果が "直接アクセス (プロキシ サーバーなし)" と表示されていることを確認します。
7) 異なる結果が表示されている場合は以下のコマンドを実行します。(プロキシを使用しない設定をインポートします)

> netsh winhttp import proxy source=ie

8) 再度手順 5) を実施して結果が "直接アクセス (プロキシ サーバーなし)" と表示されることを確認します。
9) 残りのすべての SharePoint サーバーで上記の手順を実施します。

2. Windows ファイアウォールを構成する
--------------------------------------
キャッシュ ホストとして構成する SharePoint Server 2013 上で、コマンド プロンプトまたは PowerShell を管理者権限で起動し、下記のコマンド (2 行) を実行します。

netsh advfirewall firewall set rule group="AppFabric Server: AppFabric キャッシュ サービス" new enable=Yes
netsh advfirewall firewall set rule group="リモート サービス管理" new enable=Yes

上記のコマンドを実行することで、分散キャッシュ サービスの動作に必要な下記の Windows ファイアウォールのルール 5 つが有効化されます。

-----
受信の規則
・AppFabric キャッシュ サービス (TCP-In)
・リモート サービス管理 (NP 受信)
・リモート サービス管理 (RPC)
・リモート サービス管理 (RPC-EPMAP)

送信の規則
・AppFabric キャッシュ サービス (TCP-Out)
-----

また、サードパーティのファイアウォールを導入されている場合には、分散キャッシュ ホスト間の通信で TCP 22233 - 22236 および ICMP を許可するように構成されていることをご確認ください。
分散キャッシュ サービスで使用されるポートについては下記の Technet に記載されております。

SharePoint Server 2013 でフィードおよび分散キャッシュ サービスを計画する
https://technet.microsoft.com/ja-jp/library/jj219572.aspx#firewall
-----
ファイアウォール構成の考慮事項 分散キャッシュ サービスは、次の通信ポートを使用します。

•22233
•22234
•22235
•22236

サーバー ファーム内で複数のキャッシュ ホストを使用している場合は、分散キャッシュ サービスを実行している最初のキャッシュ ホストを、ファイアウォール経由の受信 ICMP (ICMPv4) トラフィックを許可するように構成する必要があります。詳細については、「Windows 7、Windows Vista、Windows Server 2008、または Windows Server 2008 R2 で受信 ICMP ルールを作成する」を参照してください。管理者が、ファイアウォール経由の受信 ICMP (ICMPv4) トラフィックを許可するように構成された最初のキャッシュ ホストをクラスターから削除する場合は、新しいクラスターの最初のサーバーを、ファイアウォール経由の受信 ICMP (ICMPv4) トラフィックを許可するように構成する必要があります。
-----

キャッシュ ホストとして構成する SharePoint Server 2013 上で必要なポートが開いているかを確認するには下記の手順をご実施ください。

1) 下記の URL より PortQryUI.exe をダウンロードし、全ての分散キャッシュ サーバーにコピーします。

https://download.microsoft.com/download/3/f/4/3f4c6a54-65f0-4164-bdec-a3411ba24d3a/PortQryUI.exe

2) 各分散キャッシュ サーバー上で PortQryUI.exe をダブルクリックして実行します。
3) ライセンス アグリーメントを確認し、[Yes] をクリックします。
4) 任意のパス (例: C:\PortQryUI) を指定して [Unzip] をクリックして解凍します。
5) 各分散キャッシュ サーバー上で管理者権限でコマンド プロンプトを開始し、手順 4) で指定したパスに移動します。
6) 各分散キャッシュ サーバー上で、全ての分散キャッシュ サーバーに対して下記のコマンドを実行します。

PortQry.exe -n <分散キャッシュ サーバー名> -e 22233
PortQry.exe -n <分散キャッシュ サーバー名> -e 22234
PortQry.exe -n <分散キャッシュ サーバー名> -e 22236

7) コマンドを実行した結果、全てのコマンドの実行結果が下記のように [LISTENING] で返されることをご確認ください。[LISTENING] 以外の結果が返る場合にはポートが閉じられておりますので、サードパーティのファイアウォールを含め、ルールを再度ご確認ください。

-----
Querying target system called:

<分散キャッシュ サーバー名>

Attempting to resolve name to IP address...

Name resolved to <IP アドレス>

querying...

TCP port <ポート番号> (unknown service): LISTENING
-----

3. 分散キャッシュ ホストをファームから削除する
-----------------------------------------------
下記手順で一度分散キャッシュ ホストをキャッシュ クラスターから削除します。

1) 任意の分散キャッシュ サーバーに管理者アカウントでログオンし、[SharePoint 2013 管理シェル] を管理者権限で開始します。
2) 以下のコマンドを実行してサービス インスタンスを削除します。

> Remove-SPDistributedCacheServiceInstance

3) 残りのすべての分散キャッシュ サーバーで上記のコマンドを実行します。
4) SQL Server に管理者アカウントでログオンし、SQL Server Management Studio を開始してデータベース インスタンスに接続します。
5) [新しいクエリ] をクリックし、クエリ ウィンドウに下記を入力して [実行] をクリックします。

---
USE <構成データベース名>
SELECT * FROM CacheClusterConfig WHERE EntryType = 'hosts';
SELECT * FROM Objects WHERE Properties LIKE '%SPDistributedCacheServiceInstance%';
SELECT * FROM Objects WHERE Properties LIKE '%SPDistributedCacheHostInfo%';
---


---
USE SharePoint_Config
SELECT * FROM CacheClusterConfig WHERE EntryType = 'hosts';
SELECT * FROM Objects WHERE Properties LIKE '%SPDistributedCacheServiceInstance%';
SELECT * FROM Objects WHERE Properties LIKE '%SPDistributedCacheHostInfo%';
---

6) 結果ウィンドウに結果が何も表示されないことを確認します。

※結果が表示される場合は分散キャッシュ サービスの構成情報が適切に削除されておりませんので、下記の手順を実施してください。

6-a) すべての分散キャッシュ サーバーの [SharePoint 2013 管理シェル] で下記のコマンドを実行します。

> $instanceName ="SPDistributedCacheService Name=AppFabricCachingService"
> $serviceInstance = Get-SPServiceInstance | ? {($_.service.tostring()) -eq $instanceName -and ($_.server.name) -eq $env:computername}
> $serviceInstance.Delete()

6-b) SQL Server Management Studio で手順 5) のクエリを実行します。
6-c) 結果ウィンドウに結果が何も表示されないことを確認します。

4. 分散キャッシュ ホストを再構成する
-------------------------------------
前述の手順でファーム内から正常に分散キャッシュ ホストを削除できたことを確認し、下記の手順で再構成します。

1) 分散キャッシュ サービスを開始させる任意の SharePoint サーバーに管理者アカウントでログオンし、[SharePoint 2013 管理シェル] を管理者権限で開始します。
2) 以下のコマンドを実行してサービス インスタンスを追加します。

> Add-SPDistributedCacheServiceInstance

3) 分散キャッシュ サービスを開始させる残りのすべての SharePoint サーバーで上記のコマンドを実行します。
4) 任意の SharePoint サーバーで下記のコマンドを順に実行し、すべての分散キャッシュ ホストの Status が Online であることを確認します。

> $instanceName ="SPDistributedCacheService Name=AppFabricCachingService"
> $serviceInstance = Get-SPServiceInstance | ? {($_.service.tostring()) -eq $instanceName}
> $serviceInstance

5) 分散キャッシュ サービスを開始させる任意の SharePoint サーバーで下記のコマンドを順に実行し、サービス インスタンスを開始します。

> $instanceName ="SPDistributedCacheService Name=AppFabricCachingService"
> $serviceInstance = Get-SPServiceInstance | ? {($_.service.tostring()) -eq $instanceName -and ($_.server.name) -eq $env:computername}
> $serviceInstance.Provision()

6) 分散キャッシュ サービスを開始する残りのすべての SharePoint サーバーで上記のコマンドを実行します。
7) 任意の 1 台の SharePoint サーバーで下記のコマンドを実行し、すべての分散キャッシュ ホストの Status が Online であることを確認します。

> $instanceName ="SPDistributedCacheService Name=AppFabricCachingService"
> $serviceInstance = Get-SPServiceInstance | ? {($_.service.tostring()) -eq $instanceName}
> $serviceInstance

8) 任意の SharePoint サーバーで下記のコマンドを順に実行し、すべての分散キャッシュ ホストの Service Status に UP を表示されていることを確認します。

> Use-CacheCluster
> Get-CacheHost

※コマンドの結果が表示されるまでに時間がかかり、Status が UNKNOWN と表示される場合は分散キャッシュ サービスの構成が完了していませんので、10 分程度待ってから再度上記のコマンドを実行してください。

<参考> 分散キャッシュ サービスを管理する (SharePoint Server 2013)
https://technet.microsoft.com/ja-jp/library/jj219613(v=office.15).aspx

上記の手順をご実施いただき、ファーム内の全ての SharePoint サーバーで分散キャッシュ関連のエラーが解消されるかをご確認ください。

いかがでしたでしょうか。
分散キャッシュ サービス関連のエラーが記録されている場合にはご参考くださいますと幸いです!