ヘッダーをスキップ
Oracle Database JDBC開発者ガイドおよびリファレンス
10g リリース2(10.2)
B19275-03
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

27 高速接続フェイルオーバー

高速接続フェイルオーバー・メカニズムは、暗黙的接続キャッシュ機能に依存しています。したがって、高速接続フェイルオーバーを使用するには、暗黙的接続キャッシュを使用可能にする必要があります。

この章には、次の項目があります。

概要

高速接続フェイルオーバーは、Oracle Database 10gの接続フェイルオーバー機能を、Java Database Connectivity(JDBC)アプリケーションがドライバに依存せずに利用できる方法を提供します。高速接続フェイルオーバーの利点は、次のとおりです。

高速接続フェイルオーバーの機能

高速接続フェイルオーバーを使用可能にすると、次の機能が提供されます。

高速接続フェイルオーバーの使用

アプリケーションは、DataSourceインスタンスを通じて高速接続フェイルオーバーを管理します。

この項には、次の項目が含まれます。

高速接続フェイルオーバーの前提条件

高速接続フェイルオーバーを使用するには、次の前提条件を満たしている必要があります。

  • 暗黙的接続キャッシュが使用可能であること

    高速接続フェイルオーバーは、JDBC接続キャッシュ・メカニズムとの組合せで動作します。これにより、アプリケーションは接続を管理して高可用性を確保します。

  • アプリケーションがデータベースへの接続にサービス名を使用していること

    アプリケーションはサービス識別子(SID)を使用できません。

  • 基礎となるデータベースに、Oracle Database 10g Real Application Clusters機能があること

    フェイルオーバー・イベントが伝播しないと、接続フェイルオーバーは発生しません。

  • JDBCが稼働しているノードでOracle Notification Service(ONS)が構成されており、使用可能であること

    JDBCは、データベース・イベントの伝播およびJDBCへのイベントの通知を行うために、ONSに依存しています。

  • JDBCインスタンスが稼働しているJava Virtual Machine(JVM)で、oracle.ons.oraclehomeORACLE_HOMEを指すように設定されていること

高速接続フェイルオーバー用のONSの構成

高速接続フェイルオーバーを使用するには、ONSを正しく構成する必要があります。ONSは、Oracle Database 10gの一部です。

この項には、次の項目が含まれます。

ONS構成ファイル

ONS構成は、ONSの構成ファイルORACLE_HOME/opmn/conf/ons.configによって制御されます。このファイルは、ONSデーモンに、動作方法および通信相手などの詳細を指示します。ons.config内の構成情報は、単純な名前/値ペアで定義されています。ons.configで必ず構成する必要のある値が3つ存在します。1つはlocalportで、これはローカル・クライアントと通信するために、ONSがローカルホスト・インタフェースでバインドするポートです。次に、localport構成の例を示します。

localport=4100

2つ目の値はremoteportで、これは他のONSデーモンと通信するために、ONSがすべてのインタフェースでバインドするポートです。次に、remoteport構成の例を示します。

remoteport=4200

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

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

次に、ノードの構成の例を示します。

nodes=myhost.example.com:4200,123.123.123.123:4200

ons.configで提供できるオプションの値がいくつか存在します。最初のオプション値はloglevelです。これは、ONSがログに記録するメッセージ・レベルを指定します。この値は、1(ログに記録されるメッセージ量は最小)から9(ログに記録されるメッセージ量は最大)までの整数値です。デフォルト値は3です。次に例を示します。

loglevel=3

2つ目のオプション値はlogfile名です。これは、ONSがメッセージのロギングに使用するログ・ファイルを指定します。logfileのデフォルト値は$ORACLE_HOME/opmn/logs/ons.logです。次に例を示します。

logfile=/private/oraclehome/opmn/logs/myons.log

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

walletfile=/private/oraclehome/opmn/conf/ssl.wlt/default

