はじめに
Oracle RACでは、複数のインスタンス間でクライアント接続を分散し、システム全体のリソースを効率的に活用するために、複数のロードバランシング機能が提供されています。
本記事では、これらの機能の仕組みと使い分けについて解説します。なおOracle 11g R2以降で使用できるSCANについては割愛します。
|
ロードバランシングの種類
Oracle RACでは、下図に示すロードバランシング機能を利用できます。

接続ロード・バランシング
クライアントが新規接続を確立する際に、複数のインスタンス間で接続先を分散する機能です。
以下の2種類があります。
- クライアントサイドロードバランス:Oracleクライアントがリスナーをランダムに選択します。
- サーバサイドロードバランス:Oracleサーバが接続要求を最適なノードへリダイレクトします。
ランタイム接続ロードバランシング
コネクションプール環境で使用できる機能です。
ロードバランシングアドバイザの情報をもとに、最も負荷の低いインスタンスへのコネクションを動的に割り当てる機能です。
接続ロードバランシング
クライアントサイドロードバランス
Oracleクライアントが、複数のリスナー・エンドポイント(TNS接続記述子に記載された複数のADDRESS句)からランダムに接続先を選択する方式です。

Oracleクライアントは、接続するインスタンス(リスナー・エンドポイント)をランダムに選択します。この方法により、RACインスタンス間でセッション数を分散させることを目指します。ただし、ランダム選択であるため、結果としてインスタンス間でセッション数に偏りが生じる可能性があります。
TNS設定例
<TNS_ALIAS> =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = ON)
(FAILOVER = ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = <DB01-vip1>)(PORT = <port>))
(ADDRESS = (PROTOCOL = TCP)(HOST = <DB02-vip2>)(PORT = <port>))
(ADDRESS = (PROTOCOL = TCP)(HOST = <DB03-vip3>)(PORT = <port>))
)
(CONNECT_DATA = (SERVICE_NAME = <service>))
)
※<>で示した箇所は環境に応じて書き換えます。
ポイント
- ADDRESS_LIST配下に
LOAD_BALANCE=ONを設定します。これにより複数のADDRESS句からランダムで選択されます。 FAILOVER=ONにより、接続失敗時に次のアドレスを自動的に試行します。FAILOVERはデフォルトでONのため省略可能ですが、動作を明確にするため記載を推奨します。
特徴
- クライアント側のみで設定でき比較的シンプルです。
- サーバ側の特別な設定が不要です。
- ただし、接続先をランダムに選択するため、インスタンス間で接続数の偏りが発生する可能性があります。
サーバサイドロードバランス
リスナーが接続要求を受けた際に、各インスタンスに登録されているサービスと負荷状況を基に、接続先インスタンスを決定してリダイレクトする方式です。

動作の流れ
- クライアントがいずれかのリスナーに接続要求を送信
- リスナーが各インスタンスのサービス情報と負荷状況を確認
- 最も負荷の低いインスタンスへ接続をリダイレクト
- クライアントはリダイレクト先のインスタンスとセッションを確立
ポイント
- RACの各インスタンスは、その負荷状況をリスナーに登録します。
- クライアント接続は負荷状況に基づいてより負荷の少ないインスタンスに振り分けられます。
必要な設定
サーバサイドロードバランシングを使用するためには、以下の初期化パラメータを設定する必要があります。また用途に応じてサービス属性の設定を変更します。
- 初期化パラメータ
パラメータ 設定内容 備考 local_listener インスタンスが存在するノードのリスナーの情報を設定します。 remote_listener クラスタ全体で共通のリスナー(通常はSCANリスナー)を指定します。 Oracle RAC 11g R2以降は、SCANリスナー名を指定するのが標準的な構成(DBCAによるデフォルト設定) listener_networks 複数のネットワーク(サブネット)を使用する場合に設定します。デフォルトVIP以外のVIPを追加した際、その追加VIP用のローカルリスナー名とリモートリスナー名を記述します。 - サービス属性(接続ロードバランシングの目標設定)
サービス属性 設定値 説明 CLB_GOAL LONG(デフォルト) バッチ処理のように長時間の接続を必要とするアプリケーション向きです。
インスタンス間でセッション数が均等になるように接続を振り分けます。SHORT OLTPのように短時間の接続が繰り返し実行されるアプリケーション向きです。
※コネクションプールを使う環境で、後述のランタイム接続ロードバランシングを使用する場合には、この設定と組み合わせます。

