継続的な可用性のためのコード

アプリケーションが計画メンテナンスや計画外停止、データベースの負荷の不均衡を認識しなければ、そのアプリケーションの継続的な可用性が実現します。アプリケーションのベスト・プラクティス、シンプルな構成およびOracle Autonomous Databaseを組み合せることで、アプリケーションの継続的な可用性が実現します。

計画メンテナンスのアクティビティをアプリケーションに認識させない最適な方法は、各データベース・ワークロードの場所から、そのワークロードの場所のメンテナンス・ウィンドウに先立って作業を透過的にドレインすることです。WebLogic Server、Oracle Universal Connection Pool (UCP)、OCIセッション・プール、ODP.NET管理対象外プロバイダを含む、Oracleの接続プールおよび中間層は、高速アプリケーション通知(FAN)に対応しているため、メンテナンスの前に作業が正常にドレインされるようデータベース・サービスの移動がスケジューリングされる前に通知を受けます。FANの通知によって、自動的にアイドル状態の接続がクローズされ、新しい接続が新しいサービスの場所でオープンされます。さらに、間もなくシャットダウンされるサービスの場所で、アクティブな作業を完了できる構成可能な時間が確保されます。IBM WebSphereなどの大手サードパーティのJDBC中間層は、UCPを使用して構成した場合、同様の動作を実現できます。UCPを使用できないJDBCベース・アプリケーションに対しては、Oracleドライバを使用したソリューションと接続テストが用意されています。

コンポーネントや通信の障害によって引き起こされる計画外停止を認識させないようにするために、Oracleは次のものを提供しています:

  • 通知。FANは、停止を認識させないようにするための最初のステップです。FANにより、停止が発生した際には、クライアントは通知を受けて、現在のネットワーク待機から抜け出すことができます。このため、アプリケーションが長時間ネットワークの待機で停止することがなくなります。また、サービスが再び使用可能になったときにFANによってセッションのリバランスが開始されることも重要です。

  • リカバリ。クライアントが通知を受けると、透過的アプリケーション・コンティニュイティ(TAC)またはアプリケーション・コンティニュイティ(AC)は、新たなワークロードの場所(データベースを実行しているReal Application Clusters (RAC)構成の別のデータベース・インスタンス)への接続を再確立し、可能な場合は処理中の(コミットされていない)作業を再実行します。新たな場所で処理中の作業を再実行することで、アプリケーションは通常、障害の発生を認識することなく実行を継続できます。

また、割り当てられたドレイン期間中にドレインされない(現在のデータベース操作を完了する)セッションに対しても、TACまたはACが計画メンテナンス中に実行されます。

アプリケーション構成チェックリスト

次のガイドラインに従って、アプリケーションを継続的に使用できるようにします:

ヒント:

Autonomous Databaseを使用してアプリケーションの継続的な可用性を実装する際のベスト・プラクティスについては、ATP-Directでのアプリケーションの継続的な可用性に関するホワイト・ペーパーを参照してください。

データベース・サービスを使用した接続

データベース・サービスは、基礎となるインフラストラクチャの透過性を提供します: FAN、接続データ、透過的アプリケーション・コンティニュイティ(TAC)、アプリケーション・コンティニュイティ(AC)、スイッチオーバー、コンシューマ・グループ、およびその他の多くの機能および操作は、サービスの使用を前提としています。

Autonomous Database on Dedicated Exadata Infrastructureには、Autonomous Databasesの事前定義済データベース・サービス名の説明に従って、選択する事前定義済データベース・サービスのペアがいくつか用意されています。どれを選択してもFANおよびドレインが提供され、2つのトランザクション処理ペアではデフォルトでTACが有効になります。すべての事前定義済サービスに対するTACまたはAC設定を変更するために、APIが使用可能です(フェイルオーバーのためのサービス属性の有効化を参照)。

高可用性のための接続文字列の構成

