9.2 高速接続フェイルオーバーの概要

この項には次のサブセクションが含まれます:

9.2.1 高速接続フェイルオーバーの概要

高速接続フェイルオーバー(FCF)機能は、接続プールを通して実装される高速アプリケーション通知(FAN)クライアントです。この機能には、Oracle JDBCドライバおよびOracle RACデータベースか、または単一インスタンス・データベース上のOracle Restartを使用する必要があります。

注意:

この項では、Oracle RACでFCFを使用する際にアプリケーションで実行する必要がある手順についてのみ説明します。

関連項目:

Oracle RACデータベースの設定の詳細は、『Oracle Real Application Clusters管理およびデプロイメント・ガイド』を参照するか、Oracleデータベース管理者に問い合せてください。

FCFは、高可用性のためにプールされた接続を管理します。次の機能があります。

  • FCFは計画外停止をサポートします。デッド接続はすぐに検出され、中断されてプールから削除されます。接続の削除では、中断が発生するとすみやかにソケット接続を切断し、ハングを回避します。流用された接続および使用中の接続には、計画外停止の場合にのみ割込みが発生します。

  • FCFで計画停止をサポートします。流用された接続および使用中の接続には、処理が完了して接続の制御がプールに戻るまで、割込みやクローズは発生しません。

  • FCFは、再試行を確実かつ効果的に行うため、致命的な接続エラーおよび例外をisValid APIにカプセル化します。

  • FCFは、Oracle RACクラスタに加わる新規ノードを認識して、新しい接続を適切にそのノードに配置し、アプリケーションの実行時に最高品質のサービスを提供します。これにより、Oracle RACノードの追加とアプリケーション層からの作業リクエスト・ルーティングの中間層の統合が容易になります。

  • FCFは、実行時作業リクエストをすべてのアクティブなOracle RACインスタンスに配布します。

計画外停止のシナリオ

FCFでは、Oracle RACクラスタに対する失効した接続を検出および削除することで、計画外停止のシナリオをサポートします。失効した接続には、サービス停止およびノード停止イベントのために、Oracle RACクラスタのインスタンスで利用できるサービスのない接続が含まれます。流用された接続および使用可能な接続のうち失効しているものが検出され、それらのネットワーク接続が切断されてプールから削除されます。これらの削除された接続は、プールで置き換えられません。かわりに、アプリケーションでは接続を使用して処理を実行する前に、接続を再試行する必要があります。

注意:

流用された接続は、計画外停止のシナリオの際、ただちに中断およびクローズされます。実行中のトランザクションは、即座に例外を受け取ります。

計画停止のシナリオ

FCFでは、Oracle RACサービスを適切に停止できる計画停止のシナリオをサポートします。このシナリオの場合、失効している流用された接続にはマークが付けられ、プールに返された後にのみ中断および削除が行われます。実行中のトランザクションに変化はなく、完了するまで続行されます。

計画外停止と計画停止のシナリオの主な違いは、流用された接続の処理方法です。プール内でアイドル状態の(流用されていない)失効した接続は、計画外停止のシナリオと同じ方法で削除されます。

Oracle Database 12cリリース1 (12.1.0.2)以降、UCPは計画停止Oracle RACインスタンスからの適切な接続の排出をサポートします。影響を受ける、流用されている接続は、プールに戻るとすぐに削除されるのではなく、猶予期間にスムーズに削除されます。これはサービスの再配置中のスループットの影響とログオン・ストームを避ける際に役立ちます。

Oracle RACインスタンスの再追加および新しいインスタンスのシナリオ

FCFでは、Oracle RACクラスタが関係するサービスを提供するインスタンスを追加するシナリオをサポートします。インスタンスは、クラスタにとって新しいものでも、停止イベント後に再起動されたものでもかまいません。どちらの場合でも、UCPは新しいインスタンスを認識し、必要に応じてノードへの接続を作成します。

9.2.2 高速接続フェイルオーバーとは

高速接続フェイルオーバーを使用可能に設定すると、メカニズムは自動なので、アプリケーションによる操作は必要ありません。この項では、次の項の接続フェイルオーバーがアプリケーションに提示される仕組みと、アプリケーションによるリカバリの手順を説明します。