特徴
- リスナーが各インスタンスの負荷状況を確認して最適なインスタンスにリダイレクトします。
- セッション数均等化(CLB_GOAL=LONG)または負荷メトリクス(CLB_GOAL=SHORT)で振り分け。
- ただし、接続先をランダムに選択するため、インスタンス間で接続数の偏りが発生する可能性があります。
クライアントサイドとサーバサイドの関係
動作の優先順位
クライアントサイドの設定とサーバーサイドの設定の両方が有効な場合、サーバーサイドのロードバランシングが優先されます。
Oracleクライアントがランダムにリスナーを選択しても、そのリスナーがサーバーサイドロードバランシングを実行するため、最終的に負荷状況に基づいた接続インスタンスの振り分けが行われます。クライアントサイドの「ランダムに選択」という動作が実質的に無効化されます。
下図では、OracleクライアントがDB1のリスナーに接続要求を送っていますが、DB1のリスナーは受信した接続要求をDB3にリダイレクトします。結果、OracleクライアントはDB3のインスタンスに接続しセッションを確立します。

使い分けの考え方
サーバーサイドロードバランシングによる動作をクライアントサイドのみを使用する場合、すべてのインスタンスにおいてサーバーサイドロードバランシングの設定を解除する必要があります。
バッチ処理は特定のインスタンスで実行したい:クライアントサイド設定のみ、サーバーサイド無効化
ランタイム接続ロードバランシング
コネクションプールを利用している環境では、ロードバランシングアドバイザが各インスタンスの負荷情報をコネクションプールに提供します。この情報伝達にはFAN(Fast Application Notification)というOracle RACの機能が使われます。アプリケーションから接続要求があった際、コネクションプールはこの情報をもとに、最も負荷の低いインスタンスに接続されたコネクションを選択して返します。
ランタイム接続ロードバランシングは、ロードバランシングアドバイザからの情報に基づいて負荷の低いインスタンスに、より多く処理を割り振る動作であり、全体としてのスループット向上を目的とします。

動作の仕組み
- FANイベント通知:各インスタンスのロードバランシングアドバイザが、現在の負荷情報をFAN経由でWeb APサーバに通知
- 動的な振り分け:Web APサーバのコネクションプールは、アプリケーションから論理コネクション取得要求を受けた際、その時点で最も負荷の低いインスタンスへの物理接続を返す
- 継続的な最適化:負荷状況は常に変化するため、接続要求の度に最新の負荷情報に基づいて最適なインスタンスが選択される
ポイント
- コネクションプールが保持する各インスタンスへの接続から、
- 負荷の低いインスタンスに優先的に新規処理を割り当てることで、クラスタ全体のリソースを効率的に活用します。
必要な設定
サーバサイドロードバランシングを使用するために必要な初期化パラメータに加えて、ロードバランシングアドバイザの判断基準を設定します。
- 初期化パラメータ
パラメータ 設定内容 備考 local_listener インスタンスが存在するノードのリスナーの情報を設定します。 remote_listener 他のインスタンスが存在するノードのリスナーの情報を指定します。(通常はSCANリスナー) Oracle RAC 11g R2以降は、SCANリスナー名を指定するのが標準的な構成(DBCAによるデフォルト設定) listener_networks 複数のネットワーク(サブネット)を使用する場合に設定します。デフォルトVIP以外のVIPを追加した際、その追加VIP用のローカルリスナー名とリモートリスナー名を記述します。 - サービス属性(サービスレベルの目標設定)
サービス属性 設定値 説明 GOAL SERVICE_TIME 応答時間に基づいて接続を振り分けます。おもにOLTPアプリケーションに向いています。 THROUGHPUT スループットに基づいて接続を振り分けます。おもにバッチアプリケーションに向いています。 NONE(デフォルト) ロードバランシングアドバイザを無効化します。
ロードバランシング機能の使い分け
以下は各ロードバランシング機能の判断基準の一例です。
クライアントサイドロードバランシングの適用判断
- サーバ側の設定を変更できない環境。
- シンプルな構成を優先したい。
- レガシー環境(Oracle 10g以前)で使用する必要がある。
サーバサイドロードバランシングの適用判断
- 負荷状況に基づいた効率的なリソース活用が必要。
- ノードの増減が想定され、クライアント設定の変更を避けたい。
- 高可用性と最適なパフォーマンスを実現したい。
ランタイム接続ロードバランシングの適用判断
- コネクションプールを利用している。
- インスタンス間の負荷差を動的に解消したい。
- 全体のスループットを最大化したい。
- 負荷状況に応じた柔軟な処理の割り振りたい。
まとめ
接続ロードバランシング
クライアントが新規接続を確立する際に、RACのインスタンス間で接続先を分散する機能です。
- クライアントサイド:Oracleクライアントがリスナーをランダムに選択します。
- サーバサイド:OracleサーバがRACの各インスタンスの負荷状況をもとに接続要求を最適なノードへリダイレクトします。
ランタイム接続ロードバランシング
コネクションプールを利用している環境で、より処理性能を向上させるための仕組みです。ロードバランシングアドバイザの情報に基づいて、コネクションプールから負荷の低いインスタンスへのコネクションを振り分けます。