Oracle Autonomous Databaseに接続する際には、次に示すように接続文字列を構成することをお薦めします。Oracle提供のtnsnames.oraファイルに埋め込まれた接続文字列は、この形式で構成されています。クライアントで簡易接続ネーミングを使用しないでください。このような接続には高可用性機能がありません。

このTNSは、バージョン12.2以上のすべてのOracleクライアントで使用してください。

alias = 
(DESCRIPTION =
(CONNECT_TIMEOUT= 120)(RETRY_COUNT=20)(RETRY_DELAY=3)(TRANSPORT_CONNECT_TIMEOUT=3)
 (ADDRESS_LIST =
   (LOAD_BALANCE=on)
   (ADDRESS = (PROTOCOL = TCP)(HOST=scan-host)(PORT=1521)))
 (CONNECT_DATA=(SERVICE_NAME = service-name)))

バージョン12.1以前のOracleドライバを使用するJDBC接続には、次を使用してください

alias =
(DESCRIPTION =
(CONNECT_TIMEOUT= 15)(RETRY_COUNT=20)(RETRY_DELAY=3)
(ADDRESS_LIST =
  (LOAD_BALANCE=on)
  (ADDRESS = (PROTOCOL = TCP)(HOST=scan-host)(PORT=1521)))
(CONNECT_DATA=(SERVICE_NAME = service-name)))

高速アプリケーション通知(FAN)の使用

FANは、サービスが停止または再開されたときに、アプリケーションに即時通知を送信します。FANを使用しないと、ハードウェア障害やネットワーク障害が発生した後にアプリケーションがTCP/IPタイムアウトでハングし、リソースが再開されたときにリバランスが行われない可能性があります。すべてのOracleプールおよびすべてのOracleアプリケーション・サーバーはFANを使用します。サードパーティのJAVAアプリケーション・サーバーは、UCPを使用してFANを有効にできます。

FANを使用するためにアプリケーションを変更する必要はありません。これらは構成の変更のみです。

計画メンテナンス中にサービスを継続させるには、FANを次のいずれかと併用します:

  • Oracleプール
  • UCPとサードパーティJDBCアプリケーション・サーバー
  • 最新のOracleクライアント・ドライバ

計画外停止中にサービスを継続させるには、FANを次のいずれかと併用します:

  • 透過的アプリケーション・コンティニュイティ
  • アプリケーション・コンティニュイティ

FANの対象範囲

FANのイベントは次のものと統合されます:

  • Oracle Fusion MiddlewareおよびOracle WebLogic Server
  • Oracle Data Guard Broker
  • JDBC ThinインタフェースおよびOracle Call Interface (OCI)インタフェース向けOracle JDBC Universal Connection PoolまたはOracle JDBCドライバ
  • 管理対象外プロバイダおよび管理対象プロバイダ向けODP.NET接続プール
  • Oracle Tuxedo
  • SQL*Plus
  • Python、Node.js、PHPなどの言語に対応したOracle Databaseドライバ
  • グローバル・データ・サービス
  • Oracle JDBC Universal Connection Poolを使用するサード・パーティのJDBCアプリケーション・サーバー
  • リスナー

クライアントでFANを有効にするには

高可用性のための接続文字列の構成に示されているTNS別名を使用します。Oracle Database 12c以降のクライアント・ドライバを使用している場合は、FANイベントを受信するためのOracle Notification Service (ONS)サブスクリプションが、この接続文字列によりクライアントで自動構成されます。ONSによってデータベース層とクライアント層の間にセキュアな通信パスが提供され、サービスの可用性(コンポーネントの停止または起動)やランタイム・ロード・バランシングに関するアドバイスをクライアントに通知できるようになるため、通常運用時に作業の配置が改善されます。

