B Oracle RAC高速アプリケーション通知
Oracle Database 12cリリース1 (12.1)以降、ユニバーサル接続プールまたはアクティブ・グリッド・リンク(AGL)を備えたOracle WebLogic Serverを使用しない場合にも、Oracle RAC高速アプリケーション通知(FAN) APIを使用すると、Oracle Databaseの高可用性(HA)機能を利用できます。
ここで説明する項目は、次のとおりです。
この機能はOracle Notification System(ONS)メッセージ・トランスポート・メカニズムに依存しています。ONSを使用するには、システム、サーバーおよびクライアントで構成が必要です。
Oracle RAC高速アプリケーション通知を使用するには、simplefan.jar
ファイルがCLASSPATH
に存在するか、ons.jar
ファイルがCLASSPATH
に存在するか、Oracle Notification Services (ONS)クライアントがクライアント・システムにインストールされ、稼働している必要があります。
B.1 Oracle RAC高速アプリケーション通知の概要
Oracle RAC高速アプリケーション通知(FAN)機能は、コールバック・メカニズムによるFANイベントへのアクセス用に簡略化されたAPIを提供します。このメカニズムを使用すると、サードパーティのドライバ、接続プールおよびコンテナでFANイベントをサブスクライブ、受信および処理できるようになります。これらのAPIを、この付録ではOracle RAC FAN APIと呼んでいます。
Oracle RAC FAN APIは、Oracle Database HA機能をフルに活用して、反応のよいアプリケーションを開発するために役立つFANイベント通知です。ユニバーサル接続プールを使用するのでなく、独自の接続プールを実装してFANイベントと連携するには、Oracle RAC高速アプリケーション通知を使用することをお薦めします。
ノート:
-
独自の接続プールを実装しない場合は、Oracleユニバーサル接続プールを使用し、Oracle RAC高速アプリケーション通知の利点を他の多くの利点とあわせてすべて活用することをお薦めします。
-
Oracle Database 12cリリース1 (12.1)以降、暗黙的接続キャッシュ(ICC)はサポート対象外になりました。かわりに、ユニバーサル接続プールの使用をお薦めします。
アプリケーションは、次の方法によりFANイベントに応答できるようになります。
-
Oracle RACサービスの停止イベントおよびノードの停止イベントのリスニング
-
Oracle RACまたはグローバル・データ・サービス(GDS)の起動または再起動を表すOracle RACサービスの起動イベントのリスニング。これらの起動イベントで、FANパラメータ・ステータスは
UP
で、event_type
は、database
、instance
、service
またはservicemember
のいずれかです。 -
Oracle Databaseリリース12c以前のFAN ONSイベント構文およびフィールドのサポート。たとえば、各イベントに追加された
event_type
フィールドおよびtimezone
フィールド、ノードまたはパブリックネットワーク・イベント以外のすべてのイベントに追加されたdb_domain
フィールド、実行時ロード・バランシング(RLB)イベントに追加されたpercentf
フィールドなどです。 -
ロード・バランシング・アドバイザ・イベントのリスニングと、それに対する応答
この機能により、FANイベントが公開されます。これはOracle RACを実行しているクラスタによって送信される通知で、サブスクライバにサービス・レベルまたはノード・レベルで発生しているイベントを通知します。サポートされているFANイベントは、次のとおりです。
-
サービス起動
このサービスは、新しいインスタンスが使用可能になったため、次のインスタンスでセッションを作成できることを接続プールに通知します。
ServiceUpEvent
クライアントAPIは、現在のリリースのOracle RAC FAN API、つまりsimplefan.jar
ファイルでサポートされています。 -
サービス停止
サービス停止イベントは、管理されているリソースが停止していてアクセスで使用できないことを通知します。サービス停止イベントには、次の2種類があります。
-
サービスの特定のインスタンスが停止していることを通知するイベント。このインスタンスは作業を受け入れることができません。
-
1つを除いたすべてのサービス・インスタンスが停止していることを通知するイベント。このサービスは作業を受け入れることができません。
-
-
ノード停止
ノード停止イベントは、ホスト識別子で識別されるOracle RACノードが停止していて使用不可であることを通知します。クラスタは、ノードで作業を受け入れられなくなると、ノード停止イベントを送信します。
-
計画済停止
計画済停止には、ノード停止イベント以外のすべての停止イベントが含まれます。これらのイベントには、2つのフィールド(
status=down
およびreason=user
)が設定されています。 -
ロード・バランシング・アドバイザ
ロード・バランシング・アドバイザ・イベントはロード・バランシング・アルゴリズムのためのメトリックを提供します。ロード・バランシング・アドバイザは、使用可能なノード間で推奨される作業分散についてサブスクライバに知らせるために定期的に送信されます。
ノート:
独自の接続プールを実装する場合にかぎり、Oracle RAC高速アプリケーション通知を使用することをお薦めします。それ以外の場合は、Oracleユニバーサル接続プールを使用して、Oracle RAC高速アプリケーション通知の利点を、他の多くの利点ともに、すべて活用することをお薦めします。
B.2 Oracle RAC高速アプリケーション通知のインストールおよび構成
Oracle RAC FAN APIをインストールするには、次のステップを実行します。
-
次のリンクから
simplefan.jar
ファイルをダウンロードします。http://www.oracle.com/technetwork/database/application-development/jdbc/jdbc-ucp-122-3110062.html
-
simplefan.jar
ファイルをクラスパスに追加します。 -
Javaコードで次の操作を実行します。
-
getInstance
メソッドを使用して、FanManager
クラスのインスタンスを取得します。 -
FanManager
クラスのconfigure
メソッドを使用して、イベント・デーモンを構成します。configure
メソッドでは、次のプロパティを設定します。onsNodes
: このJava VMのONSランタイムが通信するONSデーモンのhost:port
ペアのカンマ区切りリスト。host:port
ペアのhost
は、ONSデーモンを実行しているシステムのホスト名です。port
は、そのデーモンのローカルのポート構成パラメータです。onsWalletFile
: ONSウォレット・ファイルのパス名。ウォレット・ファイルは、SSL証明書の格納にSSLが使用するローカルのウォレット・ファイルのパスです。ONSデーモンのウォレット・ファイル構成パラメータと同様です。onsWalletPassword
: ONSウォレット・ファイルにアクセスするためのパスワード。
-
関連項目:
-
Oracle RAC FAN APIの詳細は、『Oracle Database RAC FAN Events Java API Reference』を参照してください。
B.3 Oracle RAC高速アプリケーション通知の使用
次のコードでは、FAN停止イベントの処理方法について説明します。このコード例では、イベント・データを標準出力デバイスに出力します。
このコード例は、handleFanEvent
メソッドをオーバーロードして異なるFANイベント通知を引数として受け入れることによってOracle RAC FAN APIを使用する方法を示しています。また、次のイベント・データも示しています。:
-
FANイベント通知を送信するシステムの名前
-
FANイベント通知のタイムスタンプ
-
FANイベント通知のロード・ステータス
例B-1 FAN停止イベントにOracle RAC FAN APIを使用するサンプル・コードの例
... ...Properties props = new Properties(); props.putProperty(“serviceName", “gl"); FanSubscription sub = FanManager.getInstance().subscribe(props); sub.addListener(new FanEventListener()) { public void handleFanEvent(ServiceDownEvent se) { try { System.out.println(event.getTimestamp()); System.out.println(event.getServiceName()); System.out.println(event.getDatabaseUniqueName()); System.out.println(event.getReason()); ServiceMemberEvent me = se.getServiceMemberEvent(); if (me != null) { System.out.println(me.getInstanceName()); System.out.println(me.getNodeName()); System.out.println(me.getServiceMemberStatus()); } ServiceCompositeEvent ce = se.getServiceCompositeEvent(); if (ce != null) { System.out.println(ce.getServiceCompositeStatus()); } } catch (Throwable t) { // handle all exceptions and errors t.printStackTrace(System.err); } } public void handleFanEvent(NodeDownEvent ne) { try { System.out.println(event.getTimestamp()); System.out.println(ne.getNodeName()); System.out.println(ne.getIncarnation()); } catch (Throwable t) { // handle all exceptions and errors t.printStackTrace(System.err); } } public void handleFanEvent(LoadAdvisoryEvent le) { try { System.out.println(event.getTimestamp()); System.out.println(le.getServiceName()); System.out.println(le.getDatabaseUniqueName()); System.out.println(le.getInstanceName()); System.out.println(le.getPercent()); System.out.println(le.getServiceQuality()); System.out.println(le.getLoadStatus()); } catch (Throwable t) { // handle all exceptions and errors t.printStackTrace(System.err); } } });
例B-2 FAN起動イベントにOracle RAC FAN APIを使用するサンプル・コードの例
次のコードでは、サービス起動イベントにOracle RAC高速アプリケーション通知を使用する方法について説明します。このコードでは、Oracle Database 12cリリース2 (12.2.0.1)で導入された新しいOracle RAC FAN API (FanEventListener
インタフェースを拡張したFanUpEventListener
、ServiceUpEvent
)を使用しています。FanEventListener
インタフェースを実装したように、クライアント・アプリケーションでFanUpEventListener
インタフェースを実装する必要があります。
import oracle.simplefan.*;
...
FanEventListener fanListener = new FanUpEventListener() {
public void handleEvent(ServiceUpEvent event) { ...... }
// Specify the next action here, when the node comes up
public void handleEvent(NodeUpEvent event) { ...... }
......
}
FanManager fanMngr = FanManager.getInstance();
Properties onsProps = new Properties();
onsProps.setProperty("onsNodes", ......);
fanMngr.configure(onsProps);
Properties subscriptionProps = new Properties();
subscriptionProps.setProperty("serviceName", ......);
fanSubscription = fanMngr.subscribe(subscriptionProps);
fanSubscription.addListener(fanListener);
...