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

Oracle Database Maximum Availability Architecture Comupte Node

Oracle Database Maximum Availability Architecture Comupte Node

Oracle Database 高可用性アーキテクチャ Computeノード編

oracle4engineer

February 05, 2024
Tweet

More Decks by oracle4engineer

Other Decks in Programming

Transcript

  1. Copyright © 2023, Oracle and/or its affiliates 2 「Oracleインスタンス」と「データベース」 「CPU+メモリー」と「ストレージ」をわけて考える

    データベース ストレージ上のファイルの集合 不揮発性デバイスに永続化 (データの本体なのでなくなると困る) データベース・サーバー (Computeノード) ストレージ Oracleインスタンス データベース・サーバー上のOracleプロセスとメモリーの集合 揮発性メモリーに一時的に格納(キャッシュ) (再起動などでなくなることを想定)
  2. Copyright © 2023, Oracle and/or its affiliates 3 高可用性を実装する手段 各階層で冗長性を持たせる

    データベース ストレージ上のファイルの集合 Oracleインスタンス データベース・サーバー上のOracleプロセスとメモリーの集合 揮発性メモリーに一時的に格納(キャッシュ) (再起動などでなくなることを想定) 不揮発性デバイスに永続化 (データの本体なのでなくなると困る) プロセスとメモリーが起動できるOS環境を用意 データベース・サーバーのクラスタ構成 データの複製を用意 ミラー / バックアップ / レプリケーション データベース・サーバー (Computeノード) ストレージ 前回 今回
  3. Relational DatabaseとSQLのコンセプト • データ操作の抽象化 • Converged Database Real Application Clustersアーキテクチャ

    • Shared Everything Oracle Databaseのネットワーク接続 • データベース・サービスという抽象概念が物理構成を隠蔽 データベース・コネクションの制御 • Fast Application Notification / 高速アプリケーション通知 • (Transparent) Application Continuity / (透過的)アプリケーション・コンティニュイティ Oracle Database高可用性アーキテクチャ - コンピュート・ノードの可用性 Copyright © 2023, Oracle and/or its affiliates 4
  4. Copyright © 2023, Oracle and/or its affiliates 6 入力と出力の対応関係の定義 SQL

    出力 SELECT ename, dname, job, empno, hiredate, loc FROM emp, dept WHERE emp.deptno = dept.deptno ORDER BY ename 入力 論理データ構造
  5. Copyright © 2023, Oracle and/or its affiliates 7 入力と出力の対応関係の定義 SQL

    出力 SELECT ename, dname, job, empno, hiredate, loc FROM emp, dept WHERE emp.deptno = dept.deptno ORDER BY ename 入力 論理データ構造 何を取り出すかの宣言であって、どうやって 導出するかのアルゴリズムは記述されていない
  6. Copyright © 2023, Oracle and/or its affiliates 8 インターフェースとアルゴリズム実装の分離 SQLの結果集合を導出するアルゴリズムは自動生成される

    入力 出力 対応関係の定義 インターフェース SQL実行計画 SQL実行計画探索 アルゴリズム 全体最適化問題 値の分布統計 物理データ構造 ハードウェア・リソース 論理データ構造
  7. Copyright © 2023, Oracle and/or its affiliates 9 入力 論理データ構造

    インターフェースとアルゴリズム実装の分離 SQLの結果集合を導出するアルゴリズムは自動生成される 出力 対応関係の定義 インターフェース SQL実行計画 SQL実行計画探索 アルゴリズム 全体最適化問題 値の分布統計 物理データ構造 ハードウェア・リソース アプリケーション開発で 注力すべきところ • 論理データ構造 • クエリー
  8. Copyright © 2023, Oracle and/or its affiliates 10 インターフェースとアルゴリズム実装の分離 データベース・エンジン実装が目指すところ

    出力 対応関係の定義 インターフェース SQL実行計画 SQL実行計画探索 アルゴリズム 全体最適化問題 値の分布統計 物理データ構造 ハードウェア・リソース 入力 論理データ構造 論理データ構造の定義と インターフェース(SQL)を変更せずに アルゴリズム実装が改良される
  9. Copyright © 2023, Oracle and/or its affiliates 11 リレーショナル・モデルの操作からはじまったが、他のモデルでも使用されるようになった SQL

    - 抽象化されたデータ操作 データ・モデル • Relational • Text Search • Object Relational • XML • JSON • Spatial • Network • ... ワークロード • オンライン・トランザクション • 分析・集計 • 機械学習 • ...
  10. Copyright © 2023, Oracle and/or its affiliates 12 リレーショナル・モデルの操作からはじまったが、他のモデルでも使用されるようになった SQL

    - 抽象化されたデータ操作 データ・モデル • Relational • Text Search • Object Relational • XML • JSON • Spatial • Network • ... ワークロード • オンライン・トランザクション • 分析・集計 • 機械学習 • ... SQLは抽象データ操作 ↓ 異なる種類のデータ・モデルを操作する実装 異なる種類のワークロードに最適化する実装 ↓ Converged Database
  11. Copyright © 2023, Oracle and/or its affiliates 13 抽象化されたデータ操作 論理データ構造

    user-Bの所有するスキーマ service-A SQL どういうデータを取り出したいかの記述 (「どうやって」の手続き的アルゴリズムの記述ではない) CONNECT user-B/password@host:port/service-A データベース・クライアントは「サービス」に接続する サービス データベースのワークロードを抽象化した概念
  12. Copyright © 2023, Oracle and/or its affiliates 14 抽象化されたデータ操作 SQL

    どういうデータを取り出したいかの記述 (「どうやって」の手続き的アルゴリズムの記述ではない) CONNECT user-B/password@host:port/service-A データベース・クライアントは「サービス」に接続する サービス データベースのワークロードを抽象化した概念 service-A データベース ストレージ上のファイルの集合 Oracleインスタンス データベース・サーバー上のOracleプロセスとメモリーの集合
  13. Copyright © 2023, Oracle and/or its affiliates 15 抽象化されたデータ操作 SQL

    どういうデータを取り出したいかの記述 (「どうやって」の手続き的アルゴリズムの記述ではない) CONNECT user-B/password@host:port/service-A データベース・クライアントは「サービス」に接続する サービス データベースのワークロードを抽象化した概念 service-A データベース ストレージ上のファイルの集合 Oracleインスタンス データベース・サーバー上のOracleプロセスとメモリーの集合 データベース・クライアントは「サービス」に接続 ↓ サービス(抽象)がデータベース・サーバー側の物理構成(具象)を隠蔽
  14. Copyright © 2023, Oracle and/or its affiliates 16 SQL どういうデータを取り出したいかの記述

    (「どうやって」の手続き的アルゴリズムの記述ではない) CONNECT user-B/password@host:port/service-A データベース・クライアントは「サービス」に接続する サービス データベースのワークロードを抽象化した概念 service-A データベース ストレージ上のファイルの集合 Oracleインスタンス データベース・サーバー上のOracleプロセスとメモリーの集合 Maximum Availability Architecture • サービスが具象レイヤーの構成を隠蔽 • サービスへのアクセスを継続 Maximum Availability Architecture (MAA) 抽象化されたデータ操作を計画停止/非計画停止どちらがあっても継続する
  15. Copyright © 2023, Oracle and/or its affiliates 17 高可用性を実装する手段 各階層で冗長性を持たせる

    データベース ストレージ上のファイルの集合 Oracleインスタンス データベース・サーバー上のOracleプロセスとメモリーの集合 揮発性メモリーに一時的に格納(キャッシュ) (再起動などでなくなることを想定) 不揮発性デバイスに永続化 (データの本体なのでなくなると困る) プロセスとメモリーが起動できるOS環境を用意 データベース・サーバーのクラスタ構成 データの複製を用意 ミラー / バックアップ / レプリケーション データベース・サーバー (Computeノード) ストレージ
  16. Copyright © 2023, Oracle and/or its affiliates 18 文脈によって意味が異なる用語 サービス

    / インスタンス / データベース データベース・サーバー (Computeノード) ストレージ サービス クラウドが用意する機能のメニュー データベース データの集合 インスタンス サービスを実体化したもの service Oracleインスタンス データベース・サーバー上の Oracleプロセスとメモリーの集合 データベース ストレージ上のファイルの集合 サービス データベースのワークロードを抽 象化した概念 Oracle Databaseの文脈 クラウドの文脈 例: Oracle Base Database Service
  17. Copyright © 2023, Oracle and/or its affiliates 19 Real Application

    Clustersアーキテクチャ Shared Everything
  18. Copyright © 2023, Oracle and/or its affiliates 20 3種類のネットワーク RACの物理構成

    ストレージ・ネットワーク インターコネクト・ネットワーク パブリック・ネットワーク データベース・クライアント ストレージ・ノード • ストレージ・デバイス コンピュート・ノード • CPU+メモリー • 全ノードが対等な関係 パブリック・ネットワーク データベース・クライアントとの通信 インターコネクト・ネットワーク Computeノード間通信 ストレージ・ネットワーク 全Computeノードが全ストレージと通信
  19. Copyright © 2023, Oracle and/or its affiliates 21 データ・モデル(スキーマ構造)、トランザクション分離レベルの挙動も同じ クライアントはどのノードに接続してもシングル・インスタンス構成と同じアクセスが可能

    インターコネクト・ネットワーク パブリック・ネットワーク データベース・クライアント ストレージ・ネットワーク oracle ストレージ・ノード • ストレージ・デバイス コンピュート・ノード • CPU+メモリー • 全ノードが対等な関係 どこかのノードと接続 メモリーの一貫性を全自動で維持 すべてのデータにアクセス可能
  20. Copyright © 2023, Oracle and/or its affiliates 22 どのノードからも全データに同じようにアクセス可能 -

    クライアントから見るとシングル・インスタンス構成と同じ RAC におけるデータアクセス データベース・クライアント クライアントはどのサーバーに接続しても 同じデータの見え方、シングルインスタンス と同じトランザクション分離レベル サーバー・ノード間のメモリー 一貫性を全自動で維持 シングル・インスタンス構成と同じアクセスが可能 • データ・モデル(スキーマ構造)、トランザクション分離レベルの挙動も同じ 並列実行プロセスがデータを 分割して並列処理 PX PX PX PX PX PX データベース・クライアント 全ノードを使用した1つのSQL処理の並列化が可能 • アプリからは巨大な一つのデータベースインスタンスに見える
  21. Copyright © 2023, Oracle and/or its affiliates 24 ユーザーからは透過的に複数CPUで処理可能 共有メモリー型マルチ・プロセッサ

    RACは共有メモリー型マルチ・プロセッサと同じくキャッシュ一貫性を維持 キャッシュ・メモリー キャッシュ・メモリー キャッシュ一貫性 CPU 1 CPU 2 SGA DRAM (メイン・メモリー)
  22. Copyright © 2023, Oracle and/or its affiliates 25 Oracle Real

    Application Clusters DRAM (キャッシュ・メモリー) ユーザーからは透過的に複数CPUで処理可能 共有メモリー型マルチ・プロセッサ RACは共有メモリー型マルチ・プロセッサと同じくキャッシュ一貫性を維持 ノード1 (キャッシュ) ノード2 (キャッシュ) データベース (ストレージ上のファイル群) DRAM (キャッシュ・メモリー) キャッシュ一貫性 キャッシュ・メモリー キャッシュ・メモリー キャッシュ一貫性 CPU 1 CPU 2 SGA DRAM (メイン・メモリー)
  23. Copyright © 2023, Oracle and/or its affiliates 26 Oracleサーバー・プロセスがメモリを操作しバックグラウンド・プロセスがファイルに永続化 Oracle

    Databaseアーキテクチャ(シングル・インスタンス) オンラインREDOログ・ファイル LGWR oracle Oracleサーバー・プロセス(SQL処理の主体) ログ・ライター・プロセス DBWn データベース・ライター・プロセス データファイル 更新履歴(REDOログ情報)はOracle サーバー・プロセスによって生成され REDOログ・バッファに置かれる オンラインREDOログ・ファイルに永続化 データ・ファイルに永続化 データ操作はデータベース・バッファ・ キャッシュ上のデータ・ブロックにアクセス SGA REDOログ・バッファ データベース・バッファ・キャッシュ
  24. Copyright © 2023, Oracle and/or its affiliates 27 バッファ・キャッシュ・ミスするとOracleサーバー・プロセスがストレージからデータ・ブロックを取得 Oracle

    Databaseアーキテクチャ(シングル・インスタンス) オンラインREDOログ・ファイル LGWR oracle Oracleサーバー・プロセス(SQL処理の主体) ログ・ライター・プロセス DBWn データベース・ライター・プロセス データファイル SGA バッファ・キャッシュ・ミスするとOracleサーバー・ プロセスがストレージからデータブロックを取得し バッファ・キャッシュに乗せる REDOログ・バッファ データベース・バッファ・キャッシュ
  25. Copyright © 2023, Oracle and/or its affiliates 28 バッファ・キャッシュ・ミスすると別のOracleインスタンスからデータ・ブロックを取得 Oracle

    Databaseアーキテクチャ(RAC) REDOログ・バッファ オンラインREDOログ・ファイル LGWR oracle Oracleサーバー・プロセス(SQL処理の主体) ログ・ライター・プロセス データベース・バッファ・キャッシュ DBWn データベース・ライター・プロセス データファイル SGA バッファ・キャッシュ・ミスすると別のOracleインス タンスがキャッシュしているデータブロックを取得 しバッファ・キャッシュに乗せる
  26. Copyright © 2023, Oracle and/or its affiliates 29 Oracleサーバー・プロセスから見るとローカルのデータベース・バッファ・キャッシュを操作しているだけ Oracleクライアントからはシングル・インスタンスもRACも同じに見える

    REDOログ・バッファ オンラインREDOログ・ファイル LGWR oracle Oracleサーバー・プロセス(SQL処理の主体) ログ・ライター・プロセス データベース・バッファ・キャッシュ DBWn データベース・ライター・プロセス データファイル SGA データ操作はデータベース・バッファ・ キャッシュ上のデータ・ブロックにアクセス バッファ・キャッシュ・ミスしたときに どこから取得するかの違い バッファ・キャッシュ・ミスしたときに どこから取得するかの違い
  27. Copyright © 2023, Oracle and/or its affiliates 30 データ・モデルとクラスタ・ノード構成が分離されている 現実にあるほとんどのアプリケーション・スキーマは完全には

    パーティショニングできない。 RACはデータの配置がデータベース・サーバーと結びつい ていない。 シェアード・ナッシング・クラスタはデータがパーティショニング できることを暗黙の前提にしている。 →ユーザーが自分のデータしか操作しない局所参照性 パーティショニングできないアプリケーション・スキーマでも動 作できるようにしたのが”Real Application” Clusters Oracle Real Application Clusters データ・モデル/SQL 抽象 実装 データ構造/クラスタ構成
  28. Copyright © 2023, Oracle and/or its affiliates 31 Oracle Autonomous

    Database Exadataをベースにして高度な抽象化がなされた自律型データベース・サービス Exadata上のプラガブル・データベース • 指定する変数はOCPU数とストレージ容量のみ • RACノード数はユーザーが指定する変数ではない Oracle Computing Unit (OCPU) • スケールアップかつスケールアウトを抽象化 • OCPU数に比例したCPU時間 • OCPU数に比例したメモリー容量 • OCPU数に比例したストレージ性能 • 1 OCPUは1CPU物理コアに相当 • 無停止でOCPU数(リソース割り当て)を変更 service
  29. Copyright © 2023, Oracle and/or its affiliates 32 Oracle Autonomous

    Database Oracle Computing Unit(OCPU) の1変数にハードウェア・リソースを抽象化 DBサーバー ストレージ Oracle Computing Unit (OCPU) • 1 OCPUは1CPU物理コアに相当 • スケール・アップかつスケール・アウトを抽象化 • OCPU数に比例したCPU時間 • OCPU数に比例したメモリー容量 • OCPU数に比例したストレージ性能 • 無停止でOCPU数(リソース割り当て)を変更 CPU メモリー Autonomous Databaseインスタンス • 1つのプラガブル・データベースのこと • OCPUに抽象化されたリソース割り当て • サービスでリソース制御 スケール・アップ スケール・アウト サービス • データベースのワークロードを抽象化 service
  30. Copyright © 2023, Oracle and/or its affiliates 34 サーバーがクラッシュしてもクライアントは別ノードに接続すると全データにアクセス可能 クライアントはどのノードに接続してもシングル・インスタンス構成と同じアクセスが可能

    ストレージ・ノード • ストレージ・デバイス コンピュート・ノード • CPU+メモリー • 全ノードが対等な関係 全コンピュート・ノードは全ストレージにアクセス可能 パブリック・ネットワーク データベース・クライアント クライアントとの通信 ストレージ・ネットワーク メモリー一貫性を全自 動で維持 oracle クライアントが接続した ノードのプロセスがSQL 処理 oracle
  31. Copyright © 2023, Oracle and/or its affiliates 36 オンラインREDOログ・ファイルを読んでデータ・ブロックの内容をリカバリ シングル・インスタンス構成でのOracleインスタンス障害からのリカバリ

    REDOログ・ ファイル 制御ファイル データファイル (表領域) SYSTEM UNDO SYSAUX TEMP USERS データファイル (UNDO表領域) Oracle インスタンス Oracleインスタンスが再起動してきたら オンラインREDOログ・ファイルの内容を未 更新のデータ・ブロックに適用
  32. Copyright © 2023, Oracle and/or its affiliates 37 REDOログ・ファイルとUNDO表領域をOracleインスタンスごとに追加 RACのデータベース・ファイル構造

    REDOログ・ ファイル 制御ファイル データファイル (表領域) SYSTEM UNDO SYSAUX TEMP USERS データファイル (UNDO表領域) REDOログ・ ファイル UNDO データファイル (UNDO表領域) 全インスタンスからアクセスされる インスタンスが起動している間はそのインスタンスからのみアクセスされる Oracle インスタンス1 Oracle インスタンスn 初期化パラメータでインスタンスごとに指定 SID.THREAD=n SID.UNDO_TABLESPACE=UNDOTBSn 各Oracleインスタンスは自身が生成した 更新情報を自身専用のREDOログ・ファ イルとUNDO表領域に書き込む 各Oracleインスタンスは自身が生成した 更新情報を自身専用のREDOログ・ファ イルとUNDO表領域に書き込む
  33. Copyright © 2023, Oracle and/or its affiliates 38 オンラインREDOログ・ファイルを読んでデータ・ブロックの内容をリカバリ RACでのOracleインスタンス障害からのリカバリ

    REDOログ・ ファイル 制御ファイル データファイル (表領域) SYSTEM UNDO SYSAUX TEMP USERS データファイル (UNDO表領域) REDOログ・ ファイル UNDO データファイル (UNDO表領域) 全インスタンスからアクセスされる インスタンスが起動している間はそのインスタンスからのみアクセスされる Oracle インスタンス1 Oracle インスタンスn 正常稼働しているOracleインスタンスが クラッシュしたOracleインスタンスのオンライ ンREDOログ・ファイルを読んで未更新の データ・ブロックに適用 正常稼働しているOracleインスタンスが クラッシュしたOracleインスタンスのオンライ ンREDOログ・ファイルを読んで未更新の データ・ブロックに適用
  34. Copyright © 2023, Oracle and/or its affiliates 39 Oracle Real

    Application Clustersを 構成するコンポーネント Oracle Database Oracle Grid Infrastructure
  35. Oracle Real Application Clusters (RAC)のコンポーネント Oracle DatabaseとOracle Grid Infrastructureの2種類のソフトウェアをインストール Copyright

    © 2023, Oracle and/or its affiliates 40 Clusterware Clusterware tnslsnr tnslsnr SCANリスナー tnslsnr Oracle インスタンス ASM インスタンス Oracle インスタンス ASM インスタンス Oracleリスナー・プロセス ネットワーク接続リクエストを受ける データベース ストレージ上のファイル群 SCANリスナー・プロセス ネットワーク接続リクエストを受ける Oracleインスタンス DBMS本体 ASMインスタンス クラスタ・ファイルシステム Oracle Clusterware クラスタ・メンバー管理 仮想IPアドレス OracleリスナーのIPアドレス ノード1 ノード2 Oracle Database Oracle Grid Infrastructure
  36. ソフトウェアのパッケージング Oracle Real Application Clusters 10gから11g Release 1まで Copyright ©

    2023, Oracle and/or its affiliates 42 Oracle Clusterware Clusterware Oracle Database Oracle ASM RAC 11g Release 1まで tnslsnr Oracle Database Oracle tnslsnr シングル・インスタンス構成 • ASMインスタンスはOracleインスタン スを改造したもの • $ORACLE_HOME/bin/oracle • メンバーシップ・サービス • ローカル・コンポーネントの監視と自動再起動
  37. Oracle Grid Infrastructure ソフトウェアのパッケージング Oracle Real Application Clusters 11g Release

    2 以降 Copyright © 2023, Oracle and/or its affiliates 43 ASM Clusterware Oracle Database Oracle Oracle Clusterware Clusterware Oracle Database Oracle ASM RAC 11g Release 1まで RAC 11g Release 2以降 tnslsnr tnslsnr tnslsnr Oracle Database Oracle tnslsnr シングル・インスタンス構成 • ASMインスタンスはOracleインスタン スを改造したもの • $ORACLE_HOME/bin/oracle
  38. Oracle Grid Infrastructure ソフトウェアのパッケージング Oracle Real Application Clusters 11g Release

    2 以降 Copyright © 2023, Oracle and/or its affiliates 44 ASM Clusterware Oracle Database Oracle Oracle Clusterware Clusterware Oracle Database Oracle ASM RAC 11g Release 1まで RAC 11g Release 2以降 tnslsnr tnslsnr tnslsnr Oracle Database Oracle tnslsnr シングル・インスタンス構成 • ASMインスタンスはOracleインスタン スを改造したもの • $ORACLE_HOME/bin/oracle Oracle Clusterwareに以下を同梱 • Oracleリスナー • ASMインスタンス Oracleインスタンスのみ起動
  39. Oracle Real Application Clusters (RAC)のコンポーネント Oracle Clusterwareによって起動・停止が管理される Copyright © 2023,

    Oracle and/or its affiliates 45 Clusterware Clusterware tnslsnr tnslsnr SCANリスナー tnslsnr Oracle インスタンス ASM インスタンス Oracle インスタンス ASM インスタンス Oracleリスナー・プロセス ネットワーク接続リクエストを受ける データベース ストレージ上のファイル群 SCANリスナー・プロセス ネットワーク接続リクエストを受ける Oracleインスタンス DBMS本体 ASMインスタンス クラスタ・ファイルシステム Oracle Clusterware クラスタ・メンバー管理 仮想IPアドレス OracleリスナーのIPアドレス ノード1 ノード2 Oracle Database Oracle Grid Infrastructure
  40. Oracle Grid Infrastructure Oracle Clusterware + Oracle Automatic Storage Management

    • インストールするソフトウェアの名前はOracle Grid Infrastructure • 機能階層としてはOracle ClusterwareとOracle Automatic Storage Management インストールのマニュアル • Grid Infrastructureインストレーションおよびアップグレード・ガイド for platform 機能のマニュアル • Clusterware管理およびデプロイメント・ガイド • Automatic Storage Management管理者ガイド Oracle Grid Infrastructure ASM Clusterware tnslsnr Copyright © 2023, Oracle and/or its affiliates 46
  41. Oracle Databaseサーバーの接続先を指定する記法 「サービス」に接続するという概念 接続記述子(Connect Descriptor) • Oracle Netの全パラメータを指定することが可能な記法 • これをあらかじめ定義して別名をつけておくファイルがtnsnames.ora

    簡易接続(EZCONNECT) • Layer 4以下のプロトコルをTCP/IPに決め打ちし簡略化した記法 • 本番システムの高可用性構成(RACやData Guard)では使用しない 簡易接続プラス(EZCONNECT Plus) 19c以降 • EZCONNECTに接続記述子のパラメータを指定できるように拡張した記法 • 高可用性構成でも使用可能 50 Copyright © 2023, Oracle and/or its affiliates (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = hostname) (PORT = port)) (CONNECT_DATA = (SERVICE_NAME = service) ) ) hostname:port/service tnslsnr service Oracleリスナー hostname:port サービス service hostname:port/service?transport_connect_timeout=30
  42. Oracleクライアントは「サービス」に接続する データベースのワークロードを抽象化した概念 51 Copyright © 2023, Oracle and/or its affiliates

    サービス Oracleインスタンスの名前 • INSTANCE_NAME • SID (ORACLE_SID) データベースの名前 • PDB_NAME • DB_UNIQUE_NAME • DB_NAME PDB1 PDB2 PDB3 service2 service3 Oracleクライアント host:port/service1 service1 データベースのワークロードを抽象化した概念 Oracleインスタンスの名前でもなくデータベースの名前でもない Oracle インスタンス
  43. CDB データベースごとに一意なサービス名を持っている 「サービス」で接続するデータベースを区別する Copyright © 2023, Oracle and/or its affiliates

    52 tnslsnr Oracleクライアント Non-CDB Oracle インスタンス1 Oracle インスタンス2 service1 service2 PDB2 PDB3 service3 host:port/service1 host:port/service2 サービス データベースごとに一意 Oracleリスナー・プロセス 1つのネットワーク・ポートで複数のサービスに対応
  44. 1本の物理コネクションが1つのOracleサーバー・プロセスと直結 専用サーバー(Dedicated Server)接続 - 最も基本的な接続形態 Copyright © 2023, Oracle and/or

    its affiliates 53 tnslsnr oracle LGWR DBWn Oracleクライアント System Global Area (共有メモリー領域) Oracleリスナー・プロセス ネットワーク接続リクエストを受ける (1) Oracleリスナー・プロセスに接続リクエスト着信 (2) 指定されたサービスに該当するOracleインスタンスを照合 (3) Oracleリスナー・プロセスがOracleサーバー・プロセスを fork & fork & exec (4) Oracleリスナー・プロセスが確立した物理コネクションは Oracleサーバー・プロセスが引き継ぐ (1) (3) (4) (2)
  45. プロセスの持つ属性をグループ化してリソース管理 SGAにアタッチしているプロセスはなんらかのサービスに属している Copyright © 2023, Oracle and/or its affiliates 54

    oracle oracle 共有メモリー領域 (System Global Area) LGWR DBWn プロセス ($ORACLE_HOME/bin/oracle) サービス (セッションが持つ属性) service1 SYS$BACKGROUND Oracleサーバー・プロセス バックグラウンド・プロセス
  46. (g)V$SESSIONビューにSERVICE_NAME列がある サービスはセッションの属性 Copyright © 2023, Oracle and/or its affiliates 55

    SQL> select service_name,program from v$session; SERVICE_NAME PROGRAM -------------------- -------------------------------------------------- ... ... SYS$BACKGROUND [email protected] (LCK1) SYS$BACKGROUND [email protected] (RECO) SYS$BACKGROUND [email protected] (MMNL) SYS$BACKGROUND [email protected] (SMCO) SYS$BACKGROUND [email protected] (ARC0) SYS$BACKGROUND [email protected] (M002) SYS$BACKGROUND [email protected] (W004) SYS$USERS [email protected] (TNS V1-V3) SYS$BACKGROUND [email protected] (Q006) SYS$BACKGROUND [email protected] (QM05) SYS$BACKGROUND [email protected] (W00E) ... ...
  47. サービスでリソース制御する例: Oracle Autonomous Database リソース制限が異なる複数のサービスがあらかじめ定義されている Autonomous Databaseインスタンス(1個のプラガブル・データベース)作成時点で、接続サービスが複数定義されている。 • リソース・マネージャのコンシューマ・グループにマッピングされ、 同時実行性や並列処理等を制御

    インスタンス接続時に、接続サービスを選択するだけでリソース制御が可能。 57 Copyright © 2023, Oracle and/or its affiliates 接続サービス platform 概要 パラレル制御 同時実行 セッション数 リソース割り当て (SHARES*2) TPURGENT ATP only 最も優先度の高い処理向け 手動設定 300 x OCPUs 12 TP ATP only 汎用的な処理向け シリアル 300 x OCPUs 8 HIGH ADW/ATP 大量データを扱う処理向け 自動 3 4 MEDIUM ADW/ATP 大量データを扱いつつも、 同時実行数も多い処理向け 自動 1.25 x OCPUs 2 LOW ADW/ATP 優先度が低い処理向け シリアル 300 x OCPUs 1 *1 : 同時に接続できるセッション数はOCPUに比例し、OCPU辺り300セッション *2 : サービス間でのCPU配分の相対的な優先度を示す。デフォルト値からの変更は可能 *3 : 5分以上アイドル状態の続くセッションは自動的に切断される
  48. RACの接続ロード・バランス 物理コネクション確立のロード・バランスは2段階ある (1)接続リクエスト発行 • クライアント側接続ロード・バランス • 接続文字列のLOAD_BALANCE=ONは接続リクエ ストを出す先の負荷分散。 • 複数あるSingle

    Client Access Name(SCAN)リス ナーのどれに接続リクエストを発行するかが決まる。 (2)接続先リダイレクト • サーバー側接続ロード・バランス • SCANリスナーに接続リクエストを発行した場合は接 続リクエストが各ノード固有のOracleリスナーに負荷分 散を考慮してリダイレクトされる。 • Oracleクライアントが実際に接続されるのはリダイレク ト先のノードのOracleインスタンス。 59 Copyright © 2023, Oracle and/or its affiliates tnslsnr Oracle インスタンス Oracle インスタンス tnslsnr ノード 1 ノード 2 service1 service1 tnslsnr SCAN リスナー (1)接続リクエスト発行 Oracleクライアント (2)リダイレクト
  49. 接続リクエストを発行する先を決定する クライアント側ロード・バランス (Client-Side Load Balancing) Copyright © 2023, Oracle and/or

    its affiliates 60 Oracleクライアント tnslsnr scanvip1 tnslsnr tnslsnr scanvip2 scanvip3 接続リクエスト発行 接続先候補を複数記述しておくことができる • 複数のADDRESS句 • 接続試行先の候補はLOAD_BALANCEの設定に従う • FAILOVER=ON (デフォルト)が指定されている場合接続試行先に 失敗したら次の候補を試行する LOAD_BALANCE=ON • その下の階層の候補からランダムに1つを選択する LOAD_BALANCE=OFF (デフォルト) • 最も上から接続試行する (DESCRIPTION = (LOAD_BALANCE=ON) (FAILOVER=ON) (ADDRESS = (PROTOCOL = TCP) (HOST = scanvip1) (PORT = 1521)) (ADDRESS = (PROTOCOL = TCP) (HOST = scanvip2) (PORT = 1521)) (ADDRESS = (PROTOCOL = TCP) (HOST = scanvip3) (PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = service_name) ) )
  50. Single Client Access Name (SCAN) DNSで1つのSCANホスト名と複数のSCAN VIPが対応づけられる 61 Copyright ©

    2023, Oracle and/or its affiliates (DESCRIPTION = (LOAD_BALANCE=ON) (FAILOVER=ON) (ADDRESS = (PROTOCOL = TCP) (HOST = scanvip1) (PORT = 1521)) (ADDRESS = (PROTOCOL = TCP) (HOST = scanvip2) (PORT = 1521)) (ADDRESS = (PROTOCOL = TCP) (HOST = scanvip3) (PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = service_name) ) ) DNSサーバー scanhost scanvip1 scanvip2 scanvip3 • SCANホスト名はDNSで複数のSCAN VIPに対応付けられ、クライアント側 接続ロード・バランスと接続時フェイルオーバーの試行先になる。 等価 (DESCRIPTION = (LOAD_BALANCE=ON) (FAILOVER=ON) (ADDRESS = (PROTOCOL = TCP) (HOST = scanhost) (PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = service_name) ) ) Oracleクライアント tnslsnr scanvip1 tnslsnr tnslsnr scanvip2 scanvip3 接続リクエスト発行
  51. tnslsnr Oracle インスタンス Oracle インスタンス tnslsnr ノード 1 ノード 2

    service1 service1 tnslsnr SCAN リスナー Oracleクライアント (2)リダイレクト Single Client Access Name (SCAN)リスナーはどの サービスをどのOracleインスタンスが担当しているかを認 識している。 サービスがアクティブになっているOracleインスタンスに接 続リクエストをリダイレクトして負荷分散する。 RACの複数ノードに負荷分散 サーバー側接続ロード・バランス (Server-Side Connection Load Balancing) Copyright © 2023, Oracle and/or its affiliates 62 tnslsnr service1 instance1 instance2 service1の 接続先候補 (1)接続リクエスト発行
  52. tnslsnr Oracle インスタンス Oracle インスタンス tnslsnr ノード 1 ノード 2

    service1 service1 tnslsnr SCAN リスナー Oracleクライアント (2)リダイレクト サーバー側接続ロード・バランス (Server-Side Connection Load Balancing) リダイレクト先を決める負荷分散アルゴリズムはサービスの属性 Copyright © 2023, Oracle and/or its affiliates 63 CLB_GOAL (物理コネクション) GOAL (アドバイザリ) LONG - 各インスタンスのセッション数を均等 SHORT SERVICE_TIME SQLコール時間最小化 THROUGHPUT SQLコール数最大化 NONE CPU負荷(アドバイザリなし) (1)接続リクエスト発行 • CLB_GOAL=LONGがデフォルトでセッション数均等化 • CLB_GOAL=SHORTはロード・バランシング・アドバイザに従う • アルゴリズムの指定ができるのは追加したサービスのみ
  53. コネクション・プール Pool Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2

    service1 service1 FAN: ランタイム接続ロード・バランス 負荷分散アルゴリズムはサービスの属性で決定する 都度接続(コネクション・プールしない) 64 Copyright © 2023, Oracle and/or its affiliates Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1 service1 Oracleクライアント アプリケーション・サーバー tnslsnr SCAN リスナー tnslsnr CLB_GOAL=SHORTでアドバイザ に従ってリダイレクト先を選択 • 物理コネクションの接続先は固定 • 論理コネクションの取り出し時に Oracleインスタンスを決定
  54. Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1 service1

    ロード・バランシング・アドバイザ SQL実行性能を観測し最適な負荷配分比率のガイドを生成 Copyright © 2023, Oracle and/or its affiliates 65 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インスタンスへの最適なリクエスト比率を算出
  55. 新規コネクション確立時の接続リクエスト失敗 Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1

    service1 tnslsnr SCAN リスナー Oracleクライアント 接続フェイルオーバー機能 確立済みコネクションの異常切断 67 Copyright © 2023, Oracle and/or its affiliates tnslsnr Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1 service1 tnslsnr SCAN リスナー Oracleクライアント oracle
  56. 新規コネクション確立時の接続リクエスト失敗 接続時フェイルオーバー (Connect-Time Failover: CTF) 68 Copyright © 2023, Oracle

    and/or its affiliates Oracleクライアント tnslsnr scanvip1 tnslsnr tnslsnr scanvip2 scanvip3 接続リクエスト発行 接続先候補を複数記述しておくことができる • 複数のADDRESS句 • 接続試行先の候補はLOAD_BALANCEの設定に従う • FAILOVER=ON (デフォルト)が指定されている場合接続試行先に 失敗したら次の候補を試行する LOAD_BALANCE=ON • その下の階層の候補からランダムに1つを選択する LOAD_BALANCE=OFF (デフォルト) • 最も上から接続試行する (DESCRIPTION = (LOAD_BALANCE=ON) (FAILOVER=ON) (ADDRESS = (PROTOCOL = TCP) (HOST = scanvip1) (PORT = 1521)) (ADDRESS = (PROTOCOL = TCP) (HOST = scanvip2) (PORT = 1521)) (ADDRESS = (PROTOCOL = TCP) (HOST = scanvip3) (PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = service_name) ) )
  57. SCANホスト名の指定は複数の接続先候補があると解釈される DNSで1つのSCANホスト名と複数のSCAN VIPが対応づけられる 69 Copyright © 2023, Oracle and/or its

    affiliates (DESCRIPTION = (LOAD_BALANCE=ON) (FAILOVER=ON) (ADDRESS = (PROTOCOL = TCP) (HOST = scanvip1) (PORT = 1521)) (ADDRESS = (PROTOCOL = TCP) (HOST = scanvip2) (PORT = 1521)) (ADDRESS = (PROTOCOL = TCP) (HOST = scanvip3) (PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = service_name) ) ) DNSサーバー scanhost scanvip1 scanvip2 scanvip3 • SCANホスト名はDNSで複数のSCAN VIPに対応付けられ、クライアント側 接続ロード・バランスと接続時フェイルオーバーの試行先になる。 • EZCONNECT記法 scanhostname:port/serviceは LOAD_BALANCE=OFFかつFAILOVER=ONと解釈される 等価 (DESCRIPTION = (LOAD_BALANCE=ON) (FAILOVER=ON) (ADDRESS = (PROTOCOL = TCP) (HOST = scanhost) (PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = service_name) ) ) Oracleクライアント tnslsnr scanvip1 tnslsnr tnslsnr scanvip2 scanvip3 接続リクエスト発行
  58. 確立済みコネクションの異常切断 (透過的)アプリケーション・コンティニュイティ / (Transparent) Application Continuity Copyright © 2023, Oracle

    and/or its affiliates 70 Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1 service1 tnslsnr SCAN リスナー Oracleクライアント oracle 1. 自動再接続 2. トランザクション状態の確認 3. トランザクション自動再実行 サービスの設定 srvctl modify service ... -failovertype TRANSACTION | AUTO 対応クライアント • JDBCリプレイ・ドライバ (+UCP) • OCI Session Pool • ODP.NET Unmanaged Driver ※これらのコネクション・プールはFAN対応クライアントでもある
  59. データベース・サービスの起動/停止に連動させてデータベース・クライアントからのコネクションを積極的に制御する Fast Application Notification / 高速アプリケーション通知 • データベース・サーバー側でサービスの起動/停止をイベントとして通知 • 非計画停止時の物理コネクションの速やかなクリーンアップ

    • サービス起動と物理コネクション生成の連動 • 計画停止(ローリング・パッチ適用)時の安全なコネクションの切断 (Transparent) Application Continuity / (透過的) アプリケーション・コンティニュイティ • 物理コネクションの異常切断時に自動再接続と安全なトランザクションの自動再実行 データベース・コネクションの制御 Copyright © 2023, Oracle and/or its affiliates 72
  60. Fast Application Notification (FAN) と Transparent Application Continuity (TAC) データベース・コネクションを積極的に制御する

    Copyright © 2023, Oracle and/or its affiliates 73 Fast Application Notification コネクション・プールが物理コネクションを制御する • 非計画停止 - コネクション・プールから該当物理コネク ションを即時破棄 • 計画停止 - Oracleインスタンスshutdown前に物理 コネクションをアプリケーションから返却されたら切断す る • サービス起動 - 物理コネクションのリバランス Transparent Application Continuity 接続ドライバによる自動再実行 • 非計画停止 - 物理コネクションが異常切断されたら 自動再接続して自動再実行 Connection Pool ノード 1 ノード 2 アプリケーション・サーバー Clusterware Clusterware FANイベント service service TAC 切断検出したら自動再実行 FAN DOWN/UP/負荷配分通知
  61. Copyright © 2023, Oracle and/or its affiliates 74 Fast Application

    Notification 高速アプリケーション通知 データベース・サーバー側からのイベント通知
  62. Copyright © 2023, Oracle and/or its affiliates 75 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インスタンスを制御 • 物理コネクションのリバランス Connection Pool ノード 1 ノード 2 アプリケーション・サーバー Clusterware Clusterware FANイベント FANイベント service service
  63. 新規コネクション確立時の接続リクエスト失敗 Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1

    service1 tnslsnr SCAN リスナー Oracleクライアント 接続フェイルオーバー機能 (再掲) 確立済みコネクションの異常切断 76 Copyright © 2023, Oracle and/or its affiliates tnslsnr Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1 service1 tnslsnr SCAN リスナー Oracleクライアント oracle
  64. 新規コネクション確立時の接続リクエスト失敗 Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1

    service1 tnslsnr SCAN リスナー Oracleクライアント 接続フェイルオーバー機能 (再掲) 確立済みコネクションの異常切断 77 Copyright © 2023, Oracle and/or its affiliates tnslsnr Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1 service1 tnslsnr SCAN リスナー Oracleクライアント oracle 暗黙の前提 異常を検出したら、異常に対処する機能が発動する
  65. 異常を検出したら、異常に対処する機能が発動する Copyright © 2023, Oracle and/or its affiliates 78 異常を検出

    異常に対処 • 接続時フェイルオーバー • アプリケーション・コンティニュイティ
  66. 異常を検出したら、異常に対処する機能が発動する Copyright © 2023, Oracle and/or its affiliates 79 異常を検出

    異常に対処 • 接続時フェイルオーバー • アプリケーション・コンティニュイティ データベース・クライアント データベース・サーバー ネットワーク越しの異常検出 • プロセス障害(OS正常) → OSがTCP FIN/RSTで即時応答可能 • OS停止 → TCPレベルで応答がない → タイムアウトを待つ
  67. Copyright © 2023, Oracle and/or its affiliates 80 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) 異常終了
  68. Copyright © 2023, Oracle and/or its affiliates 81 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インスタンスへの物理コ ネクションの本数の割合が期待するものになるとは限ら ない
  69. Copyright © 2023, Oracle and/or its affiliates 82 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) サービス起動 (4) プールの中のフリーの コネクションを切断し 再作成 (3) 物理コネクション作成 service1 FAN RCLBイベント (3) 定期的なRCLBイベント Pool Pool
  70. 一時的にパッチ状態が異なるOracleバイナリでRACを稼働させることが可能 RACはローリング・パッチ適用可能 - 全体としてはデータベース・アクセスを維持 Copyright © 2023, Oracle and/or its

    affiliates 84 RU 19.17 RU 19.17 RU 19.17 ノード 1 ノード 2 ノード 3 RU: Release Update 3か月ごとに提供される集積パッチ shutdown (1) ノード1にパッチを適用するためプロセス停止 他のノードがデータベース・アクセスを維持 RU 19.18 RU 19.17 RU 19.17 ノード 1 ノード 2 ノード 3 (2) ノード1にパッチを適用したバイナリでプロセス起動 一時的にパッチ状態が異なるバイナリで稼働可能 startup
  71. Copyright © 2023, Oracle and/or its affiliates 85 コマンドでサービス停止が発生する場合プールに論理コネクションが返却されてから物理コネクションを切断 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クライアント (6) インスタンス1との物理 コネクションはアプリケー ションがプールに返却し たら切断 (1) サービス起動 (4) DOWN通知 (5) 新規の物理コネク ションはインスタンス 2に接続される (3) サービス停止
  72. Copyright © 2023, Oracle and/or its affiliates 86 (Transparent) Application

    Continuity (透過的)アプリケーション・コンティニュイティ 切断検出したら更新トランザクションを自動再実行
  73. Copyright © 2023, Oracle and/or its affiliates 87 物理コネクションが異常切断されても更新トランザクションを安全に自動再実行 アプリケーション・コンティニュイティ対応接続ドライバは

    Oracleサーバーに発行した処理を記憶している。 Oracle接続ドライバがセッション切断を検出すると (1) 再接続 (2) トランザクション状態の確認 (3) トランザクション再実行 まで自動で行う。 アプリケーションから見るとエラーを検出せずにトランザ クションが完了する。 Oracle製コネクション・プールからコネクションを取り出 してCOMMITしたら返却するコードならコード改修は (ほぼ)不要。 (Transparent) Application Continuity (透過的)アプリケーション・コンティニュイティ (1) 再接続 (2) 状態確認 (3) 再実行 Oracleクライアント RAC SELECT INSERT UPDATE COMMIT
  74. 異常を検出する機能と検出した異常に対処する機能 JavaアプリケーションサーバーではFANイベントを解釈するのはUCPであるが、UCPを使用できない環境でも (Transparent) Application Continuityは使用可能。 FANとAC/TACは組み合わせると都合の良い機能であって、使用すること自体はそれぞれ独立している。 FANのFCFとAC/TACは独立した別の機能 Copyright © 2023,

    Oracle and/or its affiliates 88 発生した異常を検出 検出した異常に対処 Pool • (Transparent) Application Continuityは 切断されたことを検出すると自動再接続&自 動再実行する機能 • 切断検出のきっかけは何でもよい • Fast Connection Failover (FCF)はOracle サーバー障害時に異常が発生したことを明示 的に通知する機能 • TCPレベルで応答がないケースでもコネクショ ン・プールから障害ノードとのコネクションを削除
  75. Copyright © 2023, Oracle and/or its affiliates 89 アプリケーションはエラーになる 更新トランザクションの途中で異常終了するとROLLBACKされる

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

    アプリケーション・コンティニュイティ アプリケーション 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接続ドライバは 何を発行したかを記憶し ているので自動再実行 Oracleクライアント Oracleサーバー
  77. 更新トランザクションの再実行にまつわる問題 • アプリケーションがCOMMITを発行したけれども、オンラ インREDOログ・ファイルへのCOMMIT書き込み完了 がOracleクライアントに通知される前にサーバー側の 障害が発生することがあり得る。 • Oracleクライアントから見るとトランザクションが完了す る前にエラーになる。 •

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

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

    SEQUENCE.NEXTVAL (一意な数値) 再実行時に使用されるのは元の値 再実行時に値が変化するとORA-41412のエラー 再実行前の値が保存される設定が必要 KEEP属性の指定 可変オブジェクト(Mutable Object) Copyright © 2023, Oracle and/or its affiliates 95 INSERT INTO tbl1 VALUES(SYSDATE); 障害検出 ACで自動再実行 時間 時刻t0 時刻t1 COMMIT; INSERTされるのはt0 or t1 ? ⇒ 元の時刻t0 INSERT INTO tbl1 VALUES(SYSDATE);
  80. Copyright © 2023, Oracle and/or its affiliates 96 再実行前の値が保持されるのでトランザクションとして矛盾しない 可変オブジェクトの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実行 同じ値
  81. リクエスト境界の概念 アプリケーション・コンティニュイティが想定するコード: 1. Oracle製コネクション・プールからコネクション取得 • Javaでは場合分けが発生(後述) 2. SQL発行 3. 最後に1回だけCOMMIT

    4. コネクション・プールに返却 一般的なオンライン・トランザクション処理ならばこうなって いるはず。 コネクション・プールからコネクションを取得し、返却するま でをリクエスト境界と呼ぶ。 アプリケーション・コンティニュイティが再実行するのはリクエ スト境界の先頭から。 アプリケーション・コンティニュイティが想定するアプリケーション・コード Copyright © 2023, Oracle and/or its affiliates 97 ConnectionPool ConnectionPool getConnection() close() SQL 1 SQL n COMMIT リクエスト境界
  82. Copyright © 2023, Oracle and/or its affiliates 98 コネクション・プール機能はどの階層の持ち物か 言語によって事情が異なる

    Application Server Pool Application Server Pool Javaアプリケーション・サーバー • JDBC thinドライバ Java以外のアプリケーション・サーバー • OCI Session Pool • ODP.NET Unmanaged Driver • コネクション・プール機能はアプリケーション・サーバーの役割。 • UCPが使用できるかで場合分けが発生。 • コネクション・プール機能はOracle接続ドライバと一体。 • リクエスト境界のAPI挿入無しでACが使用可能。
  83. Copyright © 2023, Oracle and/or its affiliates 99 コネクション・プールだけのjarファイルを提供 Oracle

    Universal Connection Pool (UCP) JDBCドライバのjarファイルとは独立したコネクション・プールだけのucp.jarファイルを提供。 Oracle JDBCドライバのダウンロード・ページから取得可能。
  84. WebLogic Server 12.1.2以降でアプリケーション・コンティ ニュイティに対応。 Generic Data Souce • AC対応 •

    FAN未対応 Active GridLink Data Source • 内部的にUCPを使用しているのでAC/FAN対応 • WebLogic Suiteのライセンスが必要 UCP Data Source (WLS 12.2.1~) • AC/FAN対応 • WLSの一部の機能がインテグレートされていない Oracle WebLogic Server Copyright © 2023, Oracle and/or its affiliates 100 Application Server Pool Generic Data Source Active GridLink Data Source UCP Data Source ACは接続ドライバの機能 (プールも関係する) Javaアプリケーション・サーバーではコネクション・プール 機能はアプリケーション・サーバーの役割
  85. アプリケーション・サーバーの機能の一部を入れ替えることは基本的に想定されていない 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を使用す ることを想定していない。 自己責任で使用するTomcatにUCPを組み込むのは可 能。 サード・パーティ製Javaアプリケーション・サーバーとUCP Copyright © 2023, Oracle and/or its affiliates 101 Application Server Pool コネクション・プールにUCPを使用 することが可能か(FAN対応) ACは接続ドライバの機能 (プールも関係する) Javaアプリケーション・サーバーではコネクション・プール 機能はアプリケーション・サーバーの役割
  86. 救えるケース • コネクション・プールを使用した(オンライン・トランザクション処理系)アプリケーション 1. コネクション・プールから論理コネクションを取得 2. 最後に1回COMMIT 3. コネクション・プールに論理コネクションを返却 救えないケース

    • 分散トランザクション • データベース・リンクも分散トランザクション • コネクション・プールを使用せずに直結している(バッチ処理系)アプリケーション • リプレイ境界内で複数回COMMITを発行する • 非トランザクション系ツール • RMAN/Data Pump/SQL*Loader ... ACで非計画停止からコネクションを救えるデータベース・クライアント Copyright © 2023, Oracle and/or its affiliates 102
  87. Relational DatabaseとSQLのコンセプト • データ操作の抽象化 • Converged Database Real Application Clustersアーキテクチャ

    • Shared Everything Oracle Databaseのネットワーク接続 • データベース・サービスという抽象概念が物理構成を隠蔽 データベース・コネクションの制御 • Fast Application Notification / 高速アプリケーション通知 • (Transparent) Application Continuity / (透過的)アプリケーション・コンティニュイティ Oracle Database高可用性アーキテクチャ - コンピュート・ノードの可用性 Copyright © 2023, Oracle and/or its affiliates 103