第6章 Configuring persistent storage
Data Grid は、キャッシュストアとローダーを使用して永続ストレージと対話します。
- 持続性
- キャッシュストアを追加すると、不揮発性ストレージにデータを永続化できるため、再起動後も存続することができます。
- ライトスルーキャッシュ
- Data Grid を永続ストレージの前のキャッシュレイヤーとして設定すると、Data Grid が外部ストレージとのすべての対話を処理するため、アプリケーションのデータアクセスが簡素化されます。
- データオーバーフロー
- エビクションとパッシベーションの手法を使用すると、Data Grid は頻繁に使用されるデータのみをメモリー内に保持し、古いエントリーを永続ストレージに書き込みます。
6.1. パッシベーション
パッシベーションは、これらのエントリーをメモリーからエビクトする際に、ストアにエントリーを書き込むように Data Grid を設定します。この方法により、パッシベーションは、インメモリーまたはキャッシュストアのいずれかによって単一のエントリーのコピーのみが維持されるようになります。これにより、不要な書き込みや永続ストレージへのコストがかかる可能性があります。
アクティベーションとは、パッシベートされたエントリーにアクセスしようとすると、キャッシュストアからメモリーにエントリーを復元するプロセスのことです。このため、パッシベーションを有効にすると、CacheWriter
インターフェイスと CacheLoader
インターフェイスの両方を実装するキャッシュストアを設定して、永続ストレージからエントリーを書き込み、読み込めるようにします。
Data Grid がキャッシュからエントリーをエビクトすると、エントリーがパッシベートされてからキャッシュストアにエントリーを保存するようキャッシュリスナーに通知します。Data Grid がエビクトされたエントリーへのアクセス要求を取得すると、キャッシュストアからエントリーをメモリーにロードし、エントリーがアクティブになるキャッシュリスナーに通知します。
- パッシベーションは、Data Grid 設定の最初のキャッシュローダーを使用し、その他はすべて無視します。
パッシベーションは以下ではサポートされません。
- トランザクションストア。パッシベーションは、実際の Data Grid コミット境界の範囲外のストアからエントリーを作成し、削除します。
- 共有ストア。共有キャッシュストアでは、他の所有者に対して常にストアにエントリーが存在する必要があります。そのため、エントリーを削除できないため、パッシベーションはサポートされません。
トランザクションストアまたは共有ストアでパッシベーションを有効にすると、Data Grid は例外を出力します。
6.1.1. パッシベーションの仕組み
無効のパッシベーション
メモリーのデータへの書き込みにより、永続ストレージが書き込まれます。
Data Grid がデータをメモリーからエビクトする場合、永続ストレージのデータにはメモリーからエビクトされるエントリーが含まれます。このようにして、永続ストレージはインメモリーキャッシュのスーパーセットになります。
エビクションを設定しない場合、永続ストレージのデータはメモリーにデータのコピーを提供します。
有効のパッシベーション
Data Grid は、メモリーからデータをエビクトする場合にのみ、データを永続ストレージに追加します。
Data Grid がエントリーをアクティベートすると、メモリーのデータが復元され、永続ストレージからデータが削除されます。これにより、永続ストレージのメモリーおよびデータ内のデータは、データセット全体のサブセットを切り離し、2 つの間の交差はありません。
共有ストレージのエントリーは、共有キャッシュストアの使用時に古くなる可能性があります。これは、Data Grid はアクティブ時に共有キャッシュストアからパッシベートされたエントリーを削除しないため発生します。
値はメモリーで更新されますが、以前にパッシベートされたエントリーは、古い値で永続ストレージに残ります。
以下の表は、一連の操作後のメモリーおよび永続ストレージのデータを示しています。
操作 | 無効のパッシベーション | 有効のパッシベーション | 共有キャッシュストアでパッシベーションが有効になっている |
---|---|---|---|
k1 を挿入します。 |
Memory: k1 |
Memory: k1 |
Memory: k1 |
k2 を挿入します。 |
Memory: k1, k2 |
Memory: k1, k2 |
Memory: k1, k2 |
エビクションスレッドが実行され、k1 をエビクトします。 |
Memory: k2 |
Memory: k2 |
Memory: k2 |
k1 の読み取り |
Memory: k1, k2 |
Memory: k1, k2 |
Memory: k1, k2 |
エビクションスレッドが実行され、k2 をエビクトします。 |
Memory: k1 |
Memory: k1 |
Memory: k1 |
k2 を削除します。 |
Memory: k1 |
Memory: k1 |
Memory: k1 |