9.5.4. 各キャッシュが独自のストアを持つレプリケートされたキャッシュ
図9.4 各ノードが独自のバックエンドストアを持つ 2 つのノード
このケースでは、 各ノードが独自のデータストアを持ちます。 キャッシュへの変更は クラスタ全体でレプリケートされ、 キャッシュローダーを使用して永続化されます。 つまり、 すべてのデータストアが全く同じステートを持つことになります。 変更をトランザクションで同期的にレプリケートする場合、 2 相コミットプロトコルにより、 すべての変更がレプリケートされ各データストアに永続化されるか、 何もレプリケートされず永続化も行われません (アトミック更新)。
JBoss Cache は XAResource ではありません。 そのため、 復元を実装しません。 復元をサポートするトランザクションマネージャを使用する場合は、 この機能を使用できません。
ここでの問題はステート転送です。 新しいノードが起動した時に以下を実行する必要があります。
- コーディネータ (クラスタ内の最も古いノード) にステートを送るよう指示します。 これは常に完全ステート転送となり、 既存のステートをすべて上書きします。
- コーディネータは、未完了トランザクションが完了するまで待機する必要があります。この待機中は新しいトランザクションを開始できません。
- 次に、 コーディネータは
loadEntireState()を使用してキャッシュローダーに対して全体のステートを要求します。 キャッシュローダーは新しいノードにステートを送ります。 - 新しいノードは、 古いステートを上書きして新しいステートをストアに保存するようキャッシュローダーに指示します。 これは
CacheLoader.storeEntireState()メソッドです。 - オプションとして、ステート転送中に一時 (インメモリ) ステートを転送することもできます。
- これで、 新しいノードのバックエンドストアのステートが、 クラスタ内の他のノードと同じになります。 また、 他のノードから受け取った変更はローカルのキャッシュローダーを使用して永続化されるようになります。