データベース
 Computer >> コンピューター >  >> プログラミング >> データベース

RACでのキャッシュフュージョンを理解する

キャッシュフュージョンは、Oracle®RealApplicationClusters(RAC)の2つのインスタンス間でのブロックの転送に他ならず、RACの主要かつ最も重要な機能です。

はじめに

Oracle RAC Cache FusionのOracleによると、各「インスタンス[in] RACクラスタには、キャッシュ機能を実行する独自のローカルバッファキャッシュがあります。ただし、複数のユーザーが異なるノードに接続している場合、[ユーザーは多くの場合][別の]インスタンスが所有するデータブロックにアクセスまたはロックする必要があります。

「このような場合、リクエストするインスタンスはそのデータブロックの保持インスタンスをリクエストし、相互接続メカニズムを介してそれにアクセスします。この概念は、 Cache Fusionとして知られています。 。」

単一インスタンス

Cache Fusionを探索する前に、データブロックリクエストが発生したときに非RACデータベースがどのように動作するかを見てみましょう。

以下は、単一インスタンスでの4ステップのトランザクションプロセスです(GopiのCache Fusionブログ投稿から引用:

  1. ユーザーが最近変更されたブロックを読み取ると、ブロック内にアクティブなトランザクションが見つかる場合があります。
  2. ユーザーは、トランザクションがコミットされたかどうかを判断するために、undoセグメントヘッダーを読み取る必要があります。
  3. トランザクションがコミットされていない場合、プロセスは、ブロック内のデータと元に戻すセグメントに格納されているデータを使用して、バッファキャッシュにブロックの一貫した読み取り(CR)バージョンを作成します。
  4. 元に戻るセグメントにトランザクションがコミットされていることが示されている場合、プロセスはブロックに再度アクセスしてブロックをクリーンアップし、変更のREDOを生成する必要があります。

それでは、キャッシュフュージョンと呼ばれる2つのインスタンスのクラスターを使用したRACでの同じシナリオを見てみましょう。

キャッシュフュージョン

Gopiは続けます。「RACでは、[同じストレージ(ASMなど)にある]同じデータベースファイルにアクセスする[2]以上のインスタンスがあります。各インスタンスには独自のSGA、バックグラウンドプロセスがあります。つまり、各インスタンスには独自のバッファキャッシュ(各インスタンスに対してローカル)があります。これらのバッファ[原文のまま]キャッシュは、[the]インスタンスレベルで個別に動作し、[the]データベースレベルで融合して単一のエンティティ(グローバルキャッシュ)を形成し、それらの間でデータブロックを共有します。これは、 Cache Fusionと呼ばれるものです。 。 Cache Fusionは、高速IPC相互接続を使用して、クラスター内のインスタンス間でデータブロックのキャッシュ間転送を提供します。このデータブロックシッピングにより、ディスクI / Oが排除され、読み取り/書き込みの同時実行性が最適化されます。」

この理解により、インスタンス間のブロック転送を担当するグローバルキャッシュサービス(GCS)にたどり着きます。

以下は、Gopiの投稿で言及されているGCSのバックグラウンドプロセスです。

  • グローバルキャッシュサービスプロセス(LMSn)
  • グローバルエンキューサービスデーモン(LMD)

Gopiはさらに、「これらのバックグラウンドプロセスに入る前に、[原文のまま] Oracleがデータブロックをどのように処理し、どのように管理するかを見てみましょう。

「オラクルはデータブロックをリソースとして扱います。これらの各リソースは、データの整合性を維持するための重要なメカニズムである、異なるモードで保持できます。これらのモードは、リソース所有者がデータを変更するか、データを読み取るかによって、[3]種類に分類されます。」

Gopiは、モードを次のようにリストしています。

  • ヌル(N)モード :通常、ヌルモードはプレースホルダーとして保持されます。
  • 共有(S)モード :このモードでは、データブロックは別のセッションによって変更されませんが、同時共有アクセスは許可されます。
  • 排他的(X)モード :このレベルは、保持プロセスに排他的アクセスを許可します。他のプロセスはリソースに書き込むことができません。読み取りブロックが一貫している可能性があります。

グローバルキャッシュサービスデーモン(LMSn)

インスタンスからのリクエストがあると、Gopiは次のように語っています。「GCSは、ブロックコピーをメモリに保持することで、他のインスタンスへのブロック転送を整理します。そのような各コピーは、過去の画像(PI)と呼ばれます。 […]ダーティステージでブロックが要求された回数によっては、データブロックのPIを複数持つこともできます。」

注: Gopiは、次のように付け加えています。「データブロックを読み取りたい場合は、[a]一貫した状態で読み取る必要があります。他の人が行った変更を読むことは許可されていません。」

グローバルエンキューサービスデーモン(LMD)

Gopiは、次のように説明しています。「globalenqueue service(GES)は、すべてのOracleエンキューメカニズムのステータスを追跡します。 GESは、ディクショナリキャッシュロック、ライブラリキャッシュロック、およびトランザクションに対して同時実行制御を実行します。複数のインスタンスからアクセスされるリソースに対してこの操作を実行します。 GESは、データファイルと制御ファイルへのアクセスを制御しますが、データブロックへのアクセスは制御しません。 "

Gopiが共有するGES管理リソースは次のとおりです。

  • トランザクションロック :トランザクションが変更(挿入、更新など)を開始すると、排他モードで取得されます。ロックは、トランザクションがコミットまたはロールバックされるまで保持されます。
  • ライブラリキャッシュロック :SQL、DMLまたはDDL、PL / SQL、またはJavaステートメントの解析またはコンパイル中にデータベース・オブジェクト(テーブル、ビュー、パッケージ、パッケージ本体、[…]など)が参照される場合、プロセスの解析またはステートメントをコンパイルすると、正しいモードでライブラリのキャッシュロックが取得されます。
  • 辞書キャッシュロック :グローバルエンキューは、クラスターデータベースモードで使用されます。データディクショナリの構造は、クラスタデータベース内のすべてのOracleインスタンスで同じです。
  • テーブルロック :これらは、テーブル全体を保護するGESロックです。テーブルが変更されると、トランザクションはテーブルロックを取得します。テーブルロックは、null(N)、行共有(RS)、行排他(RX)、共有ロック(S)、共有行排他(SRX)、または排他(X)のいずれかのモードで保持できます。
過去の一貫した読み取り画像

メインシナリオに進む前に、過去の画像(PI)とconsistentread(CR)画像を理解する必要があります。

過去の画像

Rohit Guptaは、彼の記事の中で、Oracle RACCacheFusionが次のように述べています。更新のためにデータブロックを排他的にロックするインスタンスを考えてみましょう。 RAC内の他のインスタンスがブロックを必要とする場合、holdinginstanceは、ブロックのPI(過去のイメージ)をバッファーキャッシュに保持することにより、ブロックを要求元のインスタンスに(ディスクに書き込む代わりに)送信できます。基本的に、PIは、ブロックがディスクに書き込まれる前のデータブロックのコピーです。」

一貫性のある読み取り画像:

グプタは続けます。「特定のブロックがトランザクション[A1]によってアクセス/変更されていると同時に、別のトランザクション[A2]がブロックにアクセス/読み取りしようとする場合、一貫した読み取りが必要です。 [A1]がコミットされていない場合、[A2]は先に進むために、ブロックの一貫した読み取り[(変更されていないブロック)]コピーを必要とします。 CRコピーは、そのブロックのUNDOデータを使用して作成されます。」

キャッシュフュージョンシナリオ

キャッシュフュージョンには3つの異なるシナリオがあります:

  • 読み取り-読み取りシナリオ
  • 読み取り/書き込みシナリオ
  • 書き込み-書き込みシナリオ
読み取り-読み取りシナリオ:

ブロックをリクエストするインスタンスとリクエストをブロックするインスタンスの両方が読み取りトランザクションをリクエストしているため、これは重要ではないシナリオです。ここでは、排他的なロックは発生しません。インスタンスBはGCSに読み取りブロックを要求します。 GCSは、インスタンスAが所有するブロックの可用性をチェックし、共有ロックを取得します。ここで、GCSは、インスタンスが要求されたブロックをインスタンスBに送信するように要求します。

読み取り/書き込みシナリオ:

これは重要なシナリオです。

インスタンスAはデータブロックを更新しているため、排他ロックを取得する必要があります。しばらくすると、インスタンスBは同じデータブロックの読み取り要求をGCSに送信します。

GCSは、インスタンスが同じブロックの排他ロックを取得したことを確認します。そのため、GCSはインスタンスAにブロックを解放するように要求します。これで、インスタンスAは独自のバッファキャッシュにCRイメージを作成し、それに応じてGCSに通知してインスタンスBに送信します。

GCSはCRイメージの作成に関与しており、要求されたインスタンスにそれを出荷することが、CacheFusionの出番です。

書き込み-書き込みシナリオ

インスタンスAとインスタンスBはどちらも、データブロックの排他ロックを取得しようとしています。

インスタンスBはブロック要求をGCSに送信します。 GCSは可用性をチェックし、インスタンスAがロックを取得したことを検出します。したがって、GCSはインスタンスAにインスタンスBのブロックを解放するように要求します。ここで、インスタンスAはバッファに現在のブロックのPIを作成し、REDOエントリを作成し、ブロックをインスタンスBに送信するようにGCSに通知します。

インスタンスBはブロックを使用し、通常どおり変更を加えます。

CRとPIの主な違い

Guptaは、PIイメージとCRイメージについて、次の最終的な考えを追加します。「[a] CRイメージは、[a]読み取り/書き込みタイプの競合を回避するために出荷されました。ブロックを排他的にロックします。したがって、読み取り操作の場合、ブロックのCRイメージで十分です。書き込み/書き込みの競合の場合、要求元のインスタンスもデータブロックの排他ロックを取得する必要があります。書き込み操作のロックを取得するには、CRイメージではなく実際のブロックが必要になります。したがって、保持インスタンスは実際のブロックを送信しますが、ブロックがディスクに書き込まれるまでブロックのPIを保持する傾向があります。したがって、インスタンスの障害またはクラッシュが発生した場合、OracleはRACインスタンス全体でPIfromを使用してブロックを構築できます。ブロックがディスクに書き込まれると、クラッシュが発生した場合に回復する必要がなくなるため、関連するPIを破棄できます。」

データサービスの詳細をご覧ください。

コメントや質問をするには、[フィードバック]タブを使用します。私たちと会話を始めることもできます。


  1. MongoDBのスペース使用量を理解する

    MongoDBを初めて使用する方にとって、MongoDBのスペース使用量は非常に混乱しているように思われるかもしれません。この記事では、MongoDBがスペースを割り当てる方法と、ObjectRocketダッシュボードのスペース使用量情報を解釈して、インスタンスを圧縮する必要がある場合や、インスタンスで使用可能なスペースを増やすためにシャードを追加する必要がある場合を判断する方法について説明します。 まず、単一の5GBシャードで構成される新しいMediumインスタンスから始めましょう。このインスタンスに「ocean」という名前のデータベースのテストデータを入力します。テストデータを追加し、い

  2. ビッグデータ、データ マイニング、機械学習の違いを理解する

    テクノロジーの急速な進化に伴い、私たちはデータの複雑なネットワークと漠然とした未来に向かっています。一方、世界中の業界は、ビッグデータ、データマイニング、機械学習などの革新的なテクノロジーを採用することで、完全な刷新を試みています。ここで、なぜ世界中のすべての企業がこれらのテクノロジーの採用に熱心なのか、基本的な概念は何なのか、それらは互いにどのように異なるのかという疑問が生じます。調べてみましょう。 ビッグデータ、データ マイニング、機械学習などのテクノロジーが必要なのはなぜですか? データに対する需要の高まりと競争の激化により、各企業はこれらのテクノロジーを自社のサービスに実装すること