クライアントに応じて、次のようにアプリケーション構成プロパティでFANを有効にします:

  • ユニバーサル接続プールまたはJDBC Thinドライバ(12.2以降)

    プロパティFastConnectionFailoverEnabledを設定します。

  • WebLogic Active GridLink for Oracle

    RAC FANおよび高速接続フェイルオーバーは、デフォルトで有効になっています。

  • Oracle WebLogic Server、IBM WebSphere、IBM Liberty、Apache Tomcat、Red Hat WildFly (JBoss)、JDBCアプリケーション

    ユニバーサル接続プールを接続プールのかわりに使用します。

  • ODP.Netクライアント(管理対象プロバイダおよび管理対象外プロバイダ)

    ODP.Net 12.1以前を使用する場合は、接続文字列に"HA events = true;pooling=true"を設定します。

  • Oracle Call Interface (OCI)クライアントおよびOCIベースのドライバ

    ネイティブ設定のないOracle Call Interface (OCI)クライアントでは、oraacces.xmlファイルを使用し、eventstrueに設定できます。

    Python、Node.jsおよびPHPにはネイティブ・オプションがあります。PythonおよびNode.jsでは、接続プールの作成時にイベント・モードを設定できます。PHPでは、php.iniを編集してエントリoci8.events=onを追加します。

  • SQL*Plus

    FANはデフォルトで有効になっています。

事前定義済のデータベース・サービスによって、TLSウォレットベースの認証を使用するTCPS接続が提供されます。アプリケーションのタイプ(JDBCまたはOracle Call Interface)に応じて、特定のルールに準拠したウォレット構成にする必要があります(オプションのウォレットを含めたFANのクライアントの構成を参照)。

推奨プラクティスを使用したドレインの許可

アプリケーションを使用する際のベスト・プラクティスは、必要なときに接続をチェックアウトし、現在のアクションが完了したらプールに再チェックインすることです。これは、実行時に作業をリバランスする場合や、作業をドレインするメンテナンス・ウィンドウ中に、優れたパフォーマンスを達成するために重要です。

計画メンテナンスが認識されないようにするためには、FANに対応したOracle接続プールを使用することをお薦めします。アプリケーションでOracleプールとFANが使用され、リクエストとリクエストの間にプールに接続が戻される場合、ユーザーに影響はありません。FANを使用するためにアプリケーションに変更を加える必要はありません。Oracle接続プールが計画ダウンタイムにFANイベントを受信すると、ドレインされるインスタンスですべての接続がマークされます。チェックインされた接続は、再使用されないように即座にクローズされます。使用中の接続は、プールに戻されるとクローズされます。これにより、時間の経過とともにすべての接続が正常にクローズされます。

サードパーティのJavaベース・アプリケーション・サーバーを使用している場合、ドレインとフェイルオーバーを達成する最も効果的な方法は、プールされたデータ・ソースのかわりにUCPを使用することです。Oracle WebLogic Server、IBM WebSphere、IBM Liberty、Apache Tomcat、Red Hat WildFly (JBoss)、Spring、Hibernateなど、多くのアプリケーション・サーバーでこのアプローチがサポートされています。これらのアプリケーション・サーバーでUCPを使用する方法については、Oracleおよび他のプロバイダ(IBMなど)のホワイト・ペーパーに記載されています。UCPをデータ・ソースとして使用すると、高速接続フェイルオーバー、ランタイム・ロード・バランシング、アプリケーション・コンティニュイティ、透過的アプリケーション・コンティニュイティなどのUCP機能を十分な動作保証とともに使用できます。

透過的アプリケーション・コンティニュイティ(TAC)またはアプリケーション・コンティニュイティ(AC)の有効化

TACは、セッションとトランザクションの状態を透過的に追跡および記録して、リカバリ可能な停止の直後にデータベース・セッションをリカバリできるようにします。事前定義済データベース・サービスの2つのトランザクション処理ペアでは、TACがデフォルトで有効になっています。

ACはカスタマイズが可能で、副次的影響の再実行を選択したり、TACでは実行されないフェイルオーバー時の複雑なコールバックを追加したりできます。Oracle 12cのドライバ(JDBC ThinまたはOracle Call Interface)を使用している場合、副次的影響またはコールバックを使用してカスタマイズする場合、またはセッション期間一時表などの状態を使用してクリーン・アップを行わないアプリケーションを使用する場合は、ACを使用します。