サーバー側が使用するために予約されているオプション値があります。useocr=onは、ONSに、すべてのRACノードおよびポート番号を、ONS構成ファイルではなくOracle Cluster Registry(OCR)に格納するよう指示します。このオプションは、クライアント側では使用しないでください。

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

クライアント側のONS構成

クライアント側のONSには、ORACLE_HOME/opmnを介してアクセスできます。クライアント側でONSをセットアップするには、次の2つの方法があります。

例27-1に、構成ファイルの例を示します。

例27-1 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

ONSを構成した後、onsctlコマンドでONSデーモンを起動します。ONSデーモンが常に稼働中であるかどうかは、ユーザーが確認する必要があります。

onsctlコマンドの使用

構成後、ORACLE_HOME/opmn/bin/onsctlを使用してONSデーモンの起動、停止、再構成および監視を行います。表27-1に、onsctlでサポートされているコマンドのサマリーを示します。

表27-1 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の詳細ヘルプ・メッセージを出力



racgonsを使用したサーバー側のONS構成

サーバー側のONSには、ORA_CRS_HOME/opmnを介してアクセスできます。サーバー側を構成するには、racgonsを使用して中間層ノードの情報をOCRに追加します。このコマンドは、ORA_CRS_HOME/bin/racgonsにあります。racgonsを使用する前に、ons.configを編集してuseocr=onを設定する必要があります。

すべてのノードが構成を共有し、どのRACノードが稼働中であっても中間層と通信できるように、OCRで中間層ノードを構成する必要があります。クラスタで実行する場合、ONSホストおよびポートは、ONS構成ファイルではなくracgonsを使用して構成してください。racgonsコマンドにより、すべてのノードが認識できるよう、ONSホストおよびポートはOCRに格納されます。これにより、構成を変更する場合、各ノードのファイルを編集するかわりに、クラスタ・ノードの1つで1つのコマンドを実行するだけですみます。

racognsコマンドを使用すると、ホストおよびポートを1つのノードで指定し、変更をクラスタ内の全ノードに伝播できます。コマンドには、2つの形式があります。

racgons add_config hostname:port [hostname:port] [hostname:port] ...
racgons remove_config hostname[:port] [hostname:port] [hostname:port] ...

add_configバージョンはリストに含まれるホスト名を追加し、remove_configバージョンはこれらを削除します。いずれのコマンドも、変更をクラスタ内の全インスタンスに伝播します。

ホストに対して複数のポート番号が構成されている場合、指定されたポート番号がhostnameから削除されます。hostnameのみ指定した場合、そのホストのすべてのポート番号が削除されます。


関連項目:

『Oracle Database Oracle ClusterwareおよびOracle Real Application Clusters管理者および開発者ガイド』

racgonsの他の使用方法

新しいノードをクラスタに追加した場合、必ずracgonsを実行してください。

リモートONSサブスクリプション

リモートONSサブスクリプションの利点は次のとおりです。

  • すべてのJava中間層スタックに対するサポート

  • クライアント・コンピュータではONSデーモンが必要ないので、このプロセスの管理が不要

  • DataSourceプロパティを使用した簡単な構成

高速接続フェイルオーバーに対してリモートONSサブスクリプションを使用すると、アプリケーションはOracleDataSourceインスタンスの次のメソッドをコールします。

setONSConfiguration(String remoteONSConfig)

remoteONSConfigパラメータは、name=valueの形式の名前/値ペアを改行文字(¥n)で区切ってリストにしたものとなります。nameは、nodeswalletfileまたはwalletpasswordのいずれかに指定できます。このパラメータでは、少なくとも、nodesONS構成属性を指定する必要があります。それには、host:portペアをカンマ(,)で区切ってリストします。ホストとポートはRACノードで利用可能なリモートONSデーモンを示します。


関連項目:

ONS構成ファイル