9.2.2.1 アプリケーションによる認識

Oracle RACサービス障害がJDBCアプリケーションに伝播される前に、データベースはローカル・トランザクションをすでにロールバックしています。次に、キャッシュ・マネージャがすべての無効な接続をクリーン・アップします。無効な接続を保持しているアプリケーションがその接続を通して機能しようとすると、「SQLException, ORA-17008, クローズされた接続です。」を受け取ることがあります。

アプリケーションが「クローズされた接続です。」エラー・メッセージを受信した場合、次のことを実行する必要があります。

  1. 接続要求を再試行します。古い接続はオープンでないため、これは必須です。

  2. トランザクションを再実行します。接続がクローズする前に実行された作業はすべて失われています。

注意:

アプリケーションによってトランザクションをロールバックしないでください。アプリケーションが例外を受信した時点で、トランザクションはすでにデータベースでロールバックされています。

9.2.2.2 FCFの特長

高速接続フェイルオーバーでは、キャッシュ内の各接続はサービス、インスタンス、データベースおよびホスト名へのマッピングを維持します。

データベースがOracle RACイベントを生成すると、そのイベントはJDBCが稼働中であるJVMに転送されます。JVM内のデーモン・スレッドがOracle RACイベントを受信し、それをConnection Cache Managerに転送します。次に、Connection Cache ManagerはOracle RACイベントの影響を受けるアプリケーションに対してSQL例外を発行します。

一般的なフェイルオーバーの例を次に示します。

  1. データベース・インスタンスで障害が発生し、キャッシュ内にいくつかの失効した接続が残ります。

  2. データベース内のOracle RACメカニズムがOracle RACイベントを生成し、そのイベントはJDBCが含まれているJVMに送信されます。

  3. JVM内のデーモン・スレッドはOracle RACイベントの影響を受けるすべての接続を検出し、SQL例外によって接続がクローズされたことを通知し、オープンなトランザクションがあればすべてロールバックします。

  4. 各接続は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.oraclehomeORACLE_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構成パラメータ

パラメータ 説明

localport

ローカル・クライアントと通信するために、ONSがローカル・ホスト・インタフェースでバインドするポートを指定します。

たとえば、localport=4100です

remoteport

他のONSデーモンと通信するために、ONSがすべてのインタフェースでバインドするポートを指定します。

たとえば、remoteport=4200です

nodes

通信相手である他のONSデーモンのリストを指定します。ノード値は、ホスト名またはIPアドレスにポートを追加したもののカンマ区切りのリストとして指定します。提供するポート値は、各ONSインスタンスがリスニングしているリモート・ポートです。全ノードで同一のファイルを維持するために、現行のONSノードのhost:portをノード・リストに含めることも可能です。リストの読取り時には、これは無視されます。

たとえば、nodes=myhost.example.com:4200,123.123.123.123:4200です。

ノード行にリスト表示されているノードは、Oracle RACインスタンス内の個別のノードに対応します。ノードをリストに含めることにより、中間層ノードはOracle RACノードと確実に通信できます。最低1つの中間層ノードと、1つのOracle RACインスタンス内のノードを構成しないと、互いが認識されません。それぞれの側で最低1つのノードが互いを認識していると、すべてのノードが認識されます。各Oracle RACノードのONS構成ファイルでは、すべての単一クラスタおよび中間層ノードをリスト表示する必要はありません。特に、1つのONS構成ファイル・クラスタ・ノードが中間層を認識している場合、クラスタ内のすべてのノードが中間層を認識しています。

表9-3 オプションのONS構成パラメータ

パラメータ 説明

logcomp

記録するONSコンポーネントを指定します。書式は次のとおりです。

<component>[<subcomponent>,...];<component>[<subcomponent>,...];...

サブコンポーネントを指定する必要がない場合、コンポーネント名の後にカッコ([])を含まないでください。サブコンポーネントからメッセージを除外するには、サブコンポーネント名の前に感嘆符(!)が必要です。たとえば、topologyサブコンポーネントからメッセージを除外するには、次の書式を使用します。