透過的アプリケーション・コンティニュイティを使用するためのステップ

  • 使用しているデータベース・サービスで透過的アプリケーション・コンティニュイティを有効にする必要がある場合は、フェイルオーバーのためのサービス属性の有効化を参照してください。

  • サポートされている次のいずれかのクライアントを使用します。

    最新のクライアント・ドライバを使用することをお薦めします。Oracle Database 19c以降のクライアント・ドライバは、TACを完全にサポートしています。

    • Oracle JDBC Replay Driver 18c以降。これは、Oracle Database 18cに付属する、アプリケーション・コンティニュイティのためのJDBCドライバ機能です。
    • Oracle Universal Connection Pool (UCP) 18c以降とOracle JDBC Replay Driver 18c以降。
    • Oracle WebLogic Server Active GridLink、またはUCPとOracle JDBC Replay Driver 18c以降を使用したサードパーティのJDBCアプリケーション・サーバー。
    • Oracle JDBC Replay Driver 18c以降を使用したJava接続プールまたはスタンドアロンJavaアプリケーション。
    • Oracle Call Interface Session Pool 19c以降。
    • SQL*Plus 19c (19.3)以降
    • プールされたODP.NET管理対象外ドライバ18c以降(12.2以降では"Pooling=true"がデフォルト)。
    • 19c以降のOCIドライバを使用したOracle Call Interfaceベースのアプリケーション。
  • 接続プールへの接続の返却。

    アプリケーションで次のいずれかの接続を使用する場合は、リクエスト境界を識別するためにアプリケーションに変更を加える必要はありません:

    • Oracle接続プールからの接続、または
    • Oracle JDBC Replay Driver 18c以降からの接続、または
    • 19c以降を使用したOracle Call Interfaceベースのアプリケーションからの接続

    接続プールを使用している場合、アプリケーションはリクエストが完了するたびに接続をプールに戻す必要があります。アプリケーションで必要なときにのみ接続をチェックアウトすることをお薦めします。使用していない接続を保持しているのは適切ではありません。また、示されたドライバを使用する透過的アプリケーション・コンティニュイティでは、境界を追加できる場所が検出され、独自の境界が作成されます。

  • FAILOVER_RESTOREの使用

    透過的アプリケーション・コンティニュイティを有効にすると、事前設定されたセッション状態が自動的にリストアされます。標準セットに加えて事前設定済のセッション状態が必要になった場合は、コールバック(UCPラベル)を登録して、それらの状態をリストアできます。一時表やSYS_CONTEXTといった複雑なセッション状態をリストアすることが必要になった場合は、アプリケーション・コンティニュイティを使用すると柔軟に対応できます。

  • アプリケーションでの可変値の使用の有効化

    可変関数は、実行されるたびに新しい値を返す可能性のある関数です。SYSDATESYSTIMESTAMPSYS_GUIDおよびsequence.NEXTVALについては、元の結果を保持できるようなサポートがあります。アプリケーション・コンティニュイティ19c以降では、SQLの可変値が自動的にKEEPされます。アプリケーションが可変関数を使用する場合、または可変関数に依存する場合は、DBAがGRANT KEEP権限を発行する必要があります。KEEP権限が付与されると、元の関数結果が再実行時に適用されます。例:

    SQL> GRANT [KEEP DATE TIME | KEEP SYSGUID] … TO USER
    SQL> GRANT KEEP SEQUENCE mySequence TO myUser ON sequence.object
  • 副次的影響の無効化

    副次的影響とは、メールの送信、ファイルの転送、TCPの使用といった外部アクションです。透過的アプリケーション・コンティニュイティでは、副次的影響が検出されますが、再実行されません。副次的影響の再実行が必要な場合は、アプリケーション・コンティニュイティを使用すると柔軟に対応できます。

