Link+

MAIL

Oracle RAC(Real Application Cluster)

Oracle Real Application Cluster(RAC)は、一つのデータベースに複数のインスタンスをたてる技術である。

RACによって、インスタンスが起動しているサーバーでハードウェア障害やOSの障害が発生しても、残りのサーバーでサービスが提供できるようになる。なお、データを保持している共有ストレージで発生する障害については、RACでは対応できない。つまり、RACによってデータの安全性が高まるわけではない。

RAC導入でパフォーマンスアップが期待できるのは、CPUがボトルネックになっている処理である。大規模な結合やソートを行うデータウェアハウスの処理がこれにあたる。なお、共有ストレージは複数のインスタンスで共有しているので、ディスクI/Oがボトルネックになっている処理ではパフォーマンス向上は期待できない。オンライントランザクション処理ではパフォーマンスアップはそれほど期待できない。ただし、RAC導入より、スケーラビリティが向上するため、インスタンス数を増やして、クライアントからの処理要求を分散させることで、オンライントランザクション処理でもパフォーマンス向上が期待できる。

個人的に、10gR2のRACは導入の難易度が高いと思う。Oracleのサポートが受けられない状態で、RAC構成組んでいるサーバーの面倒見るのは難しいのではないだろうか。11gでは導入は容易になったと聞いているが、試していないのでわからない。

RACの概要

パブリックネットワークとインターコネクト(プライベートネットワーク)

ここで、使う「パブリック」と「プライベート」はIPアドレスの区別ではない。Oracle RACにおける概念である。

プライベートネットワークはRACを構成するインスタンス間で通信を行うためのネットワークである。

パブリックネットワークはデータベースを使用するクライアントが使用するネットワークである。

各サーバーにはパブリックネットワーク用とプライベートネットワーク用の2つのネットワークカードが必要である。

キャッシュフュージョン

キャッシュフュージョンはRAC構成において、複数のサーバー間でデータの整合性を維持する仕組みである。

インターコネクトを使用する。

RAC構成をしている場合、キャッシュをネットワーク経由で共有しているイメージとなる。

サーバーがデータを読み込む場合は次のような手順を踏む。

一方のサーバー(サーバー1)がデータを読む時、まず、どちらのサーバーがキャッシュを保持しているかを確認する。

ローカルキャッシュにある場合は、そこから読み取る。

もう一方のサーバー(サーバー2)が保持している場合は、そのサーバーからキャッシュを読み込む。なお、この時サーバー2側でデータを変更している場合、行レベルのロックが保持された状態でサーバー1へキャッシュの転送が行われる。

どちらのサーバーでもキャッシュされていない場合は共有ストレージからサーバー1がデータを読み込み、キャッシュする。

キャッシュはブロック単位で行われる。

RACのフェイルオーバー

仮想IPアドレス

RACでフェイルオーバー構成を行う際、パブリックネットワーク側に仮想IPアドレスを設定しておく必要がある。

クライアント側はデータベースに接続する際、仮想IPアドレスを使用することで、アクセスしようとしたサーバーが停止していても即時に接続エラーを受け取ることができる。TCP/IPレベルのタイムアウトを待つ必要はない。

クライアントの設定①

クライアント側の接続記述子(tnsnames.ora)に次の設定を行う。

CRM=
    (DESCRIPTION = 
        (ADDRESS_LIST=
        (FAILOVER = ON)
        (ADDRESS = (PROTOCOL = TCP)(HOST = sv1-vip)(PORT = 1521))
        (ADDRESS = (PROTOCOL = TCP)(HOST = sv2-vip)(PORT = 1521))
        )
    (CONNECT_DATA = (SERVICE_NAME = CRM))
)
				

sv1-vip、sv2-vipはローカルのアドレス解決テーブル(UNIX系では/etc/hosts、Windowsでは/system32/drivers/hosts など)、またはDNSによりIPアドレスに解決できることが前提である。

なお、このクライアント側の設定のみでは、接続を試みた時にエラー通知される。接続中のエラーに対応するには、次のTAF構成が必要である

透過的アプリケーションフェイルオーバー(TAF)

TAF構成にすることで、接続中にデータベース側で発生したエラーの通知をクライアント側で受け取ることができる。

TAF構成にはTAF基本接続とTAF事前接続がある。

どちらの構成でもトランザクションは障害発生時点でロールバックされるが、SELECT文はオプションによって継続可能である。

TAF基本接続(BASIC)

クライアントとサーバー間に1本の接続を確立する。

再接続が必要な処理が行われた時にリスナーを使って再接続を試みる。

TAF事前接続(PRECONNECT)

最初に接続する時に、クライアントとサーバー間に2本の接続(通常の接続とシャドー接続)を確立する。

サーバー側でインスタンス障害が発生した際は、もう一つの接続(シャドー接続)を使用して、処理を続けられる。

→この場合でもトランザクションはロールバックされる。

RACのロードバランシング構成

クライアント側の設定で構成

この設定では、ロードバランシング先が負荷状況に関わらずランダムに選択される。

クライアント側の接続記述子(tnsnames.ora)に次の設定を行う。

CRM=
    (DESCRIPTION = 
        (ADDRESS_LIST=
        (LOAD_BALANCE = ON)
        (ADDRESS = (PROTOCOL = TCP)(HOST = sv1-vip)(PORT = 1521))
        (ADDRESS = (PROTOCOL = TCP)(HOST = sv2-vip)(PORT = 1521))
        )
    (CONNECT_DATA = (SERVICE_NAME = CRM))
)
				

sv1-vip、sv2-vipはローカルのアドレス解決テーブル(UNIX系では/etc/hosts、Windowsでは/system32/drivers/hosts など)、またはDNSによりIPアドレスに解決できることが前提である。

サーバー側の設定での構成

この設定では、サーバー側の負荷を考慮してロードバランシング先が決定される。

リスナーは、クライアントからの接続を受けた時点で、適したインスタンスに接続をリダイレクトする。

初期パラメータファイルとサーバー側の接続記述子ファイルに設定を行う。

初期パラメータの設定

*.REMOTE_LISTENER = LISTENER_RACDB
				

サーバー側の接続記述子(tnsnames.ora)の設定

LISTENERS_RACDB =
    (ADDRESS_LIST = 
        (ADDRESS = (PROTOCOL = TCP)(HOST = sv1-vip)(PORT = 1521))
        (ADDRESS = (PROTOCOL = TCP)(HOST = sv2-vip)(PORT = 1521))
    )