こんにちは、Re:Qの宮崎です。
今日はキャッシュフュージョン(Cache Fusion)のお話です。
第1回で言葉だけ出てきましたが、皆さん覚えてますか?
覚えてない方はリンクからざっと1話目を復習して頂くとして、ではここから本題に入りましょう。
キャッシュフュージョン(Cache Fusion)とは
各インスタンス君は、頭のなかにシステムグローバル領域(SGA)というメモリ領域を持っています。
そのメモリ領域の中に、データの内容を保持するデータベース・バッファ・キャッシュというものがありましたね。
キャッシュフュージョンとは、各インスタンス君のもつバッファキャッシュを、あたかも一つの大きなキャッシュであるかのように扱う機能のことです。
もちろん、このときキャッシュの一貫性はきちんと保たれており、それに伴ってデータブロックの一貫性も保たれます。 一貫性を保つ秘訣は、インスタンス君たちが持っているグローバル・リソース・ディレクトリ(GRD)というものです。このGRDは、どのデータブロックがどのインスタンスで利用されているかを管理するものです。
3ノードRACをイメージして図に表すと、下図のようになります。
各インスタンスはそれぞれGRDを持っており、データを分割して管理しています。
では、GRDで管理して、キャッシュフュージョンを用いることでどんないいことがあるのでしょうか?
インスタンス君たちの会話を聞いてみましょう。
1話目でもでてきましたが、やはり糸電話をつかっているようですね。
インスタンス君①「データブロック☆を読み込みたいんだけど、誰か持ってない?」
インスタンス君②「俺が管理しているやつだ!確か誰もまだ持ってないから直接読み込んでよ」
インスタンス君①「仕方ないな。面倒だけど読みこもうか...」
インスタンス君①「ふう、ようやく読み終わった。読書なんて嫌いだよ」
インスタンス君③「データブロック☆内のデータAをデータA'に更新するんだって!
字読むの面倒くさいなー。誰か持ってたらplz!」
インスタンス君②「また俺が管理しているやつか。はいはい。
データブロック☆は、インスタンス君①が持っているよ。
①君、そのデータブロック☆を③に渡してあげてよ。」
インスタンス君①「あいよ」
インスタンス君③「㌧!じゃ、さっそく更新するけど大丈夫だよね?」
インスタンス君①「ただ読んでいるだけで、何もいじってないから大丈夫だよ」
インスタンス君③「②さん、データブロック☆を更新したんでよろしくね」
インスタンス君②「え?データブロック☆内のデータBをデータB'に更新...だと...?
じゃぁ、③君、君の持ってるのが最新版だから、それをこっちに送って」
インスタンス君③「ほいほい」
一般的にインスタンス君たちは、糸電話で会話するのと比較して、ディスクから文字を読み込むのが遅いです。また、文字を書き込むのも遅いという特徴があります。
そのためデータ競合時に、あるインスタンスが更新したデータを一旦ディスクに書き込み、別のインスタンスがそのデータを読み込むことで間接的にデータを受け渡しするよりも、上の例のように、ディスクの読み書きを経由せずに直接データキャッシュをやり取りするほうが、圧倒的に早くお仕事をすることができます。
具体的にどのくらい処理が速くなるのかというと、もちろん環境によって変わってくるのでしょうが、従来の処理時間が10ミリ秒だとすると、キャッシュフュージョンの使用によりマイクロ秒レベルまで短縮されることもあります。
今回はここまで。