アプリケーション・コンティニュイティを使用するためのステップ

  • 使用しているデータベース・サービスでアプリケーション・コンティニュイティを有効にする必要がある場合は、フェイルオーバーのためのサービス属性の有効化を参照してください。

  • サポートされている次のいずれかのクライアントを使用します。

    • Oracle JDBC Replay Driver 12c以降。これは、Oracle Database 12cに付属する、アプリケーション・コンティニュイティのためのJDBCドライバ機能です。
    • Oracle Universal Connection Pool (UCP) 12c以降とOracle JDBC Replay Driver 12c以降。
    • Oracle WebLogic Server Active GridLink、およびUCPとOracle JDBC Replay Driver 12c以降を使用したサードパーティのJDBCアプリケーション・サーバー。
    • Oracle JDBC Replay Driver 12c以降とリクエスト境界またはプールされたデータ・ソースを使用したJava接続プールまたはスタンドアロンJavaアプリケーション。
    • Oracle Call Interface Session Pool 12cリリース2以降を使用するアプリケーションおよび言語ドライバ。
    • SQL*Plus 19.3以降。
    • プールされたODP.NET管理対象外ドライバ12cリリース2以降(12.2以降では"Pooling=true";"Application Continuity=true"がデフォルト)
  • 接続プールへの接続の返却。

    アプリケーションでリクエストの境界をサポートするOracle接続プールまたはサードパーティのJDBCプールを使用している場合は、リクエスト境界を識別するためにアプリケーションに変更を加える必要はありません。Oracleプールを使用し、リクエストとリクエストの間に接続をそのプールに返すのがベスト・プラクティスです。アプリケーションで必要なときにのみ接続をチェックアウトすることをお薦めします。使用していない接続を保持しているのは適切ではありません。またそうすると、透過的な計画メンテナンスが行われなくなります。

  • FAILOVER_RESTOREの使用

    FAILOVER_RESTORE=LEVEL1を設定すると、最も一般的な状態が自動的にリストアされます。アプリケーションで標準セットに加えてセッション状態を事前設定する場合は、コールバック(UCPラベル)を登録して、それらの状態をリストアする必要があります。サービスでFAILOVER_RESTORE=LEVEL1を設定し、次を使用します:

    • 接続初期化コールバック(Javaの場合)または(古い)TAFコールバック(Oracle Call Interfaceの場合)、または
    • ユニバーサル接続プールまたはWebLogic Serverの接続ラベル付け
  • アプリケーションでの可変値の使用の有効化

    可変関数は、実行されるたびに新しい値を返す可能性のある関数です。SYSDATESYSTIMESTAMPSYS_GUIDおよびsequence.NEXTVALについては、元の結果を保持できるようなサポートがあります。アプリケーション・コンティニュイティ19c以降では、SQLの可変値が自動的にKEEPされるため、アクションは必要ありません。PL/SQLに可変値が必要な場合は、DBAがGRANT KEEP権限を発行する必要があります。KEEP権限が付与されると、元の関数結果が再実行時に適用されます。例:

    SQL> GRANT [KEEP DATE TIME | KEEP SYSGUID] … TO USER
    SQL> GRANT KEEP SEQUENCE mySequence TO myUser ON sequence.object
  • 副次的影響を再実行するかどうかの判断

    副次的影響とは、メールの送信、ファイルの転送、TCPの使用といった外部アクションです。アプリケーション・コンティニュイティでは、再実行を無効にしないかぎり、副次的影響は再実行されます。再実行すべきではない外部アクションがリクエストに含まれる場合は、アプリケーション・コンティニュイティが有効になっていない接続をそのリクエストで使用するか、disableReplay() API (Javaの場合)またはOCIRequestDisableReplay() (Oracle Call Interfaceの場合)を使用して、そのリクエストの再実行を無効にします。すべての副次的影響を再実行することを望まない場合は、透過的アプリケーション・コンティニュイティを使用してください。