検証!RACの耐障害性と拡張性

2008年7月14日(月)
加藤 昇平

RACのパフォーマンス特性

最後に、パフォーマンスの話です。ここでは、RACによるパフォーマンスの拡張性を維持するために、どのような点に留意するべきか考えてみます。複数のサーバーが1つのデータベースを管理するのがRACですが、同一表の同じデータにアクセスする場合、RACは大まかに次のような動作となります。

まず、ノード1にユーザがアクセスします。データはディスクからノード1のメモリに読み込まれ、メモリ上で更新されます。更新されたデータはすぐにはディスクに反映されません。

次にノード2にアクセスしたユーザが最初のユーザと同じデータにアクセスします。ユーザがアクセスすべき最新データは、ディスクにはなくノード1のメモリ上にあります。ノード2はノード1に問い合わせ、最新のデータをインターコネクト経由で送付し、処理を行います。

このように、最新データのやりとりについて、ディスクを介さずインターコネクト経由で通信する一連の動作をキャッシュフュージョンと呼びます。バージョン9iから実装されたキャッシュフュージョンにより、ノードをまたがる同一データアクセスのオーバヘッドが軽減され、ノード追加による拡張性が確保されるようになりました。なお、細かいキャッシュフュージョンの動作は、9i、10g、11gとバージョンを経るに従い、ますます進化しています。

では、ノードを増やした分に比例してパフォーマンスが向上するか?というと、100%そうではありません。RACはシングル構成に比べて、次のようなオーバヘッドがあります。

1つ目が「マスター問い合わせ処理」です。RACでは、各データに対して「どのノードが最新データを持っているか?」を管理しているノードがいます。そのノードをマスターといいますが、アクセスを行うノードはそのマスターに問い合わせを行います。

2つ目が「分散ロック管理処理」です。更新中のデータがほかのノードに更新されないよう、ノード間にまたがって管理されるロックです。

3つ目が「インターコネクト経由のデータ転送処理」で、物理的な転送処理です。

例えば、データベースにマスター表のような比較的小さく頻繁にアクセスされる表があったとします。SELECTだけの処理であれば、上述のようなキャッシュフュージョンの動作とはなりませんが、更新処理が入ると処理量に影響が出る場合があります。

つまり、キャッシュフュージョンがあまり発生しないアプリケーションでは、Single/RAC構成ともにノードを追加する分だけ処理量が伸びることが期待されますが、キャッシュフュージョンが発生しやすいアプリケーションでは、1台のノードにすべてのリソース(CPU)を積んだ構成のほうがパフォーマンスがよい結果となります。よって後者の場合は、スケールアウト(ノード追加)よりスケールアップ(ノード内のCPU追加))のほうが効果があります。

RACの拡張性を確保する

次に、ノード間で同じデータにアクセスさせない工夫をすることで、拡張性を確保する手法を3つ紹介します。

1つ目が「ブロックの調整」です。キャッシュフュージョンは、オラクルのブロックと呼ばれる最小の領域単位で転送されます。ブロックの中の行データが多くなるほど、ノード間でそのブロックにアクセスしあう確率は高くなります。

従って、ブロックのサイズを小さくする、あるいは表や索引のPCTFREE値(ブロック内の空領域を指定するパラメータ)を大きくしてブロックの空き容量を大きくすることで、ブロックに含まれる行データを少なくすれば、キャッシュフュージョンを減らすことができます。ブロックの調整は、小さな表が競合を起こしそうな場合に有効な対応となります。

2つ目が「シーケンス番号の事前割り当て」です。シーケンスは複数のユーザが一意の整数を生成することができるオブジェクトで、主キー値を自動生成させる場合などに利用されます。RAC構成の場合、各ノードが該当シーケンスを利用して番号を作成する場合に競合が発生する可能性があります。シーケンスにCACHEオプションをつけることで、メモリ上に割り当てる順序番号の数を指定することができます。一度に割り当てる数を増やすことで、番号を割り当てる回数が減り、競合を減らすことができます。

3つ目が「パーティショニングの利用」です。パーティションを用いて、アクセスされるブロックを分散させ、競合を減らすことができます。例えば、INSERTの多い表に作成された索引では、特定のブロックにアクセスが集中します。これをハッシュパーティションと呼ばれる、ハッシュ値に応じてデータを分割する機能を利用すると、データが分散され競合を減らすことができます。

図3は更新競合を発生させたインデックスに対して、ハッシュパーティション化を行うことでスケールすることを確認した、1~8ノードの検証結果になります。パーティショニングを行わない場合と比較すると、パーティション化した場合はインスタンス数の増加に連れ処理量が大きく向上していることがわかります。

今回は、RACの耐障害性と拡張性を有効に活用する手法について紹介しました。次回は、応用編ということで、データベースの前にキャッシュされたデータベースを置きレスポンスを高速にする方法を紹介します。

伊藤忠テクノソリューションズ株式会社
ITエンジニアリング室 ミドルウェア推進部 DB技術課所属。2000年に伊藤忠テクノソリューションズ(CTC)入社。入社後はSybase、Oracleなど各種データベース製品のプリセールスや技術検証を担当し、大規模プロジェクトを経験。2008年にOracle Master Platinum Oracle Database 10gを取得。2008年から現職。http://www.ctc-g.co.jp/

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています