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))
)