第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 がエントリーをアクティブ化すると、メモリー内のデータが復元されますが、ストア内のデータはそのまま保持されます。これにより、ストアがない場合と同じくらい書き込みが高速になり、整合性も維持されます。エントリーが作成または更新されると、メモリー内のみが更新されるため、ストアが当面の間古い状態になります。
ストアも共有として設定されている場合、パッシベーションはサポートされません。これは、書き込みがエビクトされるタイミングと読み取りがエビクトされるタイミングによっては、エントリーがノード間で同期されなくなる可能性があるためです。
データの整合性を確保するには、共有されていないストアで常に purgeOnStartup
を有効にする必要があります。これは、パッシベーションが有効または無効な場合の両方に当てはまります。ストアがダウンしている間に古いエントリーを保持し、後でそれを復活させることができるためです。
以下の表は、一連の操作後のメモリーおよび永続ストレージのデータを示しています。
操作 | パッシベーションが無効 | パッシベーションが有効 |
---|---|---|
k1 を挿入します。 |
Memory: k1 |
Memory: k1 |
k2 を挿入します。 |
Memory: k1, k2 |
Memory: k1, k2 |
エビクションスレッドが実行され、k1 をエビクトします。 |
Memory: k2 |
Memory: k2 |
k1 の読み取り |
Memory: k1, k2 |
Memory: k1, k2 |
エビクションスレッドが実行され、k2 をエビクトします。 |
Memory: k1 |
Memory: k1 |
k2 を削除します。 |
Memory: k1 |
Memory: k1 |