第9章 状態転送
状態転送は、基本的なデータグリッドまたはクラスター化キャッシュ機能です。状態転送を使用しないと、ノードをクラスターに追加する場合やノードをクラスターから削除する場合にデータが失われます。
状態転送により、キャッシュメンバーシップでの変更に応じてキャッシュの内部状態が調整されます。変更は、ノードが参加または脱退したとき、2 つ以上のクラスターパーティションがマージしたとき、参加、脱退、およびマージが実行されたときに行われます。状態転送は、ノードがクラスターに参加したときやクラスターから脱退したときに必ず Red Hat JBoss Data Grid で自動的に実行されます。
Red Hat JBoss Data Grid のレプリケーションモードでは、キャッシュに参加する新しいノードは既存のノードから全体のキャッシュ状態を受け取ります。分散モードでは、新しいノードは既存のノードから一部の状態のみを受け取り、既存のノードは各キーの
owners
コピーをキャッシュに保持するために一部の状態を削除します (整合性のあるハッシュによって決定されます)。インバリデーションモードでは、最初の状態転送はレプリケーションモードと似ており、唯一の違いはノードの状態が同じであることが保証されないことです。ノードが脱退すると、レプリケーションモードまたはインバリデーションモードでキャッシュが状態転送を実行しません。分散キャッシュは、各キーの owners
コピーを保持するために、脱退するノードに格納されたキーの追加コピーを作成する必要があります。
状態転送では、デフォルトでインメモリー状態と永続状態の両方が転送されますが、それらはどちらも設定で無効にできます。状態転送が無効にされる場合は
ClusterLoader
を設定する必要があります。設定しない場合、ノードは、データがそのキャッシュにロードされることなく、キーの所有者またはバックアップ所有者になります。さらに、状態転送が分散モードで無効にされると、キーの所有者は owners
より少なくなることがあります。
9.1. 非ブロッキング状態転送
Red Hat JBoss Data Grid における非ブロック状態転送は、状態転送が実行中であるためクラスターまたはノードが応答できない時間を最小化します。非ブロック状態転送はアーキテクチャー上の大きな機能向上であり、その目的は以下のとおりです。
- 状態転送が実行中であるためクラスター全体が要求に応答できない時間を最小化します。
- 状態転送が実行中であるため既存のメンバーが要求への応答を中止する時間を最小化します。
- 状態転送を実行することを可能にします (クラスターのパフォーマンスが低下します)。ただし、状態転送時にパフォーマンスが低下すると、例外がスローされず、プロセスを続行できます。
- 状態転送の実行中に null 値を返さずに
GET
操作が別のノードからキーを正常に取得することを許可します。
簡素化のために、総オーダーベースコミットプロトコルは、現在実装されている状態転送メカニズムのブロックバージョンを使用します。通常の状態転送と総オーダー状態転送の主な違いは、以下のとおりです。
- ブロックプロトコルは、状態転送中にトランザクション配信をキューに格納します。
- 状態転送制御メッセージ (CacheTopologyControlCommand など) は、総オーダー情報に基づいて送信されます。
総オーダーベースコミットプロトコルは、すべてのトランザクションが同じオーダーで配信され、同じデータセットを認識することを前提として動作します。したがって、トランザクションは、すべてのノードでメモリーに最新のキーまたは値が含まれる必要があるため、状態転送中に検証されません。
状態転送とブロックプロトコルをこのように使用すると、すべてのノードでの状態転送とトランザクション配信を同期できます。ただし、状態転送にすでに関係があるトランザクション (状態転送が始まる前に送信され、状態転送が終了した後に配信されたトランザクション) は再び送信する必要があります。再送信された場合、これらのトランザクションは新しい参加者として扱われ、新しい総オーダー値が割り当てられます。