Oracleクライアントは「サービス」に接続する
Oracleクライアントは、ユーザー名とパスワード、Oracleリスナーのホスト名とポート番号、そしてサービス名を指定して接続リクエストを発行します。これはシングル・インスタンスでもRACでも同じです。Oracleインスタンスは自身の担当するサービス名をOracleリスナーに登録しています。このようにして、OracleリスナーはどのOracleインスタンスがどのサービスを担当しているかを把握します(図1)。RACの場合、複数のOracleインスタンスが同じ名前のサービスを担当することができます。サービス名のデフォルト値はデータベース名(Oracle初期化パラメータのDB_NAME.DB_DOMAIN)です。
Oracleリスナーは、Oracleクライアントから指定されたサービスを担当するOracleインスタンスと接続するためのOracleサーバー・プロセスを生成し、セッションを確立します。
RACの接続ロード・バランシング
RAC 11g R2以降では、各ノードにOracle Grid Infrastructure(GI)が管理するローカル・リスナー以外に、クラスタを代表するSingle Client Access Name(SCAN)リスナーと、SCANリスナーに対応するSCAN Virtual IPアドレス(SCAN VIP)がセットでクラスタのいずれかのノードで起動しています。SCANリスナーとSCAN VIPは可用性のために複数起動しています。複数あるSCAN VIPのIPアドレスはDNSで1つのホスト名に対応付けられます。もしSCANリスナーが起動しているノードで障害が発生すると、別の正常ノードにSCANリスナーがSCAN VIPとともにフェイルオーバーします。
Oracleインスタンスはローカル・ノードのOracleリスナーに担当サービスを登録するとともに、SCANリスナーにも登録します。そのため、SCANリスナーはRACの全インスタンスがどのサービスを担当しているかを把握しています(図2)。
Oracleリスナーには2つの役割があります。1つ目はOracleクライアントの接続リクエストを、ロード・バランシングを考慮しつつ適切なローカル・リスナーにリダイレクトすることです。2つ目はOracleインスタンスとのセッションを確立することです。接続リクエストのリダイレクト用にサービス登録するOracle初期化パラメータはREMOTE_LISTENERです。そしてセッション確立用にサービス登録するOracle初期化パラメータはLOCAL_LISTENERです。REMOTE_LISTENRに指定されたリスナーに全Oracleインスタンスからサービスの登録があるように構成されます。アプリケーション・サーバーなどのOracleクライアントは、このREMOTE_LISTENERで指定されたリスナーに接続リクエストを発行します。Oracleクライアントの接続文字列に記述するホスト名とポート番号は、シングル・インスタンスの場合はローカル・リスナーですが、RACの場合はリダイレクト用のリスナー(SCANリスナー)のものです。
SCANリスナーが実装される前のRAC 11g R1までは、すべてのローカル・リスナーにOracleインスタンスがサービスを登録し、すべてのローカル・リスナーが接続リクエストのリダイレクトとセッション確立の2つの役割を兼ねていました(図3)。SCANリスナーはRAC 11g R2で導入されました。SCANリスナーは接続リクエストのリダイレクト専用のリスナーで、ローカル・リスナーはセッションの確立を行います。
デフォルトのサービス名(=データベース名)はOracle Enterprise Managerなどの管理ツールが使用するので、アプリケーション接続用にはデフォルト・サービス名であるデータベース名ではなく、別途srvctlコマンドでサービスを作成するのを推奨します(図4)。
追加したサービスにはロード・バランシングの属性を設定することが可能です。追加したサービス(-service)に接続するには、Oracleクライアントの接続記述子のサービス名にOracle初期化パラメータDB_DOMAINを付加したものを指定します。各Oracleインスタンスへの物理コネクションの本数の配分は、接続ロード・バランシングの属性(-clbgoal)で設定します。これには長時間コネクションを維持する場合に使用するLONGと、短時間でコネクションを解放する場合に使用するSHORTがあります。