4.3. 分散キャッシュ
分散は、numOwners
として設定された、キャッシュ内の任意のエントリーの固定数のコピーを保持しようとします。これにより、キャッシュを線形にスケーリングし、ノードがクラスターに追加されるにつれて、より多くのデータを格納できます。
ノードがクラスターに参加およびクラスターから離脱すると、キーのコピー数が numOwners
より多い場合と少ない場合があります。特に、numOwners
ノードがすぐに連続して離れると、一部のエントリーが失われるため、分散キャッシュは、numOwners - 1
ノードの障害を許容すると言われます。
コピー数は、パフォーマンスとデータの持続性を示すトレードオフを表します。維持するコピーが増えると、パフォーマンスは低くなりますが、サーバーやネットワークの障害によるデータ損失のリスクも低くなります。維持されるコピーの数に関係なく、分散は直線的にスケーリングされます。これは、Data Grid のスケーラビリティの鍵となります。
キーの所有者は、キーへの書き込みを調整する 1 つのプライマリー所有者と、0 個以上のバックアップ所有者に分割されます。プライマリー所有者とバックアップ所有者の割り当て方法の詳細は、キー所有権 セクションを参照してください。
図4.3 分散モード
読み取り操作はプライマリー所有者からの値を要求しますが、妥当な時間内に応答しない場合、バックアップの所有者からも値を要求します。(infinispan.stagger.delay
システムプロパティー) は、リクエスト間の遅延を制御します。) キーがローカルキャッシュに存在する場合、読み取り操作には 0
メッセージが必要になる場合があり、すべての所有者が遅い場合は最大 2 * numOwners
メッセージが必要になる場合があります。
また、書き込み操作は、最大 2 * numOwners
メッセージで、送信元からプライマリー所有者、numOwners - 1
メッセージ、プライマリーからバックアップへの 1 メッセージ、対応する ACK メッセージまでです。
キャッシュトポロジーの変更により、読み取りと書き込みの両方で再試行と追加メッセージが発生する可能性があります。
レプリケートモードと同様に、分散モードは同期または非同期にすることもできます。レプリケートされたモードでは、更新が失われる可能性があるため、非同期レプリケーションは推奨されません。更新の損失に加えて、非同期の分散キャッシュは、スレッドがキーに書き込むときに古い値を確認し、その後に同じキーをすぐに読み取ることもできます。
トランザクション分散キャッシュは、トランザクション複製キャッシュと同じ種類のメッセージを使用しますが、ロック/準備/コミット/ロック解除メッセージは、クラスター内のすべてのノードにブロードキャストされるのではなく、影響を受けるノード(トランザクションの影響を受ける少なくとも 1 つのキーを所有するすべてのノード) にのみ送信されます。最適化として、トランザクションが単一のキーに書き込み、送信元がキーの主な所有者である場合、ロックメッセージは複製されません。
4.3.1. 読み取りの一貫性
同期レプリケーションを使用しても、分散キャッシュは線形化できません。(トランザクションキャッシュの場合は、シリアル化/スナップショットの分離に対応していないとします。) 1 つのスレッドで 1 つの put を実行できます。
cache.get(k) -> v1 cache.put(k, v2) cache.get(k) -> v2
ただし、別のスレッドでは、異なる順序で値が表示される場合があります。
cache.get(k) -> v2 cache.get(k) -> v1
その理由は、プライマリー所有者が応答する速度に応じて、クラスター内のすべてのノードが任意の 所有者から値を返す可能性があるためです。書き込みはすべての所有者にわたってアトミックではありません。実際、プライマリーはバックアップから確認を受け取った後にのみ更新をコミットします。プライマリーがバックアップからの確認メッセージを待機している間、バックアップからの読み取りには新しい値が表示されますが、プライマリーからの読み取りには古い値が表示されます。