高速接続フェイルオーバー・メカニズムは、暗黙的接続キャッシュ機能に依存しています。したがって、高速接続フェイルオーバーを使用するには、暗黙的接続キャッシュを使用可能にする必要があります。
この章には、次の項目があります。
高速接続フェイルオーバーは、Oracle Database 11gの接続フェイルオーバー機能を、Java Database Connectivity(JDBC)アプリケーションがドライバに依存せずに利用できる方法を提供します。高速接続フェイルオーバーの利点は、次のとおりです。
ドライバからの独立性
高速接続フェイルオーバーは、JDBC ThinドライバおよびJDBC Oracle Call Interface(OCI)ドライバの両方をサポートしています。
暗黙的接続キャッシュとの統合
これら2つの機能は、ともに機能して相乗効果を発揮し、アプリケーションのパフォーマンスおよび高可用性を向上します。
Oracle Real Application Clusters(Oracle RAC)との統合
これにより、優れたReal Application Clusters/高可用性イベント通知メカニズムが提供されます。
アプリケーション・コードとの容易な統合
高速接続フェイルオーバーを使用可能にするのみで、他の構成は必要ありません。
高速接続フェイルオーバーの機能
高速接続フェイルオーバーを使用可能にすると、次の機能が提供されます。
キャッシュ内の無効な接続のすばやい検出およびクリーン・アップ(DOWNイベント処理)
使用可能な接続のロード・バランシング(UPイベント処理)
すべてのアクティブなOracle RACインスタンスへの実行時作業要求の分散
アプリケーションは、DataSourceインスタンスを通じて高速接続フェイルオーバーを管理します。
この項には、次の項目が含まれます。
高速接続フェイルオーバーを使用するには、次の前提条件を満たしている必要があります。
暗黙的接続キャッシュが使用可能であること
高速接続フェイルオーバーは、JDBC接続キャッシュ・メカニズムとの組合せで動作します。これにより、アプリケーションは接続を管理して高可用性を確保します。
アプリケーションがデータベースへの接続にサービス名を使用していること
アプリケーションはサービス識別子を使用できません。
基礎となるデータベースに、Oracle Database 11g Real Application Clusters機能があること
フェイルオーバー・イベントが伝播しないと、接続フェイルオーバーは発生しません。
JDBCが稼働しているノードでOracle Notification Service(ONS)が構成されており、使用可能であること
JDBCは、データベース・イベントの伝播およびJDBCへのイベントの通知を行うために、ONSに依存しています。
JDBCインスタンスが稼働しているJava Virtual Machine(JVM)で、oracle.ons.oraclehomeがORACLE_HOMEを指すように設定されていること
高速接続フェイルオーバーを使用するには、ONSを正しく構成する必要があります。ONSは、Oracle Database 11gの一部です。
この項には、次の項目が含まれます。
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つのノードが互いを認識していると、すべてのノードが認識されます。各Oracle 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に、すべてのOracle RACノードおよびポート番号を、ONS構成ファイルではなくOracle Cluster Registry(OCR)に格納するよう指示します。このオプションは、クライアント側では使用しないでください。
クライアント側のONSには、ORACLE_HOME/opmnを介してアクセスできます。クライアント側でONSをセットアップするには、次の2つの方法があります。
リモートONS構成
クライアント側のONSデーモン
例26-1に、構成ファイルの例を示します。
例26-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デーモンの起動、停止、再構成および監視を行います。表26-1に、onsctlでサポートされているコマンドのサマリーを示します。
サーバー側のONSには、ORA_CRS_HOME/opmnを介してアクセスできます。サーバー側を構成するには、racgonsを使用して中間層ノードの情報をOCRに追加します。このコマンドは、ORA_CRS_HOME/bin/racgonsにあります。racgonsを使用する前に、ons.configを編集してuseocr=onを設定する必要があります。
すべてのノードが構成を共有し、どのOracle 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 Real Application Clusters管理およびデプロイメント・ガイド』 |
racgonsの他の使用方法
新しいノードをクラスタに追加した場合、必ずracgonsを実行してください。
リモートONSサブスクリプションの利点は次のとおりです。
すべてのJava中間層スタックに対するサポート
クライアント・コンピュータではONSデーモンが必要ないので、このプロセスの管理が不要
DataSourceプロパティを使用した簡単な構成
高速接続フェイルオーバーに対してリモートONSサブスクリプションを使用すると、アプリケーションはOracleDataSourceインスタンスの次のメソッドをコールします。
setONSConfiguration(String remoteONSConfig)
remoteONSConfigパラメータは、name=valueの形式の名前と値のペアを改行文字(\n)で区切ってリストにしたものとなります。nameは、nodes、walletfileまたはwalletpasswordのいずれかに指定できます。このパラメータでは、少なくとも、nodesONS構成属性を指定する必要があります。これは、host:portペアをカンマ(,)で区切ったリストです。ホストとポートはOracle RACノードで利用可能なリモートONSデーモンを示します。
Oracle Walletファイルとしてwalletfile属性が指定されると、ONSデーモンとの通信にSSLが使用される可能性があります。そのような場合、walletpassword属性が指定されなければ、シングル・サインオン(SSO)とみなされます。
次にいくつかの例を示します。odsはOracleDataSourceインスタンスであるとします。
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はOracle Process Manager and Notification Server(OPMN)に埋め込まれ、JDBC高速接続フェイルオーバーがこれまでと同様に引き続き動作します。 |
アプリケーションは、DataSourceインスタンスから接続を取り出す前に、そのインスタンスに対してsetFastConnectionFailoverEnabled(true)をコールすることにより、高速接続フェイルオーバーを使用可能にします。
接続キャッシュを再初期化するときには高速接続フェイルオーバーを使用可能にできません。OracleDataSourceインスタンスを使用する前に使用可能にする必要があります。
例26-2に、高速接続フェイルオーバーを使用可能にする方法を示します。
|
注意: キャッシュで高速接続フェイルオーバーを使用可能にすると、そのキャッシュの存続期間中は高速接続フェイルオーバーを使用不可にできません。 |
高速接続フェイルオーバーを使用可能にするには、次の操作が必要です。
ONSを構成し起動します。ONSが正しくセットアップされていない場合、暗黙的接続キャッシュの作成は失敗し、最初のgetConnection要求でONSExceptionが発生します。
OracleDataSourceに対して最初のgetConnection要求を送信する前に、FastConnectionFailoverEnabledプロパティを設定します。高速接続フェイルオーバーが使用可能になっている場合、フェイルオーバーは接続キャッシュ内のすべての接続に適用されます。アプリケーションがConnection Cache Managerを使用して明示的に接続キャッシュを作成する場合、接続を取り出す前にFastConnectionFailoverEnabledを設定する必要があります。
OracleDataSource urlプロパティを設定する際、サービス識別子ではなくサービス名を使用してください。
例26-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が戻されます。
高速接続フェイルオーバーを使用可能に設定すると、メカニズムは自動なので、アプリケーションによる操作は必要ありません。この項では、接続フェイルオーバーがアプリケーションに提示される仕組みと、アプリケーションによるリカバリの手順を説明します。
この項には、次の項目が含まれます。
Oracle RACサービスの障害がJDBCアプリケーションに伝播されるときまでに、データベースはすでにローカル・トランザクションをロールバックしています。次に、キャッシュ・マネージャがすべての無効な接続をクリーン・アップします。無効な接続を持つアプリケーションがその接続を通じて通信しようとすると、「SQLException, ORA-17008: クローズされた接続です。」を受信することがあります。
アプリケーションが「クローズされた接続です。」エラー・メッセージを受信した場合、次のことを実行する必要があります。
接続要求を再試行します。古い接続はオープンでないため、これは必須です。
トランザクションを再実行します。接続がクローズする前に実行された作業はすべて失われています。
|
注意: アプリケーションによってトランザクションをロールバックしないでください。アプリケーションが例外を受信した時点で、トランザクションはすでにデータベースでロールバックされています。 |
高速接続フェイルオーバーでは、キャッシュ内の各接続はサービス、インスタンス、データベースおよびホスト名へのマッピングを維持します。
データベースがOracle RACイベントを生成すると、そのイベントはJDBCが稼働中であるJVMに転送されます。JVM内のデーモン・スレッドがOracle RACイベントを受信し、それをConnection Cache Managerに転送します。次に、Connection Cache ManagerはOracle RACイベントの影響を受けるアプリケーションに対してSQL例外を発行します。
一般的なフェイルオーバーの例を次に示します。
データベース・インスタンスで障害が発生し、キャッシュ内にいくつかの失効した接続が残ります。
データベース内のOracle RACメカニズムがRACイベントを生成し、そのイベントはJDBCが含まれているJVMに送信されます。
JVM内のデーモン・スレッドはOracle RACイベントの影響を受けるすべての接続を検出し、SQL例外によって接続がクローズされたことを通知し、オープンなトランザクションがあればすべてロールバックします。
各接続はSQL例外を受信し、再試行します。
高速接続フェイルオーバーと 透過的アプリケーション・フェイルオーバー(TAF)は、次の点で異なります。
アプリケーションレベルでの接続の再試行
高速接続フェイルオーバーは、アプリケーションレベルでの接続の再試行をサポートしています。これにより、アプリケーションは接続のフェイルオーバーへの対応を制御できます。アプリケーションは接続を再試行するか、または例外を再発生させるかを選択できます。TAFでは、接続の再試行はOCI/Netレイヤーでのみサポートしています。
暗黙的接続キャッシュとの統合
高速接続フェイルオーバーは暗黙的接続キャッシュと高度に統合されているため、Connection Cache Managerはキャッシュを管理して高可用性を維持できます。たとえば、障害が発生した接続は、キャッシュ内で自動的に無効化されます。TAFは、接続単位でネットワーク・レベルで動作するため、接続キャッシュに障害の発生を通知できません。
イベントベース
高速接続フェイルオーバーは、Oracle RACイベント・メカニズムに基づいています。したがって、高速接続フェイルオーバーは効率的で、アクティブおよび非アクティブな接続の両方で障害をすばやく検出できます。
ロード・バランシングのサポート
高速接続フェイルオーバーは、接続のUPイベント・ロード・バランシング、およびアクティブなOracle RACインスタンス間での実行時作業要求分散をサポートしています。