10 サービス・ガーディアンの使用
この章の内容は次のとおりです。
- サービス・ガーディアンの概要
サービス・ガーディアンは、Coherenceのスレッドでデッドロックを検出して、その解決を試行するメカニズムです。 - サービス・ガーディアンの構成
サービス・ガーディアンは、初期状態で有効になっており、タイムアウト値および失敗ポリシーの2つの構成アイテムがあります。 - 手動のガーディアン・ハートビートの発行
GuardSupport
クラスには、サービス・ガーディアンに対して、アプリケーションから手動でハートビートを発行するために使用できるハートビート・メソッドが用意されています。
親トピック: Coherenceクラスタの使用
サービス・ガーディアンの概要
サービス・ガーディアンは、Coherenceで所有され、作成されたスレッドが発行する定期的なハートビートを受け取ります。構成されているタイムアウトより前にスレッドからハートビートを発行できなくなると、サービス・ガーディアンによって修正処置が実行されます。タイムアウトと修正処置(リカバリ)は両方とも必要に応じて構成できます。
ノート:
デッドロックという用語が必ずしも意味どおりのデッドロックを表すわけではありません。適時にハートビートを発行しないスレッドが、長い実行プロセスを実行していたり、遅いリソースを待機していたりする可能性があります。サービス・ガーディアンでは、デッドロックされたスレッドと遅いスレッドを区別することはできません。
Coherenceによって実行されるインタフェース
次のインタフェースの実装が、Coherence所有のスレッドによって実行されます。実装のプロセスが、構成されているガーディアン・タイムアウトを超えると、サービス・ガーディアンはスレッドをリカバリしようとします。リストは包括的ではなく、エンド・ユーザーによって実装される最も一般的なインタフェースのみを示しています。
com.tangosol.net.Invocable
com.tangosol.net.cache.CacheStore
com.tangosol.util.Filter
com.tangosol.util.InvocableMap.EntryAggregator
com.tangosol.util.InvocableMap.EntryProcessor
com.tangosol.util.MapListener
com.tangosol.util.MapTrigger
リカバリの理解
サービス・ガーディアンのリカバリ・メカニズムでは、スレッドがデッドロックされているかどうかを判断するために一連のステップが使用されます。修正処置は、スレッドがデッドロックされているとサービス・ガーディアンが結論付けた場合に実行されます。実行する修正処置は構成可能であり、必要に応じてカスタムの処置を作成できます。次に、リカバリ・メカニズムの概要を示します。
-
ソフト・タイムアウト - このリカバリ・メカニズムではまず、構成されているタイムアウトに達する直前にスレッドを中断しようとします。次のログ・メッセージの例は、ソフト・タイムアウト・メッセージを示しています。
<Error> (thread=DistributedCache, member=1): Attempting recovery (due to soft timeout) of Daemon{Thread="Thread[WriteBehindThread:CacheStoreWrapper(com. tangosol.examples.rwbm.TimeoutTest),5,WriteBehindThread:CacheStoreWrapper(com. tangosol.examples.rwbm.TimeoutTest)]", State=Running}
スレッドを中断でき、その結果ハートビートが発行されると、通常の処理が再開します。
-
ハード・タイムアウト - このリカバリ・メカニズムでは、構成されているタイムアウトに達するとスレッドを停止しようとします。次のログ・メッセージの例は、ハード・タイムアウト・メッセージを示しています。
<Error> (thread=DistributedCache, member=1): Terminating guarded execution (due to hard timeout) of Daemon{Thread="Thread[WriteBehindThread:CacheStoreWrapper (com.tangosol.examples.rwbm.TimeoutTest),5,WriteBehindThread:CacheStoreWrapper (com.tangosol.examples.rwbm.TimeoutTest)]", State=Running}
-
最後に、スレッドを停止できない場合、リカバリ・メカニズムでは、構成されている失敗ポリシーに基づいて処理が実行されます。実行可能な処理には、クラスタ・サービスの停止、JVMの停止、カスタム処理の実行などがあります。次のログ・メッセージの例は、リカバリ・メカニズムで実行される処理を示しています。
<Error> (thread=Termination Thread, member=1): Write-behind thread timed out; stopping the cache service
親トピック: サービス・ガーディアンの使用
サービス・ガーディアンの構成
この項には次のトピックが含まれます:
ガーディアン・タイムアウトの設定
この項には次のトピックが含まれます:
- ガーディアン・タイムアウトの設定の概要
- すべてのスレッドのガーディアン・タイムアウトの設定
- サービス・タイプごとのガーディアン・タイムアウトの設定
- サービス・インスタンスごとのガーディアン・タイムアウトの設定
親トピック: サービス・ガーディアンの構成
ガーディアン・タイムアウトの設定の概要
サービス・ガーディアン・タイムアウトは、必要な粒度レベルに基づいて3種類の方法で設定できます。
-
すべてのスレッド - このオプションでは、1つのタイムアウト値をクラスタ・ノード上のCoherence所有のスレッドすべてに適用できます。これはデフォルトの構成で、デフォルトで
305000
ミリ秒に設定されています。 -
サービス・タイプごとのスレッド - このオプションでは、サービス・タイプごとに異なるタイムアウト値を設定できます。タイムアウト値は、すべてのサービス・インスタンスのスレッドに適用されます。特定のサービス・タイプにタイムアウトが指定されていないと、そのタイムアウトはすべてのスレッドに設定されているデフォルトのタイムアウトに設定されます。
-
サービス・インスタンスごとのスレッド - このオプションでは、サービス・インスタンスごとに異なるタイムアウト値を設定できます。特定のサービス・インスタンスにタイムアウトが設定されていないと、そのサービスのタイムアウト値が指定されている場合はそれが使用され、指定されていない場合はすべてのスレッドに設定されているタイムアウトが使用されます。
タイムアウト値を0
に設定すると、スレッドの保護が停止します。一般的に、サービス・ガーディアン・タイムアウト値は、パケット配信のタイムアウト値と同じか、それより長く設定する必要があります。
ノート:
ガーディアン・タイムアウトは、read-write-backing-mapスキームで構成するキャッシュ・ストアの実装に使用することもできます。この場合、<cachestore-timeout>
要素を0
に設定します。これによって、このタイムアウトがデフォルトのガーディアン・タイムアウトに設定されます。read-write-backing-map-schemeを参照してください。
親トピック: ガーディアン・タイムアウトの設定
すべてのスレッドのガーディアン・タイムアウトの設定
あるクラスタ・ノード内のすべてのスレッドにガーディアン・タイムアウトを設定するには、オペレーション・オーバーライド・ファイルの<service-guardian>
要素内に<timeout-milliseconds>
要素を追加します。次の例では、タイムアウト値が120000
ミリ秒に設定されます。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <service-guardian> <timeout-milliseconds>120000</timeout-milliseconds> </service-guardian> </cluster-config> </coherence>
<timeout-milliseconds>
の値は、coherence.guard.timeout
システム・プロパティを使用して設定することもできます。
親トピック: ガーディアン・タイムアウトの設定
サービス・タイプごとのガーディアン・タイムアウトの設定
サービス・タイプごとにガーディアン・タイムアウトを設定するには、オペレーション・オーバーライド・ファイルにあるサービスのguardian-timeout
初期化パラメータをオーバーライドします。次の例では、DistributedCache
サービスのガーディアン・タイムアウトが120000
ミリ秒に設定されます。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <services> <service id="3"> <init-params> <init-param id="17"> <param-name>guardian-timeout</param-name> <param-value>120000</param-value> </init-param> </init-params> </service> </services> </cluster-config> </coherence>
guardian-timeout
初期化パラメータは、DistributedCache
、ReplicatedCache
、OptimisticCache
、Invocation
およびProxy
の各サービスに設定できます。特定のサービスのguardian-timeout
パラメータのオーバーライドに使用する適切なサービスIDおよび初期化パラメータIDについては、coherence.jar
ファイルにあるtangosol-coherence.xml
ファイルを参照してください。
ガーディアン・タイムアウトを設定する、各サービスのシステム・プロパティは、それぞれ次のとおりです。
coherence.distributed.guard.timeout
coherence.replicated.guard.timeout
coherence.optimistic.guard.timeout
coherence.invocation.guard.timeout
coherence.proxy.guard.timeout
親トピック: ガーディアン・タイムアウトの設定
サービス・インスタンスごとのガーディアン・タイムアウトの設定
サービス・インスタンスごとにガーディアン・タイムアウトを設定するには、キャッシュ構成ファイルのキャッシュ・スキーム定義に<guardian-timeout>
要素を追加します。次の例では、分散キャッシュ・スキームのガーディアン・タイムアウトが120000
ミリ秒に設定されます。
<distributed-scheme> <scheme-name>example-distributed</scheme-name> <service-name>DistributedCache</service-name> <guardian-timeout>120000</guardian-timeout> <backing-map-scheme> <local-scheme> <scheme-ref>example-binary-backing-map</scheme-ref> </local-scheme> </backing-map-scheme> <autostart>true</autostart> </distributed-scheme>
<guardian-timeout>
要素は、<distributed-scheme>
、<replicated-scheme>
、<optimistic-scheme>
、<transaction-scheme>
、<invocation-scheme>
および<proxy-scheme>
の各スキームで使用できます。
親トピック: ガーディアン・タイムアウトの設定
PriorityTask APIのタイムアウト値の使用
Invocable
、EntryProcessor
およびEntryAggregator
インタフェースのカスタム実装によって、PriorityTask
インタフェースを実装できます。この場合、サービス・ガーディアンでは、getExecutionTimeoutMillis()
から返される値より長い間タスクが実行されている場合にリカバリが試行されます。スレッド実行の管理を参照してください。
実行タイムアウトは、キャッシュ構成ファイルで定義されている<invocation-scheme>
要素内の<task-timeout>
要素を使用して設定できます。Invocation
サービスの場合、<task-timeout>
要素によって、PriorityTask
インタフェースを実装するInvocable
タスクのタイムアウト値が指定されますが、この実行タイムアウト値が明示的に指定されるわけではありません。つまり、getExecutionTimeoutMillis()
メソッドは0
を返します。<task-timeout>
要素を0
に設定すると、デフォルトのガーディアン・タイムアウトが使用されます。
親トピック: サービス・ガーディアンの構成
ガーディアン・サービス失敗ポリシーの設定
この項には次のトピックが含まれます:
- ガーディアン・サービス失敗ポリシーの設定の概要
- すべてのスレッドのガーディアン失敗ポリシーの設定
- サービス・タイプごとのガーディアン失敗ポリシーの設定
- サービス・インスタンスごとのガーディアン失敗ポリシーの設定
- カスタムのガーディアン失敗ポリシーの有効化
親トピック: サービス・ガーディアンの構成
ガーディアン・サービス失敗ポリシーの設定の概要
サービス失敗ポリシーでは、スレッドがデッドロックされているとサービス・ガーディアンが結論付けた場合に実行される修正処置が指定されます。適用可能なポリシーは次のとおりです。
-
exit-cluster
- このポリシーでは、応答しないように見えるスレッドをリカバリしようとします。試行に失敗した場合は、関連付けられたサービスの停止が試行されます。関連付けられたサービスを停止できない場合、このポリシーによって、ローカル・ノードでクラスタ・サービスが停止します。指定のポリシーがない場合、これがデフォルトのポリシーです。 -
exit-process
- このポリシーでは、応答しないように見えるスレッドをリカバリしようとします。試行に失敗した場合は、関連付けられたサービスの停止が試行されます。関連付けられたサービスを停止できない場合、このポリシーによって、ローカル・ノードでJVMが途中で終了します。 -
logging
- このポリシーでは、検出された問題がログに記録されますが、修正処置は実行されません。 -
カスタム -
com.tangosol.net.ServiceFailurePolicy
インタフェースを実装するJavaクラスの名前。カスタムのガーディアン失敗ポリシーの有効化を参照してください。
サービス・ガーディアン失敗ポリシーは、必要な粒度レベルに基づいて3種類の方法で設定できます。
-
すべてのスレッド - このオプションでは、1つの失敗ポリシーをクラスタ・ノード上のCoherence所有のスレッドすべてに適用できます。これが初期状態の構成です。
-
サービス・タイプごとのスレッド - このオプションでは、サービス・タイプごとに異なる失敗ポリシーを設定できます。ポリシー値は、すべてのサービス・インスタンスのスレッドに適用されます。特定のサービス・タイプにポリシーが指定されていないと、そのポリシーはすべてのスレッドに設定されているデフォルトのポリシーに設定されます。
-
サービス・インスタンスごとのスレッド - このオプションでは、サービス・インスタンスごとに異なる失敗ポリシーを設定できます。特定のサービス・インスタンスにポリシーが設定されていないと、そのサービスのポリシーが指定されている場合はそれが使用され、指定されていない場合はすべてのスレッドに設定されているポリシーが使用されます。
親トピック: ガーディアン・サービス失敗ポリシーの設定
すべてのスレッドのガーディアン失敗ポリシーの設定
ガーディアン失敗ポリシーを設定するには、オペレーション・オーバーライド・ファイルの<service-guardian>
要素内に<service-failure-policy>
要素を追加します。次の例では、失敗ポリシーがexit-process
に設定されます。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <service-guardian> <service-failure-policy>exit-process</service-failure-policy> </service-guardian> </cluster-config> </coherence>
親トピック: ガーディアン・サービス失敗ポリシーの設定
サービス・タイプごとのガーディアン失敗ポリシーの設定
サービス・タイプごとに失敗ポリシーを設定するには、オペレーション・オーバーライド・ファイルにあるサービスのservice-failure-policy
初期化パラメータをオーバーライドします。次の例では、DistributedCache
サービスの失敗ポリシーがlogging
ポリシーに設定されます。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <services> <service id="3"> <init-params> <init-param id="18"> <param-name>service-failure-policy</param-name> <param-value>logging</param-value> </init-param> </init-params> </service> </services> </cluster-config> </coherence>
service-failure-policy
初期化パラメータは、DistributedCache
、ReplicatedCache
、OptimisticCache
、Invocation
およびProxy
の各サービスに設定できます。特定のサービスのservice-failure-policy
パラメータのオーバーライドに使用する適切なサービスIDおよび初期化パラメータIDについては、coherence.jar
ファイルにあるtangosol-coherence.xml
ファイルを参照してください。
親トピック: ガーディアン・サービス失敗ポリシーの設定
サービス・インスタンスごとのガーディアン失敗ポリシーの設定
サービス・インスタンスごとに失敗ポリシーを設定するには、キャッシュ構成ファイルのキャッシュ・スキーム定義に<service-failure-policy>
要素を追加します。次の例では、分散キャッシュ・スキームの失敗ポリシーがlogging
に設定されます。
<distributed-scheme> <scheme-name>example-distributed</scheme-name> <service-name>DistributedCache</service-name> <guardian-timeout>120000</guardian-timeout> <service-failure-policy>logging</service-failure-policy> <backing-map-scheme> <local-scheme> <scheme-ref>example-binary-backing-map</scheme-ref> </local-scheme> </backing-map-scheme> <autostart>true</autostart> </distributed-scheme>
<service-failure-policy>
要素は、<distributed-scheme>
、<replicated-scheme>
、<optimistic-scheme>
、<transaction-scheme>
、<invocation-scheme>
および<proxy-scheme>
の各スキームで使用できます。
親トピック: ガーディアン・サービス失敗ポリシーの設定
カスタムのガーディアン失敗ポリシーの有効化
カスタムの失敗ポリシーを使用するには、<instance>
のサブ要素を追加し、ServiceFailurePolicy
インタフェースを実装する完全修飾クラス名を指定します。instanceを参照してください。次の例では、MyFailurePolicy
クラスに実装されているカスタムの失敗ポリシーが有効になります。カスタムの失敗ポリシーは、(次に示しているように)すべてのスレッドに対して有効にすることも、キャッシュ・スキーム定義内でサービス・インスタンスごとに有効にすることもできます。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <service-guardian> <service-failure-policy> <instance> <class-name>package.MyFailurePolicy</class-name> </instance> </service-failure-policy> </service-guardian> </cluster-config> </coherence>
代替案として、<instance>
要素では、ServiceFailurePolicy
インスタンスを作成するためのファクトリ・クラスを使用する<class-factory-name>
要素、およびオブジェクトのインスタンス化を実行するファクトリ・クラス上で静的なファクトリ・メソッドを指定する<method-name>
要素の使用がサポートされています。次の例では、MyPolicyFactory
クラスでgetPolicy
メソッドを使用してカスタムの失敗ポリシーのインスタンスが取得されます。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <service-guardian> <service-failure-policy> <instance> <class-factory-name>package.MyPolicyFactory</class-factory-name> <method-name>getPolicy</method-name> </instance> </service-failure-policy> </service-guardian> </cluster-config> </coherence>
実装に必要な初期化パラメータはすべて、<init-params>
要素を使用して指定できます。次の例では、iMaxTime
パラメータが2000
に設定されます。
<?xml version='1.0'?> <coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-operational-config coherence-operational-config.xsd"> <cluster-config> <service-guardian> <service-failure-policy> <instance> <class-name>package.MyFailurePolicy</class-name> <init-params> <init-param> <param-name>iMaxTime</param-name> <param-value>2000</param-value> </init-param> </init-params> </instance> </service-failure-policy> </service-guardian> </cluster-config> </coherence>
親トピック: ガーディアン・サービス失敗ポリシーの設定
手動のガーディアン・ハートビートの発行
GuardSupport
クラスには、サービス・ガーディアンに対して、アプリケーションから手動でハートビートを発行するために使用できるハートビート・メソッドが用意されています。GuardSupport.heartbeat();
既知の実行時間の長い操作の場合、操作がスタック状態にあると見なすまでの経過時間(ミリ秒数)を指定してハートビートを発行できます。
GuardSupport.heartbeat(long cMillis);
親トピック: サービス・ガーディアンの使用