Oracle Walletファイルとしてwalletfile属性が指定されると、ONSデーモンとの通信にSSLが使用される可能性があります。そのような場合、walletpassword属性が指定されなければ、シングル・サインオン(SSO)とみなされます。

次にいくつかの例を示します。odsOracleDataSourceインスタンスであるとします。

ods.setONSConfiguration("nodes=racnode1.example.com:4200,racnode2.example.com:4200");

ods.setONSConfiguration("nodes=racnode1:4200,racnode2:4200\nwalletfile=/mydir/Wallet\nwalletpassword=mypasswd");

ods.setONSConfiguration("nodes=racnode1:4200,racnode2:4200\nwalletfile=/mydir/conf/Wallet");


注意:

ons.jarは、クライアントのCLASSPATHに存在する必要があります。Oracle Application Serverの場合、これまでどおりONSはOPMNに埋め込まれ、JDBC高速接続フェイルオーバーがこれまでと同様に引き続き動作します。

高速接続フェイルオーバーを使用可能にする

アプリケーションは、DataSourceインスタンスから接続を取り出す前に、そのインスタンスに対してsetFastConnectionFailoverEnabled(true)をコールすることにより、高速接続フェイルオーバーを使用可能にします。

接続キャッシュを再初期化するときには高速接続フェイルオーバーを使用可能にできません。OracleDataSourceインスタンスを使用する前に使用可能にする必要があります。

例27-2に、高速接続フェイルオーバーを使用可能にする方法を示します。


注意:

キャッシュで高速接続フェイルオーバーを使用可能にすると、そのキャッシュの存続期間中は高速接続フェイルオーバーを使用不可にできません。

高速接続フェイルオーバーを使用可能にするには、次の操作が必要です。

  • ONSを構成し起動します。ONSが正しくセットアップされていない場合、暗黙的接続キャッシュの作成は失敗し、最初のgetConnection要求でONSExceptionが発生します。

  • OracleDataSourceに対して最初のgetConnection要求を送信する前に、FastConnectionFailoverEnabledプロパティを設定します。高速接続フェイルオーバーが使用可能になっている場合、フェイルオーバーは接続キャッシュ内のすべての接続に適用されます。アプリケーションがConnection Cache Managerを使用して明示的に接続キャッシュを作成する場合、接続を取り出す前にFastConnectionFailoverEnabledを設定する必要があります。

  • OracleDataSource urlプロパティを設定する際、SIDではなくサービス名を使用してください。

例27-2 高速接続フェイルオーバーを使用可能にする

// declare datasource
ods.setUrl(
"jdbc:oracle:oci:@(DESCRIPTION=
  (ADDRESS=(PROTOCOL=TCP)(HOST=cluster_alias)
    (PORT=1521))
    (CONNECT_DATA=(SERVICE_NAME=service_name)))");
ods.setUser("scott");
ods.setConnectionCachingEnabled(true);
ods.setFastConnectionFailoverEnabled(true):
ctx.bind("myDS",ods);
ds=(OracleDataSource) ctx.lookup("MyDS");
try {
 ds.getConnection();  // transparently creates and accesses cache
 catch (SQLException SE {
  }
}
...

高速接続フェイルオーバーのステータスの問合せ

アプリケーションは、高速接続フェイルオーバーが使用可能になっているかどうかを判断するために、OracleDataSource.getFastConnectionFailoverEnabledをコールします。フェイルオーバーが使用可能な場合はtrueが、それ以外の場合はfalseが戻されます。

高速接続フェイルオーバーについて

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

この項には、次の項目が含まれます。

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

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

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

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

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


注意:

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

実行される処理

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

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

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

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

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

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

  4. 各接続はSQL例外を受信し、再試行します。

高速接続フェイルオーバーとTAFの比較

高速接続フェイルオーバーと 透過的アプリケーション・フェイルオーバー(TAF)は、次の点で異なります。


注意:

TAFと高速接続フェイルオーバーを同じアプリケーション内で使用することはお薦めしません。