Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Oracle Database Connection Management Fast Appl...

Oracle Database Connection Management Fast Application Notification/Transparent Application Continuity

Oracle Databaseのコネクションを積極的に制御する機能であるFast Application NotificationとTransparent Application Continuityの機能概念の説明

oracle4engineer

February 05, 2024
Tweet

More Decks by oracle4engineer

Other Decks in Programming

Transcript

  1. 1. Oracle Real Application Clusters (RAC)の持つ性質 2. アプリケーション・サーバーからRACにコネクション・プールで接続するときの課題 3. データベース・コネクションを積極的に制御する

    • Fast Application Notification / 高速アプリケーション通知 • (Transparent) Application Continuity / (透過的)アプリケーション・コンティニュイティ アジェンダ Copyright © 2023, Oracle and/or its affiliates 2
  2. 全ノードが全データにアクセス可能 RACの物理構成 ストレージ・ネットワーク インターコネクト・ネットワーク パブリック・ネットワーク データベース・クライアント クライアントとの通信 ストレージ・ノード • ストレージ・デバイス

    コンピュート・ノード • CPU+メモリー • 全ノードが対等な関係 コンピュート・ノード間の通信 全コンピュート・ノードは全ストレージにアクセス可能 Copyright © 2023, Oracle and/or its affiliates 4
  3. Oracle Real Application Clusters DRAM (キャッシュ・メモリー) ユーザーからは透過的に複数CPUで処理可能 共有メモリー型マルチ・プロセッサ RACは共有メモリー型マルチ・プロセッサと同じくキャッシュ一貫性を維持 ノード1

    (キャッシュ) ノード2 (キャッシュ) データベース (ストレージ上のファイル群) DRAM (キャッシュ・メモリー) キャッシュ一貫性 キャッシュ・メモリー キャッシュ・メモリー キャッシュ一貫性 CPU 1 CPU 2 SGA DRAM (メイン・メモリー) Copyright © 2023, Oracle and/or its affiliates 6
  4. データ・モデル(スキーマ構造)、トランザクション分離レベルの挙動も同じ クライアントはどのノードに接続してもシングル・インスタンス構成と同じアクセスが可能 ストレージ・ノード • ストレージ・デバイス コンピュート・ノード • CPU+メモリー • 全ノードが対等な関係

    インターコネクト・ネットワーク コンピュート・ノード間の通信 全コンピュート・ノードは全ストレージにアクセス可能 パブリック・ネットワーク データベース・クライアント クライアントとの通信 ストレージ・ネットワーク メモリー一貫性を全自 動で維持 oracle クライアントが接続した ノードのプロセスがSQL 処理 Copyright © 2023, Oracle and/or its affiliates 7
  5. どのノードからも全データに同じようにアクセス可能 - クライアントから見るとシングル・インスタンス構成と同じ 性能 - スケーラビリティ: 強い参照整合性を持つスキーマ構造もそのまま実行可能 データベース・クライアント クライアントはどのサーバーに接続しても 同じデータの見え方、シングルインスタンス

    と同じトランザクション分離レベル サーバー・ノード間のメモリー 一貫性を全自動で維持 シングル・インスタンス構成と同じアクセスが可能 • データ・モデル(スキーマ構造)、トランザクション分離レベルの挙動も同じ 並列実行プロセスがデータを分 割して並列処理 PX PX PX PX PX PX データベース・クライアント 全ノードを使用した1つのSQL処理の並列化が可能 • アプリからは巨大な一つのデータベースインスタンスに見える Copyright © 2023, Oracle and/or its affiliates 8
  6. サーバーがクラッシュしてもクライアントは別ノードに接続すると全データにアクセス可能 可用性 - 非計画停止 ストレージ・ノード • ストレージ・デバイス コンピュート・ノード • CPU+メモリー

    • 全ノードが対等な関係 全コンピュート・ノードは全ストレージにアクセス可能 パブリック・ネットワーク データベース・クライアント クライアントとの通信 ストレージ・ネットワーク メモリー一貫性を全自 動で維持 oracle クライアントが接続した ノードのプロセスがSQL 処理 oracle Copyright © 2023, Oracle and/or its affiliates 9
  7. 一時的にパッチ状態が異なるOracleバイナリでRACを稼働させることが可能 可用性 - 計画停止: RACはローリング・パッチ適用可能 RU 19.17 RU 19.17 RU

    19.17 ノード 1 ノード 2 ノード 3 ※RU: Release Update 3か月ごとに提供される集積パッチ Oracle DatabaseのパッチはまずRACローリング適用可能であるように作成され、ローリング不可の修正の場合は個別 パッチとして提供されます。 (1) ノード1にパッチを適用するためプロセス停止 他のノードがデータベース・アクセスを維持 RU 19.18 RU 19.17 RU 19.17 ノード 1 ノード 2 ノード 3 (2) ノード1にパッチを適用したバイナリでプロセス起動 一時的にパッチ状態が異なるバイナリで稼働可能 停止 起動 Copyright © 2023, Oracle and/or its affiliates 10
  8. コネクション・プールはOracleインスタンスとの物理コネクションを接続したままにする Real Application Clustersとコネクション・プール Connection Pool RACノード 1 RACノード n

    アプリケーション・サーバー Clusterware Clusterware service service 停止 起動 非計画停止 (DBサーバー側のクラッシュ) トランザクションは自動でロールバックされるが... • TCPの性質でクライアント側が切断された ことに気付かずにハング状態になる障害パ ターンがある • 切断されたコネクションのトランザクションは エラーになる 計画停止 (ローリング・パッチ適用など) Oracleインスタンスをコマンドで停止/起動する • トランザクション中にOracleインスタンスを 停止させるとエラーになる • 接続されたままの物理コネクションを安全に 切断できるか? Oracleインスタンス/サービス起動 接続リクエストを受け付け可能だが... • 起動してきたOracleインスタンス/サービ スに物理コネクションが作成されるのは いつ? Copyright © 2023, Oracle and/or its affiliates 13
  9. サーバーがクラッシュしてもクライアントは別ノードに接続すると全データにアクセス可能 クライアントはどのノードに接続してもシングル・インスタンス構成と同じアクセスが可能 ストレージ・ノード • ストレージ・デバイス コンピュート・ノード • CPU+メモリー • 全ノードが対等な関係

    全コンピュート・ノードは全ストレージにアクセス可能 パブリック・ネットワーク データベース・クライアント クライアントとの通信 ストレージ・ネットワーク メモリー一貫性を全自 動で維持 oracle クライアントが接続した ノードのプロセスがSQL 処理 oracle Copyright © 2023, Oracle and/or its affiliates 14
  10. シャットダウンするOracleインスタンスに接続していた物理コネクションを安全に切断できるか RACはローリング・パッチ適用可能 - 全体としてはデータベース・アクセスを維持 RU 19.17 RU 19.17 RU 19.17

    ノード 1 ノード 2 ノード 3 Connection Pool シャットダウンするOracleインスタンス に接続していた物理コネクションを切 断する必要がある 停止 Copyright © 2023, Oracle and/or its affiliates 16
  11. 物理コネクションが作成されるのはいつ? Oracleインスタンス/サービス起動 RU 19.17 RU 19.17 RU 19.17 ノード 1

    ノード 2 ノード 3 Connection Pool 起動してきたOracleインスタンスに 物理コネクションが作成される? 起動 Copyright © 2023, Oracle and/or its affiliates 17
  12. データベース・コネクションを積極的に制御する • Fast Application Notification / 高速アプリケーション通知 • (Transparent) Application

    Continuity / (透過的)アプリケーション・コンティニュイティ Copyright © 2023, Oracle and/or its affiliates 18
  13. Fast Application Notification (FAN) と Transparent Application Continuity (TAC) データベース・コネクションを積極的に制御する

    Fast Application Notification コネクション・プールが物理コネクションを制御する • 非計画停止 - コネクション・プールから該当物理コネク ションを即時破棄 • 計画停止 - Oracleインスタンス停止前に物理コネク ションをアプリケーションから返却されたら切断する • サービス起動 - 物理コネクションのリバランス (Transparent) Application Continuity 接続ドライバによる自動再実行 • 非計画停止 - 物理コネクションが異常切断されたら 自動再接続して自動再実行 Connection Pool アプリケーション・サーバー Clusterware Clusterware FANイベント service service (T)AC 切断検出したら自動再実行 FAN DOWN/UP/負荷配分通知 RACノード 1 RACノード n Copyright © 2023, Oracle and/or its affiliates 19
  14. 異常を検出したら、異常に対処する機能が発動する ネットワーク越しの異常検出 異常を検出 異常に対処 • 接続時フェイルオーバー • アプリケーション・コンティニュイティ • TCP

    FIN/RST応答 • 仮想IPアドレス(VIP) • TCP keepalive • FAN - 高速接続フェイルオーバー(FCF) Copyright © 2023, Oracle and/or its affiliates 22
  15. Fast Application Notification (FAN) / 高速アプリケーション通知 Oracle ClusterwareからOracleクライアントにメッセージ通知する仕組み Fast Application

    Notification (FAN) • Oracle Clusterwareからクライアントにイベント通知 Oracle製コネクション・プールがFAN対応 • Universal Connection Pool for Java (UCP) • Oracle Call Interface(OCI) Session Pool • ODP.NET Unmanaged Driver Fast Connection Failover • DOWNイベントによるコネクション破棄 • 計画停止/非計画停止を区別 • UPイベントによるコネクション作成(UCP) Runtime Connection Load Balancing • Oracleインスタンスが負荷配分比率を算出 • リクエストを発行するOracleインスタンスを制御 • 物理コネクションのリバランス Connection Pool ノード 1 ノード 2 アプリケーション・サーバー Clusterware Clusterware FANイベント FANイベント service service Copyright © 2023, Oracle and/or its affiliates 24
  16. 言語によって事情が異なる コネクション・プール機能はどの階層の持ち物か Application Server Pool Application Server Pool Javaアプリケーション・サーバー •

    JDBC Driver Java以外のアプリケーション・サーバー • Oracle Call Interface (OCI) • Oracle Data Provider for .NET (ODP.NET) • コネクション・プール機能はアプリケーション・サーバーの役割 • Universal Connection Pool (UCP)を別途提供 • UCPを組み込むことをサポートしているか • コネクション・プール機能は接続ドライバの役割 • コネクション・プール機能はOracle接続ドライバと一体 Copyright © 2023, Oracle and/or its affiliates 25
  17. コネクション・プールだけのjarファイルを提供 Oracle Universal Connection Pool (UCP) • JDBCドライバのjarファイルとは独立したコネクション・プールだけのucp.jarファイルを提供 • Oracle

    Databaseに同梱 $ORACLE_HOME/ucp/lib/ucp.jar • Oracle JDBCドライバのダウンロード・ページからも取得可能 Copyright © 2023, Oracle and/or its affiliates 26
  18. WebLogic Server 12.1.2以降でアプリケーション・コンティ ニュイティに対応。 以下のデータ・ソースでbeginRequest()/endRequest() の追加不要。 Generic Data Souce Active

    GridLink Data Source • 内部的にUCPを使用しているのでFANにも対応 • WebLogic Suiteのライセンスが必要 UCP Data Source (WLS 12.2.1~) • FAN対応 • Standard Editionでも使用可能 • WLSの一部の機能がインテグレートされていない Oracle WebLogic Server Application Server Pool Generic Data Source Active GridLink Data Source UCP Data Source ACは接続ドライバの機能 (プールも関係する) Javaアプリケーション・サーバーではコネクション・プール 機能はアプリケーション・サーバーの役割 Copyright © 2023, Oracle and/or its affiliates 27
  19. アプリケーション・サーバーの機能の一部を入れ替えることは基本的に想定されていない 2020年3月時点で明示的にUCPのサポートが公開され ているもの: IBM WebSphere IBMのWebページにUCPの組み込み方が掲載されている。 UCPがサポートされている記述がある。 https://www.ibm.com/support/pages/enabling-oracle-universal- connection-pooling-ucp-websphere-application-server NEC

    Web OTX マニュアルにV8.4からUCPをサポートする記述がある。 https://www.manuals.nec.co.jp/contents/system/files/nec_manuals/node/290/WebO TX/101/html/index.html?/indexwithtoc.html&/update/old_update/v840/feature.html これら以外のJavaアプリケーション・サーバーはコネクショ ン・プールにUCPを使用することを想定していない。 サード・パーティ製商用Javaアプリケーション・サーバーとUCP Application Server Pool コネクション・プールにUCPを使用 することが可能か(FAN対応) ACは接続ドライバの機能 (プールも関係する) Javaアプリケーション・サーバーではコネクション・プール 機能はアプリケーション・サーバーの役割 Copyright © 2023, Oracle and/or its affiliates 28
  20. データソースの設定にUCPのクラスを指定する TomcatとUCP 参考ホワイトペーパー https://www.oracle.com/docs/tech/database/planned-unplanned-rlb-ucp-tomcat.pdf <Context docBase=“UCPTomcat” path=“/UCPTomcat” reloadable=“true” source="org.eclipse.jst.jee.server:UCPTomcat"> <Resource

    name="tomcat/UCPPool" auth="Container" <!--Defines UCP or JDBC factory for connections --> factory="oracle.ucp.jdbc.PoolDataSourceImpl" <!--Defines type of the datasource instance --> type="oracle.ucp.jdbc.PoolDataSource" description="UCP Pool in Tomcat" <!--Defines the Connection Factory to get the physical connections --> connectionFactoryClassName="oracle.jdbc.pool.OracleDataSource” minPoolSize="2" maxPoolSize="60" initialPoolSize="15" autoCommit="false" user="scott" password="tiger" <!--FCF is auto-enabled in 12.2. Use this property only if you are using Pre 12.2 UCP fastConnectionFailoverEnabled=”true” --> <!--Database URL --> url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=proddbclust er- scan)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=proddb)))“ </Resource> </Context> Copyright © 2023, Oracle and/or its affiliates 29
  21. ノード/Oracleインスタンス/サービスの停止をClusterwareがDOWNイベントとして通知 • Clusterwareはサービス停止の原因がクラッシュによ る非計画停止(reason=failure) かコマンドによる 計画停止(reason=user)かを区別してDOWNイベ ントを発行する • どのノード/Oracleインスタンス/サービスが停止したか をDOWNイベントとしてクライアントに通知する

    • クライアントはDOWNイベントに記述されている対象と の物理コネクションを切断しようとするが、切断するタイ ミングはreasonによって異なる Fast Connection Failover (FCF): DOWNイベントによる停止対象の通知 Oracle instance1 Oracle instance2 service1 service1 Oracleクライアント Clusterware Clusterware FANイベント (2) DOWN通知 Pool (1) サービス停止 Copyright © 2023, Oracle and/or its affiliates 30
  22. Oracleインスタンスの異常停止を検出したらそのインスタンスとの物理コネクションを即時破棄 1. OS即時停止 2. 物理コネクションの破棄 FAN対応クライアントと組み合わせたOracleインスタンスの非計画停止 Oracle instance1 Oracle instance2

    service1 service1 Oracleクライアント Clusterware Clusterware FANイベント Oracle instance1 Oracle instance2 service1 Clusterware Clusterware Pool Oracleクライアント (3) インスタンス2との物理コ ネクションを即時破棄 (2) DOWN通知 Pool TCPタイムアウトを待たない (1) 異常終了 Copyright © 2023, Oracle and/or its affiliates 31
  23. Java UCPはSERVICE UPイベントで物理コネクションを生成する 1. サービス起動直後 サービス起動時の物理コネクション自動生成 SERVICE UPイベント Oracle instance1

    Oracle instance2 service1 service1 Oracleクライアント Clusterware Clusterware FAN UPイベント (2) UP通知 (1) サービス起動 (3) 物理コネクション作成 Pool 1. サービス起動 2. 該当サービスのSERVICE UPイベント生成 3. Java UCPは物理コネクションを生成 • UCPの中の未使用コネクションのいくつかを再作成 • 接続先のOracleインスタンスはサーバー側接続ロー ド・バランスに従う • UPイベント直後には各Oracleインスタンスへの物理コ ネクションの本数の割合が期待するものになるとは限ら ない Copyright © 2023, Oracle and/or its affiliates 32
  24. RCLBが有効だとコネクション・プールは物理コネクションを定常的に再作成する動作「も」する 1. サービス起動直後 2. 定常状態 Runtime Connection Load Balancing (RCLB)

    ランタイム接続ロードバランス Oracle instance1 Oracle instance2 service1 service1 Oracleクライアント Clusterware Clusterware FAN UPイベント (2) UP通知 Oracle instance1 Oracle instance2 service1 Clusterware Clusterware Oracleクライアント (1) サービス起動 (5) プールの中のフリーの コネクションを切断し 再作成 (3) 物理コネクション作成 service1 FAN RCLBイベント (4) 定期的なRCLBイベント Pool Pool Copyright © 2023, Oracle and/or its affiliates 33
  25. Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1 service1

    Runtime Connection Load Balancing (RCLB) ロード・バランシング・アドバイザ SQL実行性能を観測し最適な負荷配分比率のガイドを生成 OracleインスタンスがSQL実行性能を直接観測している GV$SERVICEMETRIC(_HISTORY)ビューの抜粋 列 説明 SERVICE_NAME サービス名 INST_ID Oracleインスタンス番号 DBTIMEPERCALL 1コール当たりの経過時間(マイクロ秒) CALLSPERSEC 1秒当たりのユーザー・コールの数 GOAL=SERVICE_TIME DBTIMEPERCALL最小化 GOAL=THROUGHPUT CALLSPERSEC最大化 database=orcl service=service1 { {instance=orcl2 percent=60 flag=UNKNOWN aff=FALSE} {instance=orcl1 percent=40 flag=UNKNOWN aff=FALSE} } timestamp=2012-07-06 13:19:12 各Oracleインスタンスへの最適なリクエスト比率を算出 の比率でリクエストを送ってきてほしい インスタンス1 40% インスタンス2 60% Copyright © 2023, Oracle and/or its affiliates 34
  26. 新規の物理コネクション作成先 Runtime Connection Load Balancing (RCLB) RCLBイベントの比率で各Oracleインスタンスにリクエストを発行しようとする コネクション・プールから論理コネクションを取り出す Oracle インスタンス1

    Oracle インスタンス2 ノード 1 ノード 2 service1 service1 Oracleクライアント tnslsnr SCAN リスナー tnslsnr Pool Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1 service1 CLB_GOAL=SHORTでアドバイザ に従ってリダイレクト先を選択 どのOracleインスタンスに接続さ れている物理コネクションを論理コ ネクションで使用するか 使用していない物理コネクション を定期的に再作成 Copyright © 2023, Oracle and/or its affiliates 35
  27. コマンドでサービス停止が発生する場合プールに論理コネクションが返却されてから物理コネクションを切断 1. srvctl relocate service発行 2. 物理コネクションの新規接続 FAN対応クライアントと組み合わせたOracleインスタンスの計画停止 Oracle instance1

    Oracle instance2 service1 service1 Oracleクライアント Clusterware Clusterware FANイベント Pool (2) UP通知 Oracle instance1 Oracle instance2 service1 Clusterware Clusterware Pool Oracleクライアント (1) サービス起動 (3) 新規の物理コネク ションはインスタンス 2に接続される service1 Copyright © 2023, Oracle and/or its affiliates 37
  28. コマンドでサービス停止が発生する場合プールに論理コネクションが返却されてから物理コネクションを切断 3. (relocate serviceによる)サービス停止 4. 物理コネクションの排出 FAN対応クライアントと組み合わせたOracleインスタンスの計画停止 Oracle instance1 Oracle

    instance2 service1 service1 Oracleクライアント Clusterware Clusterware FANイベント Oracle instance1 Oracle instance2 service1 Clusterware Clusterware Pool Oracleクライアント (6) インスタンス1との物理 コネクションはアプリケー ションがプールに返却し たら切断 (5) DOWN通知 (4) サービス停止 Pool Copyright © 2023, Oracle and/or its affiliates 38
  29. 物理コネクションが異常切断されても更新トランザクションを安全に自動再実行 アプリケーション・コンティニュイティ対応接続ドライバは Oracleサーバーに発行した処理を記憶している。 Oracle接続ドライバがセッション切断を検出すると (1) 再接続 (2) トランザクション状態の確認 (3) トランザクション再実行

    まで自動で行う。 アプリケーションから見るとエラーを検出せずにトランザ クションが完了する。 Oracle製コネクション・プールからコネクションを取り出 してCOMMITしたら返却するコードならコード改修は (ほぼ)不要。 (Transparent) Application Continuity (透過的)アプリケーション・コンティニュイティ (1) 再接続 (2) 状態確認 (3) 再実行 Oracleクライアント RAC SELECT INSERT UPDATE COMMIT Copyright © 2023, Oracle and/or its affiliates 40
  30. コネクション・プール機能との組み合わせ JDBC thin driver (12c Release 1~) • リプレイ・ドライバのクラス(新しいクラス)を指定 oracle.jdbc.replay.OracleDataSourceImpl

    • Universal Connection Pool(UCP)を使用するかでコード修正に場合分け OCI Session Pool (12c Release 2~) • Pro*CとPro*COBOLはOCI Session Poolに対応していないのでACは使用できない • SQL*PlusはAC対応 ODP.NET Unmanaged Driver (12c Release 2~) • 接続文字列 Application Continuity=true • Managed DriverとCore Driverは非対応 アプリケーション・コンティニュイティ対応クライアント Copyright © 2023, Oracle and/or its affiliates 41
  31. アプリケーションはエラーになる 更新トランザクションの途中で異常終了するとROLLBACKされる アプリケーション Oracle接続ドライバ SQL 1 SQL 2 SQL 3

    SQL 1 SQL 2 SQL 3 Oracleサーバー SQL 1 SQL 2 SQL 3 COMMITされていない更 新はROLLBACKされる アプリケーションはエラーを 観測する Copyright © 2023, Oracle and/or its affiliates 42
  32. 再接続 セッションが切断されても自動再接続&更新トランザクション自動再実行 アプリケーション・コンティニュイティ アプリケーション Oracle接続ドライバ SQL 1 SQL 2 SQL

    3 SQL n COMMIT SQL 1 SQL 2 SQL 3 SQL n COMMIT Oracleサーバー SQL 1 SQL 2 SQL 3 SQL n COMMIT SQL 1 SQL 2 SQL 3 Oracle接続ドライバは 何を発行したかを記憶し ているので自動再実行 Copyright © 2023, Oracle and/or its affiliates 43
  33. オンラインREDOログ・ファイルにCOMMIT情報が永続化されると更新が確定したことになる • Oracleクライアント上のアプリケーションはトランザクショ ンの最後にCOMMITを発行する。 • COMMIT情報がオンラインREDOログ・ファイルに書き 込み完了した時点(永続化)でCOMMITされたことに なる(DURABILITYの保証)。 • Oracleインスタンスが異常終了しても、再起動後にオ

    ンラインREDOログ・ファイルを読むことでトランザクション が完了したかがわかる。 • すると、そのトランザクションによる中途半端なデータ・ブ ロックの更新をROLLFORWARDまたはROLLBACK すればよいかがわかる。 COMMIT oracle LGWR COMMIT Oracleクライアント SELECT INSERT UPDATE COMMIT Oracleサーバー オンライン REDOログ・ ファイル 書き込み完了 Copyright © 2023, Oracle and/or its affiliates 45
  34. 更新トランザクションの再実行にまつわる問題 • アプリケーションがCOMMITを発行したけれども、オンラ インREDOログ・ファイルへのCOMMIT書き込み完了 がOracleクライアントに通知される前にサーバー側の 障害が発生することがあり得る。 • Oracleクライアントから見るとトランザクションが完了す る前にエラーになる。 •

    サーバー側でCOMMIT書き込みが完了していたかは 見えていない。 • Oracleクライアントはこの更新トランザクションを再実 行してもよいか? • アプリケーションはエラーを観測したからといって単純に 更新トランザクションを再実行するとデータが不正にな る場合がある。 COMMIT発行時の障害 oracle LGWR COMMIT Oracleクライアント SELECT INSERT UPDATE COMMIT Oracleサーバー オンライン REDOログ・ ファイル Oracleクライアントからは COMMIT書き込み完了し たかがわからない Copyright © 2023, Oracle and/or its affiliates 46
  35. 特定のトランザクションが完了したのかを確認する(12c Release 1~) • トランザクション・ガードはアプリケーション・コンティニュイ ティ実装のために追加された機能。 • 論理トランザクションID(LTXID)を指定してそのトランザ クションが完了していたのかを確認する (要Enterprise

    Edition)。 • アプリケーション・コンティニュイティは自動再接続したと きトランザクション・ガードでCOMMIT状態を確認して 自動再実行するかを判定する • トランザクションの状態を管理する内部的な表を維持 する必要があるため論理レプリケーション機能 (GoldenGateなど)では動作しない。 トランザクション・ガード oracle COMMIT Oracleクライアント LTXID=xx COMMIT済 ? Oracleサーバー オンライン REDOログ・ ファイル トランザクション状態を管 理する内部表 Copyright © 2023, Oracle and/or its affiliates 47
  36. 読みだすたびに値が変化する可変オブジェクトの再実行時の扱い 読みだすたびに値が変化するオブジェクト • SYSDATE, SYSTIMESTAMP (現在時刻) • SYS_GUID (一意な識別子) •

    SEQUENCE.NEXTVAL (一意な数値) 再実行時に使用されるのは元の値 再実行時に値が変化するとORA-41412のエラー 再実行前の値が保存される設定が必要 KEEP属性の指定 可変オブジェクト(Mutable Object) INSERT INTO tbl1 VALUES(SYSDATE); 障害検出 ACで自動再実行 時間 時刻t0 時刻t1 COMMIT; INSERTされるのはt0 or t1 ? ⇒ 元の時刻t0 INSERT INTO tbl1 VALUES(SYSDATE); Copyright © 2023, Oracle and/or its affiliates 48
  37. 再実行前の値が保持されるのでトランザクションとして矛盾しない 可変オブジェクトのKEEP属性 SQL> INSERT INTO tbl1 VALUES(SYSDATE,1,seq1.NEXTVAL); 1行が作成されました。 SQL> SELECT

    * FROM tbl1; C1 C2 C3 ------------------- ---------- ---------- 2020/07/21 15:21:29 1 122 -- ALTER SYSTEM KILL SESSION SQL> SELECT * FROM tbl1; C1 C2 C3 ------------------- ---------- ---------- 2020/07/21 15:21:29 1 122 ここでALTER SYSTEM KILL SESSION ACでINSERTが再実行されても 再実行前の値が保持されている SYSDATEとSEQUENCE.NEXTVALを INSERT INSERTされた値を確認 (1) (2) (3) (4) セッション切断後にSQL実行 同じ値 Copyright © 2023, Oracle and/or its affiliates 49
  38. 一般的なオンライン・トランザクション処理ならコード修正不要 アプリケーション・コンティニュイティが想定するコード: 1. Oracle製コネクション・プールからコネクション取得 2. DML発行 3. 最後に1回だけCOMMIT 4. Oracle製コネクション・プールに返却

    • 一般的なオンライン・トランザクション処理ならばこうなっ ているはず。 • コネクション・プールからコネクションを取得し、返却する までをリクエスト境界と呼ぶ。 • アプリケーション・コンティニュイティが再実行するのはリク エスト境界の先頭から。 • FANが働くタイミングはFAN対応コネクション・プールか ら取得/返却するとき。 • さらに上位のフレームワークが論理コネクションをプール に返却しないコードだと修正が必要。 FANとApplication Continuityが想定するアプリケーション・コード ConnectionPool ConnectionPool getConnection() close() SQL 1 SQL n COMMIT リクエスト境界 FAN - RCLB FAN - FCF 計画停止 Copyright © 2023, Oracle and/or its affiliates 50
  39. 救えるケース • コネクション・プールを使用した(オンライン・トランザクション処理系)アプリケーション 1. コネクション・プールから論理コネクションを取得 2. 最後に1回COMMIT 3. コネクション・プールに論理コネクションを返却 救えないケース

    • 分散トランザクション • データベース・リンクも分散トランザクション • コネクション・プールを使用せずに直結している(バッチ処理系)アプリケーション • リプレイ境界内で複数回COMMITを発行する • 非トランザクション系ツール • RMAN/Data Pump/SQL*Loader ... FANとACで計画/非計画停止からコネクションを救えるデータベース・クライアント Copyright © 2023, Oracle and/or its affiliates 51
  40. コネクション・プールはOracleインスタンスとの物理コネクションを接続したままにする Real Application Clustersとコネクション・プール Connection Pool RACノード 1 RACノード n

    アプリケーション・サーバー Clusterware Clusterware service service 停止 起動 非計画停止 (DBサーバー側のクラッシュ) トランザクションは自動でロールバックされるが... • TCPの性質でクライアント側が切断された ことに気付かずにハング状態になる障害パ ターンがある • 切断されたコネクションのトランザクションは エラーになる 計画停止 (ローリング・パッチ適用など) Oracleインスタンスをコマンドで停止/起動する • トランザクション中にOracleインスタンスを 停止させるとエラーになる • 接続されたままの物理コネクションを安全に 切断できるか? Oracleインスタンス/サービス起動 接続リクエストを受け付け可能だが... • 起動してきたOracleインスタンス/サービ スに物理コネクションが作成されるのは いつ? Copyright © 2023, Oracle and/or its affiliates 52
  41. コネクション・プールはOracleインスタンスとの物理コネクションを接続したままにする Real Application Clustersとコネクション・プール Connection Pool RACノード 1 RACノード n

    アプリケーション・サーバー Clusterware Clusterware service service 停止 起動 非計画停止 (DBサーバー側のクラッシュ) トランザクションは自動でロールバックされるが... • TCPの性質でクライアント側が切断された ことに気付かずにハング状態になる障害パ ターンがある • 切断されたコネクションのトランザクションは エラーになる 計画停止 (ローリング・パッチ適用など) Oracleインスタンスをコマンドで停止/起動する • トランザクション中にOracleインスタンスを 停止させるとエラーになる • 接続されたままの物理コネクションを安全に 切断できるか? Oracleインスタンス/サービス起動 接続リクエストを受け付け可能だが... • 起動してきたOracleインスタンス/サービ スに物理コネクションが作成されるのは いつ? FAN - Fast Connection Failover (Transparent) Application Continuity FAN - Fast Connection Failover FAN - Fast Connection Failover FAN - RCLB Copyright © 2023, Oracle and/or its affiliates 53