9.2 高速接続フェイルオーバーについて
この項には次のサブセクションが含まれます:
9.2.1 高速接続フェイルオーバーの概要
高速接続フェイルオーバー(FCF)機能は、接続プールを通して実装される高速アプリケーション通知(FAN)クライアントです。この機能には、Oracle JDBCドライバと、Oracle RAC、Single RestartまたはActive Data Guardなどの高可用性(HA)データベース構成を使用する必要があります。
ノート:
この項では、Oracle RACでFCFを使用する際にアプリケーションで実行する必要があるステップについてのみ説明します。関連項目:
詳細は、『Oracle Real Application Clusters管理およびデプロイメント・ガイド』を参照してください。-
計画外停止: FCFは停止した接続を迅速に検出し、終了してプールから削除します。接続を削除するには、システムが応答しなくなることを防ぐために、迅速にサーバーソケットの接続を切断する必要があります。流用された接続および使用中の接続には、計画外停止の場合にのみ割込みが発生します。
-
計画済停止: FCFは、作業が完了し接続の制御がプールに戻されるまで、流用された接続または使用中の接続を中断およびクローズしません。
-
致命的な接続エラーおよび例外: FCFは、再試行を確実かつ効果的に行うため、致命的な接続エラーおよび例外を
isValid
APIにカプセル化します。 -
新規ノードのクラスタへの追加: FCFは、Oracle RACクラスタに加わる新規ノードを認識し、新しい接続をそのノードに適切に配置して、アプリケーションの実行時に最高品質のサービスを提供します。これにより、Oracle RACノードの追加とアプリケーション層からの作業リクエスト・ルーティングの中間層の統合が容易になります。
-
実行時作業リクエスト: FCFは、実行時作業リクエストをすべてのアクティブなOracle RACインスタンスに配布します。
計画外停止のシナリオ
FCFでは、Oracle RACクラスタに対する失効した接続を検出および削除することで、計画外停止のシナリオをサポートします。失効した接続には、サービス停止およびノード停止イベントのために、Oracle RACクラスタのインスタンスで利用できるサービスのない接続が含まれます。流用された接続と、使用可能な接続のうち失効しているものが検出され、それらのネットワーク接続が切断されてプールから削除されます。これらの削除された接続は、プールで置き換えられません。かわりに、アプリケーションでは接続を使用して処理を実行する前に、接続を再試行する必要があります。
ノート:
流用された接続は、計画外停止のシナリオ時にただちに終了およびクローズされます。実行中のトランザクションは、即座に例外を受け取ります。計画停止のシナリオ
FCFでは、Oracle RACサービスを適切に停止できる計画停止のシナリオをサポートします。このシナリオの場合、失効している流用された接続はマークが付けられ、プールに返された後に終了および削除されます。実行中のトランザクションに変化はなく、完了するまで続行されます。
計画外停止と計画停止のシナリオの主な違いは、流用された接続の処理方法です。プール内でアイドル状態の(流用されていない)失効した接続は、計画外停止のシナリオと同じ方法で削除されます。
UCPは、計画停止したOracle RACインスタンスからの正常な接続の排出もサポートします。影響を受ける、流用されている接続は、プールに戻るとすぐに削除されるのではなく、猶予期間にスムーズに削除されます。これはサービスの再配置中のスループットの影響とログオン・ストームを避ける際に役立ちます。
Oracle RACインスタンスの再追加および新しいインスタンスのシナリオ
FCFでは、Oracle RACクラスタが関係するサービスを提供するインスタンスを追加するシナリオをサポートします。インスタンスは、クラスタにとって新しいものでも、停止イベント後に再起動されたものでもかまいません。どちらの場合でも、UCPは新しいインスタンスを認識し、必要に応じてノードへの接続を作成します。
関連トピック
9.2.2 高速接続フェイルオーバーとは
高速接続フェイルオーバーを使用可能に設定すると、メカニズムは自動なので、アプリケーションによる操作は必要ありません。この項では、次の項の接続フェイルオーバーがアプリケーションに提示される仕組みと、アプリケーションによるリカバリのステップを説明します。
9.2.2.1 アプリケーションによる認識
Oracle RACサービス障害がJDBCアプリケーションに伝播される前に、データベースはローカル・トランザクションをすでにロールバックしています。次に、キャッシュ・マネージャがすべての無効な接続をクリーン・アップします。無効な接続を保持しているアプリケーションがその接続を通して機能しようとすると、「SQLException, ORA-17008, クローズされた接続です。
」を受け取ることがあります。
アプリケーションが「クローズされた接続です。
」エラー・メッセージを受信した場合、次のことを実行する必要があります。
-
接続要求を再試行します。古い接続はオープンでないため、これは必須です。
-
トランザクションを再実行します。接続がクローズする前に実行された作業はすべて失われています。
ノート:
アプリケーションによってトランザクションをロールバックしないでください。アプリケーションが例外を受信した時点で、トランザクションはすでにデータベースでロールバックされています。
9.2.2.2 FCFの特長
高速接続フェイルオーバーでは、キャッシュ内の各接続はサービス、インスタンス、データベースおよびホスト名へのマッピングを維持します。
データベースがOracle RACイベントを生成すると、そのイベントはJDBCが稼働中であるJVMに転送されます。JVM内のデーモン・スレッドがOracle RACイベントを受信し、それをConnection Cache Managerに転送します。次に、Connection Cache ManagerはOracle RACイベントの影響を受けるアプリケーションに対してSQL例外を発行します。
一般的なフェイルオーバーの例を次に示します。
-
データベース・インスタンスで障害が発生し、キャッシュ内にいくつかの失効した接続が残ります。
-
データベース内のOracle RACメカニズムがOracle RACイベントを生成し、そのイベントはJDBCが含まれているJVMに送信されます。
-
JVM内のデーモン・スレッドはOracle RACイベントの影響を受けるすべての接続を検出し、SQL例外によって接続がクローズされたことを通知し、オープンなトランザクションがあればすべてロールバックします。
-
各接続はSQL例外を受信し、再試行します。
9.2.3 高速接続フェイルオーバーの前提条件
高速接続フェイルオーバーを使用するには、次の前提条件を満たしている必要があります。
-
ユニバーサル接続プールが有効です。
高速接続フェイルオーバーは、JDBC接続キャッシュ・メカニズムとの組合せで動作します。これにより、アプリケーションは接続を管理して高可用性を確保します。
-
アプリケーションがデータベースへの接続にサービス名を使用していること
アプリケーションはサービス識別子を使用できません。
-
基礎となるデータベースには、Oracle Database 12cリリース1 (12.1)以降のReal Application Clusters (Oracle RAC)機能、または単一インスタンス・データベースかOracle RACのいずれかで構成されたOracle Data Guardがあること。
フェイルオーバー・イベントが伝播しないと、接続フェイルオーバーは発生しません。
-
JDBCが稼働しているノードでOracle Notification Service(ONS)が構成されており、使用可能であること
JDBCは、データベース・イベントの伝播およびJDBCへのイベントの通知を行うために、ONSに依存しています。
-
JDBCインスタンスが稼働しているJava仮想マシン(JVM)で、
oracle.ons.oraclehome
がORACLE_HOME
を指すように設定されていること
9.2.4 高速接続フェイルオーバーの構成の例
次の例では、FCF機能を使用する接続プールを示します。FCFは、プール対応のデータソースを使用して構成されます。この例では、FCFの有効化、Oracle Notification Service(ONS)の構成および接続URLの構成が行われます。これらの項目については、例の後で説明します。
通常、oracle.ucp.jdbc.ValidConnection
インタフェースのisValid
メソッドはFCF機能とともに使用され、Oracle RAC停止イベントによってSQL例外がスローされた後でも流用された接続が使用可能かどうかをチェックするために使用されます。次に例を示します。
try { conn = pds.getConnection; ...}catch (SQLException sqlexc) { if (conn == null || !((ValidConnection) conn).isValid()) // take the appropriate action ... conn.close(); }
例9-1 高速接続フェイルオーバーの構成の例
PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource(); pds.setConnectionPoolName("FCFSamplePool"); pds.setFastConnectionFailoverEnabled(true); pds.setONSConfiguration("nodes=racnode1:4200,racnode2:4200\nwalletfile= /oracle11/onswalletfile"); pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource"); pds.setURL("jdbc:oracle:thin@(DESCRIPTION= "+ "(LOAD_BALANCE=on)"+ "(ADDRESS=(PROTOCOL=TCP)(HOST=racnode1) (PORT=1521))"+ "(ADDRESS=(PROTOCOL=TCP)(HOST=racnode2) (PORT=1521))"+ "(CONNECT_DATA=(SERVICE_NAME=service_name)))"); ...
関連トピック
9.2.5 高速接続フェイルオーバーの有効化
FCFプール・プロパティを使用して、FCFを有効または無効にします。デフォルトではFCFは無効になっています。次の例では、例9-1に示されているFCFの有効化を示します。
pds.setFastConnectionFailoverEnabled(true);
ノート:
Oracle Database 12cリリース1 (12.1.0.2)以降、UCPはoracle.ucp.PlannedDrainingPeriod
システム・プロパティをサポートします。計画停止により影響を受ける、流用されている接続をプールがスムーズに排出する猶予期間を指定します(整数の秒数)。同じデータベース・サービスが、停止中のものとは別のインスタンスで使用可能になると、排出が開始されます。
このプロパティが設定されていない、または0
に設定されている場合、プールは影響を受ける、流用されている接続がプールに戻されるとすぐにクローズします。
高速接続フェイルオーバーのステータスの問合せ
アプリケーションは、高速接続フェイルオーバーが使用可能になっているかどうかを判断するために、OracleDataSource.getFastConnectionFailoverEnabled
をコールします。フェイルオーバーが使用可能な場合はtrue
が、それ以外の場合はfalse
が戻されます。
ノート:
FCFは、実行時接続ロード・バランシングおよび接続アフィニティを使用する場合にも有効にする必要があります。これらの機能については、この章で後述します。
9.2.6 ONSとは
FCFは、Oracle Notification Service(ONS)を利用して、接続プールとOracle RACデータベース間でデータベース・イベントを伝播します。接続プールは、実行時にONS環境を設定できる必要があります。ONS(ons.jar
)はOracle Clientソフトウェアに同梱されています。ONSは、リモート構成またはクライアント側のONSデーモン構成を使用して構成できます。リモート構成は、スタンドアロンのクライアント・アプリケーションに適した構成です。このセクションのトピックは次のとおりです:
9.2.6.1 ONS構成ファイルの概要
ONS構成は、ONSの構成ファイルORACLE_HOME
/opmn/conf/ons.config
を使用して制御します。このファイルは、ONSデーモンにその動作方法を示します。ons.config
内の構成情報は、単純な名前と値のペアで定義されます。
ons.config
ファイルのパラメータには必須のものとオプションのものがあります。表9-2は必須のONS構成パラメータを示し、表9-3はオプションのONS構成パラメータを示します。ons.config
ファイルの更新後に、ONSをリフレッシュする必要があります。
表9-2 必須のONS構成パラメータ
パラメータ | 説明 |
---|---|
|
ローカル・クライアントと通信するために、ONSがローカル・ホスト・インタフェースでバインドするポートを指定します。 たとえば、 |
|
他のONSデーモンと通信するために、ONSがすべてのインタフェースでバインドするポートを指定します。 たとえば、 |
|
通信相手である他のONSデーモンのリストを指定します。ノード値は、ホスト名またはIPアドレスにポートを追加したもののカンマ区切りのリストとして指定します。提供するポート値は、各ONSインスタンスがリスニングしているリモート・ポートです。全ノードで同一のファイルを維持するために、現行のONSノードの たとえば、 ノード行にリスト表示されているノードは、Oracle RACインスタンス内の個別のノードに対応します。ノードをリストに含めることにより、中間層ノードはOracle RACノードと確実に通信できます。最低1つの中間層ノードと、1つのOracle RACインスタンス内のノードを構成しないと、互いが認識されません。それぞれの側で最低1つのノードが互いを認識していると、すべてのノードが認識されます。各Oracle RACノードのONS構成ファイルでは、すべての単一クラスタおよび中間層ノードをリスト表示する必要はありません。特に、1つのONS構成ファイル・クラスタ・ノードが中間層を認識している場合、クラスタ内のすべてのノードが中間層を認識しています。 |
表9-3 オプションのONS構成パラメータ
パラメータ | 説明 |
---|---|
|
記録するONSコンポーネントを指定します。書式は次のとおりです。 <component>[<subcomponent>,...];<component>[<subcomponent>,...];... サブコンポーネントを指定する必要がない場合、コンポーネント名の後にカッコ([])を含まないでください。サブコンポーネントからメッセージを除外するには、サブコンポーネント名の前に感嘆符(!)が必要です。たとえば、 [all,!topology] メッセージを除外するサブコンポーネントを指定する前に、サブコンポーネントがメッセージを含むことを最初に確認する必要があります。 次に、コンポーネントの有効な値を示します。
次の例は、 logcomp=ons[all,!secure] |
|
ONSがメッセージの記録に使用するログ・ファイルを指定します。ログ・ファイルのデフォルト値は たとえば、 |
|
Oracle Secure Sockets Layer(SSL)がSSL証明書の格納に使用するウォレット・ファイルを指定します。ONSでウォレット・ファイルが指定されると、他のONSインスタンスとの通信時にSSLを使用し、接続しようとするすべてのONSインスタンスからSSL証明書の認証を要求します。つまり、1つのONSインスタンスでSSLを有効にする場合、このインスタンスと接続されているすべてのインスタンスでも有効にする必要があります。この値は、 たとえば、 |
|
ONSがすべてのOracle RACノードおよびポート番号を、ONS構成ファイルでなくOracle Cluster Registry (OCR)に格納するかどうかを示す、サーバー側での使用のために予約されている値を指定します。 このオプションは、クライアント側では使用しないでください。 |
|
|
ons.config
ファイルでは、ナンバー記号(#
)で始まる行に空白行およびコメントを使用できます。
9.2.6.2 ONSのリモート構成
UCPでは、ONSConfiguration
プール・プロパティを使用したONSのリモート構成をサポートします。ONSConfiguration
プール・プロパティ値は、ons.config
ファイルの内容に酷似している文字列です。この文字列は、改行文字(\n
)で区切られたname=value
ペアのリストからなります。このプール・プロパティは、次の2つの方法で設定できます。
-
名前は、
nodes
、walletfile
、walletpassword
のいずれかです。パラメータ文字列では、少なくともONS構成のnodes
属性をカンマ区切りのhost:port
ペアのリストとして指定する必要があります。walletfile
属性がOracleウォレット・ファイルとして指定される場合は、SSLが使用されます。次の例では、例9-1に示されているONS構成文字列を示します。
... pds.setONSConfiguration("nodes=racnode1:4200,racnode2:4200\nwalletfile=/oracle11/onswalletfile"); ...
-
名前は、
propertiesfile
にしかできません。この値は、ONS固有のJavaプロパティ・ファイルの場所です。このファイルには、oracle.ons.nodes
プロパティと、次のONS Javaプロパティの一方または両方が含まれている必要があります。-
oracle.ons.walletfile
-
oracle.ons.walletpassword
次の例では、このような
ONSConfiguration
文字列を示します。pds.setONSConfiguration("propertiesfile=/usr/ons/ons.properties");
Javaプロパティ・ファイル
ons.properties
の内容の例を次に示します。oracle.ons.nodes=racnode1:4200,racnode2:4200 oracle.ons.walletfile=/oracle11/onswalletfile
-
ノート:
構成文字列内のパラメータは、Oracle RAC Databaseのパラメータと一致する必要があります。さらに、Oracle Application Serverを使用する場合、サーバーに適用可能な手順を使用してONSを構成する必要があります。
スタンドアロンJavaアプリケーションの場合、setONSConfiguration
メソッドを使用してONSを構成する必要があります。ただし、アプリケーションが次の要件を満たす場合、FCFを有効化するために、setONSConfiguration
メソッドを呼び出す必要はなくなります。
-
アプリケーションがOracle Database 12cリリース1 (12.1)以降のUCPおよびOracle RAC Database 12cリリース1 (12.1)を使用している
-
アプリケーションでONSウォレットまたはキーストアを必要としない
9.2.6.3 クライアント側のONSデーモンの構成
クライアント側のONSデーモン構成は、Oracle Application Serverなどの中間層サーバーで実行される典型的なアプリケーションです。このシナリオでのクライアントは、ons.config
ファイルを更新することでONSを直接構成します。ファイルの場所は、プラットフォームによって異なります。例9-2では、例9-1用のons.config
ファイルを示します。
ノート:
クライアント側のONSデーモン構成では、接続プールを起動するオペレーティング・システム(OS)ユーザーと、クライアント側のデーモンを起動するOSユーザーが異なる場合、どちらのユーザーも同じOSグループに属する必要があります。また、allowgroup
パラメータの値は、ons.config
ファイルでtrue
に設定する必要があります。
ONSを構成した後、onsctl
コマンドでONSデーモンを起動します。ONSデーモンが常に実行中であることを確認する必要があります。
onsctlコマンドの使用
構成後、ORACLE_HOME
/opmn/bin/onsctl
を使用してONSデーモンの起動、停止、再構成および監視を行います。表9-4は、onsctl
でサポートされているコマンドのサマリーを示しています。
表9-4 onsctlコマンド
コマンド | 効果 | 出力 |
---|---|---|
|
ONSデーモンを起動 |
|
|
ONSデーモンを停止 |
|
|
ONSデーモンが稼働中であるかどうかを検証 |
|
|
ONSデーモンをシャットダウンせずにONS構成のリロードをトリガー |
|
|
onsctlのヘルプ・サマリー・メッセージを出力 |
|
|
onsctlの詳細ヘルプ・メッセージを出力 |
ノート:
-
JDBCインスタンスが実行されているJava仮想マシン(JVM)では、アプリケーションの起動前に
oracle.ons.oraclehome
システム・プロパティをORACLE_HOME
の場所に設定する必要があります。次に例を示します。java -Doracle.ons.oraclehome=$ORACLE_HOME ...
-
UCPに対してはONSのリモート構成をお薦めします。
ノート:
Oracle RAC 12.1.0.2.0では、デフォルトで、サーバーのインストールにwalletfile
ONSパラメータの値の設定が必要で、すべてのONS接続にSSLの使用が強制されます。
ONSリモート構成文字列またはローカル構成ファイルのwalletfile
パラメータをすでに使用しているUCPアプリケーションがある場合、要件は、同じトポロジでは、クライアント側のウォレット・ファイルにサーバー側のウォレット・ファイルと同じ内容が含まれる必要があることだけです。サーバー側ファイルのコピーを作成し、クライアント側で使用できるようにすることができます。
walletfile
パラメータを設定せずにOracle RAC機能を使用しているUCPアプリケーションの場合、次のいずれかを実行する必要があります。
-
例9-1に示すように、walletfileパラメータの設定をONSリモート構成文字列またはローカル構成ファイルに追加します。同じトポロジでは、クライアント側のウォレット・ファイルには、Oracle RACサーバー側のウォレット・ファイルと同じ内容が含まれる必要があることに注意してください。
-
次のコマンドを実行して
walletfile
パラメータ設定をクライアントおよびサーバーのONS構成文字列およびローカル構成ファイルから削除します。srvctl modify nodeapps -clientdata
セキュアな通信のために、Oracle RAC 12.1.0.2.0を最初にインストールする、またはパッチを適用すると、Oracle RAC 12.1.xのONS自動構成は機能しなくなります。かわりに、アプリケーションは明示的ONS構成(リモートまたはローカル)を使用し、前述のいずれかの変更を行う必要があります。
例9-2 サンプルのons.configファイルの例
# This is an example ons.config file # # The first three values are required localport=4100 remoteport=4200 nodes=racnode1.example.com:4200,racnode2.example.com:4200
9.2.7 接続URLの構成
コネクション・ファクトリの接続URLでは、FCFを使用する際、サービス名の構文を使用する必要があります。サービス名は、接続プールをサービスにマップするために使用されます。また、ファクトリ・クラスはOracleファクトリ・クラスである必要があります。次の例では、例9-1に示されている接続URLの構成を示します。
... pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource"); pds.setURL("jdbc:oracle:thin@//host:port/service_name"); ...
ノート:
FCFが有効である場合、サービス識別子(SID)を接続URLに指定すると、例外がスローされます。
次の例では、Oracle RACデータベースに接続する際の有効な接続URLの構文を示します。Oracle JDBC ThinドライバとOracle OCIドライバの両方の例が含まれています。URLを使用してOracle RACノード間のロード・バランシングを明示的に有効にできることに注意してください。
有効な接続URLの使用方法
pds.setURL("jdbc:oracle:thin@//host:port/service_name"); pds.setURL("jdbc:oracle:thin@//cluster-alias:port/service_name"); pds.setURL("jdbc:oracle:thin:@(DESCRIPTION= "+ "(LOAD_BALANCE=on)"+ "(ADDRESS=(PROTOCOL=TCP)(HOST=host1)(PORT=1521))"+ "(ADDRESS=(PROTOCOL=TCP)(HOST=host2)(PORT=1521))"+ "(CONNECT_DATA=(SERVICE_NAME=service_name)))"); pds.setURL("jdbc:oracle:thin:@(DESCRIPTION= "+ "(ADDRESS=(PROTOCOL=TCP)(HOST=cluster_alias) (PORT=1521)) "+ "(CONNECT_DATA=(SERVICE_NAME=service_name)))"); pds.setURL("jdbc:oracle:oci:@TNS_ALIAS"); pds.setURL("jdbc:oracle:oci:@(DESCRIPTION= "+ "(LOAD_BALANCE=on) "+ "(ADDRESS=(PROTOCOL=TCP)(HOST=host1) (PORT=1521)) "+ "(ADDRESS=(PROTOCOL=TCP)(HOST=host2)(PORT=1521)) "+ "(CONNECT_DATA=(SERVICE_NAME=service_name)))"); pds.setURL("jdbc:oracle:oci:@(DESCRIPTION= "+ "(ADDRESS=(PROTOCOL=TCP)(HOST=cluster_alias) (PORT=1521)) "+ "(CONNECT_DATA=(SERVICE_NAME=service_name)))");