[all,!topology]

メッセージを除外するサブコンポーネントを指定する前に、サブコンポーネントがメッセージを含むことを最初に確認する必要があります。

次に、コンポーネントの有効な値を示します。

  • internal

  • ons

internalとしてコンポーネントを指定する場合、サブコンポーネントの有効な値はありません。onsとしてコンポーネントを指定する場合、サブコンポーネントの次の値を指定できます。

  • all: すべてのメッセージを指定します

  • ons: ONSローカル情報

  • listener: ONSリスナー情報

  • discover: ONS検出(サーバーまたはマルチキャスト)情報

  • servers: クラスタに接続されていて現在稼働中のONSリモート・サーバー

  • topology: ONSの現在のクラスタ全体のサーバー接続トポロジ

  • server: ONSリモート・サーバー接続情報

  • client: ONSクライアント接続情報

  • connect: ONSの全般的な接続情報

  • subscribe: ONSクライアント・サブスクリプション情報

  • message: ONSの通知の受信および処理情報

  • deliver: ONS通知配信情報

  • special: ONSの特殊な通知処理

  • internal: ONS内部リソース情報

  • secure: ONSのSSL操作情報

  • workers: ONSワーカー・スレッド

次の例は、secureサブコンポーネントを除くonsの下のすべてのサブコンポーネントのメッセージを記録する場合を示します。

logcomp=ons[all,!secure]

logfile

ONSがメッセージの記録に使用するログ・ファイルを指定します。ログ・ファイルのデフォルト値は$ORACLE_HOME/opmn/logs/ons.logです。

たとえば、logfile=/private/oraclehome/opmn/logs/myons.logです。

walletfile

Oracle Secure Sockets Layer(SSL)がSSL証明書の格納に使用するウォレット・ファイルを指定します。ONSでウォレット・ファイルが指定されると、他のONSインスタンスとの通信時にSSLを使用し、接続しようとするすべてのONSインスタンスからSSL証明書の認証を要求します。つまり、1つのONSインスタンスでSSLを有効にする場合、このインスタンスと接続されているすべてのインスタンスでも有効にする必要があります。この値は、ewallet.p12ファイルが存在するディレクトリを指すように設定します。

たとえば、walletfile=/private/oraclehome/opmn/conf/ssl.wlt/defaultです。

useocr

ONSがすべてのOracle RACノードおよびポート番号を、ONS構成ファイルでなくOracle Cluster Registry (OCR)に格納するかどうかを示す、サーバー側での使用のために予約されている値を指定します。useocr=onの場合、すべてのOracle RACノードおよびポート番号がOracle Cluster Registry (OCR)に格納されます。

このオプションは、クライアント側では使用しないでください。

allowgroup

localportに接続するユーザー・グループを示すONS設定を指定します。trueに設定すると、ONSは同じOSグループ内のユーザーにローカル・ポートへの接続を許可します。falseに設定すると、ONSはONSデーモンを実行している同じユーザーにローカル・ポートのアクセスを許可します。このパラメータのデフォルト値はfalseです。リモートONS構成を使用する場合、このパラメータを設定する必要はありません。

ons.configファイルでは、ナンバー記号(#)で始まる行に空白行およびコメントを使用できます。

9.2.6.2 ONSのリモート構成

UCPでは、ONSConfigurationプール・プロパティを使用したONSのリモート構成をサポートします。ONSConfigurationプール・プロパティ値は、ons.configファイルの内容に酷似している文字列です。この文字列は、改行文字(\n)で区切られたname=valueペアのリストからなります。このプール・プロパティは、次の2つの方法で設定できます。

  • 名前は、nodeswalletfilewalletpasswordのいずれかです。パラメータ文字列では、少なくとも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コマンド

コマンド 効果 出力

start

ONSデーモンを起動

onsctl: ons started

stop

ONSデーモンを停止

onsctl: shutting down ons daemon...

ping

ONSデーモンが稼働中であるかどうかを検証

ons is running ...

reconfig

ONSデーモンをシャットダウンせずにONS構成のリロードをトリガー

 

help

onsctlのヘルプ・サマリー・メッセージを出力

 

detailed

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