アプリケーションがデータに大きく依存し、データベースと頻繁にやり取りする場合、関連コストを軽減するためにキャッシュが重要になります。 キャッシュを使用してデータ取得を高速化するオンライン アプリケーションでは、強力なデータ レプリケーションと一貫性を実装することが必須です。
データ レプリケーションは、複数のサーバー間で重要なデータのバックアップを作成し、正確でアクセス可能な情報を確保するために重要です。 同様に、このような一貫性メカニズムは、これらの分散コピーをシームレスに同期し、アプリケーション プロセスの不一致を防ぐ場合に不可欠です。 したがって、アプリケーションが正確で最新のデータと対話することを保証するには、バックアップ、高可用性、およびデータの整合性のためにこれらの機能を採用する必要があります。
幸いなことに、 NCache は、まさにそのような分散システム向けに、信頼性の高い複製および同期メカニズムのセットを提供します。 このブログではその方法を詳しく説明しています NCache これらの条件を満たします。
NCache トポロジ
でサポートされるキャッシュ トポロジ NCache 含める ミラーリングされたトポロジ, 複製されたトポロジー, パーティションおよびパーティションレプリカトポロジ, クライアント キャッシュ トポロジ.
- ミラートポロジ: ミラー キャッシュ トポロジでのすべての読み取りおよび書き込み操作では、クライアント ノードはクラスターのアクティブなサーバー ノードにのみ接続します。 アクティブなサーバー ノードがダウンした場合、クライアント アプリケーションは、以前はパッシブだったノードとの接続をただちに確立します。
- 複製されたトポロジー: レプリケートされたトポロジでは、複数のサーバーに同時に障害が発生した場合でも、各サーバーに同じデータのコピーがあるため、データが失われることはありません。
- パーティショントポロジ: すべてのクライアント アプリケーションをキャッシュ サーバーに接続することで、パーティション トポロジはデータをチャンクに分割し、すべてのクライアント アプリケーションをキャッシュ サーバーに接続することで高いデータ可用性を提供します。 このようにして、アプリケーションは、接続されているサーバーがダウンした場合でも、他のサーバーに要求することで必要なデータを取得します。
- パーティション-レプリカ トポロジ: パーティション レプリカ トポロジは、動的パーティションを作成するだけでなく、他のサーバー ノード上にこれらのパーティションの動的レプリカも作成します。これは、接続障害やノード障害が発生した場合のバックアップとして機能します。 このような状況では、 NCache レプリカノードからデータを取得して配布します。
- クライアント キャッシュ トポロジ: クライアント キャッシュ トポロジでは、キャッシュはアプリケーションのすぐ近くに存在し、分散キャッシュからデータをすばやくキャッシュできます。
トポロジの詳細については、ブログをご覧ください。 スケールアウトと維持: でのトポロジの調査 NCache.
データ複製 NCache
データ レプリケーションの主な目的は、データの一貫性、可用性、耐障害性を確保することです。 データの同一のコピーを異なる場所に保持することにより、システムはパフォーマンスを向上させ、待ち時間を短縮し、潜在的なデータ損失やサーバー障害から保護することができます。
これは、使用されるトポロジに応じて、同期または非同期のいずれかになります。 同期レプリケーションでは、 NCache データがプライマリ キャッシュ サーバーとそのレプリカに同時に書き込まれることを保証します。 ただし、この方法では強力なデータ一貫性が保証されますが、キャッシュ書き込み操作はすべてのレプリカからの確認を待つ必要があるため、パフォーマンスが低下する可能性があります。
あるいは、非同期レプリケーションでは、データをプライマリ キャッシュ サーバーに書き込んだ後にレプリカを更新します。 これらのキャッシュ書き込み操作はレプリカの確認を待たないため、この戦略によりパフォーマンスが大幅に向上します。 ただし、この戦略では、レプリカとプライマリ キャッシュ サーバーの間で一時的なデータの不整合が生じる可能性があります。
同期および非同期データ レプリケーションのトポロジ
説明した各トポロジは独自の一連の特性を提供しますが、そのすべてがデータ レプリケーションに対応しているわけではありません。 たとえば、 ミラー キャッシュ トポロジ、プライマリ ノードとレプリカ ノードに同時に書き込むことでデータの一貫性を保証します。 一方、最初にプライマリ ノードに書き込み、後でレプリカを更新することで、非同期レプリケーションが使用されます。 複製されたキャッシュ トポロジ、効率は向上しますが、まれにエラーが発生する可能性があります。
幸いにも、 パーティションレプリカトポロジ パーティション化されたキャッシュ トポロジとレプリケート キャッシュ トポロジの利点を組み合わせることにより、冗長性、可用性、パフォーマンスのバランスが取れます。 ユーザーは要件に基づいて最適な手法を選択できます。
データ整合性メカニズム
データの一貫性とは、システムまたはデータベース全体にわたる情報の信頼性と正確性を指し、さまざまな操作を通じてデータの正確性と信頼性が維持されることを保証します。 データの一貫性を確保するには、 NCache のメカニズムを提供します 分散ロック これにより、同時更新中に特定のキャッシュ項目をロックできます。 ロックを適用することで、データの整合性を損なうことなく、複数のユーザーがさまざまなキャッシュ項目を同時に作業できます。 したがって、キャッシュ ロックは、分散環境で共有リソースを管理する場合に役立ちます。
データの一貫性を維持するには、 NCache 分散ロック マネージャーとして機能し、次の XNUMX 種類のロックを提供します。 オプティミスティックロック(キャッシュアイテムバージョン) & 悲観的ロック(排他的ロック)。 楽観的ロックの使用法 キャッシュアイテムのバージョン管理。 このタイプのロックでは、Add メソッドが新しい項目をキャッシュに追加して項目のバージョンを初めて保存し、insert メソッドが既存の項目の値を上書きしてその項目のバージョンを更新します。 次の例では、LockHandle を作成し、キー Product:1001 で項目を 10 秒間隔でロックします。これにより、項目は 10 秒後に自動的にロック解除されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// Prerequisite: Cache is already connected // Item is already added in the cache // Specify the key of the item string key = $"Product:1001"; // Create a new LockHandle LockHandle lockHandle = null; // Specify time span of 10 seconds for which the item remains locked TimeSpan lockSpan = TimeSpan.FromSeconds(10); // Lock the item for a time span of 10 seconds bool lockAcquired = cache.Lock(key, lockSpan, out lockHandle); // Verify if the item is locked successfully if (lockAcquired == true) { // Item has been successfully locked } else { // Key does not exist // Item is already locked with a different LockHandle } |
あるいは、悲観的ロックは、 ロックハンドル、他のすべてのユーザーがそのキャッシュ アイテムに対して書き込み操作を実行できないようにします。 項目のフェッチ中にロックの取得に成功すると、このロックがある限り他のアプリケーションがこの項目を取得または更新できないことがわかり、アプリケーションは安全に操作を実行できるようになります。 次の例では、キャッシュ内の項目をロックし、lockHandle を使用して項目を取得します。 その後、項目が更新され、Insert API を使用してキャッシュに再挿入されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// Specify the key of the item string key = $"Product:1001"; // Set acquireLock flag as true bool acquireLock = true; // Specify time span of 10 seconds for which the item remains locked TimeSpan lockSpan = new TimeSpan(0, 0, 10); // Initialize the lockHandle LockHandle lockHandle = null; CacheItem item = cache.GetCacheItem(key, acquireLock, lockSpan, ref lockHandle); var product = new Product(); product = item.GetValue(); // Update the unitsinstock for the product product.UnitsInStock = 200; bool releaseLock = true; // Item is already locked with a LockHandle // Update the item and release the lock as well since releaseLock is set true // Make sure that the LockHandle matches with the already added LockHandle cache.Insert(key, item, null, lockHandle, releaseLock); |
データのレプリケーションと整合性に関するベスト プラクティス
によって提供されるデータ レプリケーションと一貫性のメカニズムについて学びました。 NCache、この文脈で推奨されるプラクティスを見てみましょう。 レプリケート トポロジは、高可用性を必要とし、(n-1) ノードの障害が発生してもデータを損失することなく存続できるアプリケーションに最適です。 一方、パーティション レプリカ トポロジは、高可用性と、拡大するデータ ニーズを満たす容量の両方を提供します。
レプリケート トポロジほど可用性は高くありませんが、データを損失することなくノード障害に耐えることができます。 各パーティションにはバックアップがあります。 したがって、各ノードには基本的にパーティションと別のパーティションのバックアップがあります。 一方、ミラートポロジは、アクティブ ノードからパッシブ ノードへの非同期レプリケーションを通じてデータの信頼性と可用性を提供します。
NCache キャッシュ データを期限切れにするための時間ベースのデータ無効化戦略もサポートしています。 データの無効化 満了 つまり、データが期限切れになるまでデータがキャッシュに残る期間を指定できます。 このようにして、次のクライアント要求時にキャッシュに新しいデータが保存されるため、古いデータが排除され、データの一貫性が確保されます。 無効化による 依存関係 データベースに変更が発生するたびに、キャッシュ データが確実に削除されます。
まとめ
データのレプリケーションと一貫性は、信頼性の高い高性能アプリケーションのバックボーンです。 幸いなことに、 NCacheを使用すると、最も複雑なデータ ニーズにも対応できる拡張性の高いフォールト トレラントなアプリケーションを作成できる堅牢な機能にアクセスできます。