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

Oracle Database Oracle Net Services

Oracle Database Oracle Net Services

2022年1月27日開催
Oracle Database Technology Night #52 Oracle Databaseのネットワーク接続

データベースサーバーは高可用性の検討が不可欠です。その手段にクラスタやレプリケーションがありますが、サーバーに障害が発生したらクライアントのネットワーク接続の切り替えが必要です。
Oracle Databaseはネットワーク接続の異常系に対処する機能を備えており、アプリケーションのコード修正の必要なく接続を切り替えることができます。
今回はOracleクライアントがOracleサーバーにネットワーク接続する仕組みを扱います。
OracleリスナーとOracleインスタンスの関係からRACの負荷分散接続、TCP/IPの異常系の挙動とその対処の仕組みを解説します。

oracle4engineer

January 27, 2022
Tweet

More Decks by oracle4engineer

Other Decks in Technology

Transcript

  1. Oracle Databaseのネットワーク接続 前半: 1台のサーバー内 後半: Oracle Real Application Clusters 3

    Copyright © 2022, Oracle and/or its affiliates tnslsnr Oracle インスタンス host:port/service1 service1 データベース・クライアント service1 • 負荷分散 • 接続フェイルオーバー データベース・クライアント • サービスとは? • Oracleリスナー • Oracleインスタンス
  2. Copyright © 2022, Oracle and/or its affiliates 5 Oracle Net

    Services Oracle Databaseのネットワーク・コンポーネントの総称
  3. Oracle Databaseのネットワーク接続に関係するコンポーネントの総称 Oracle Databaseのネットワーク接続に関わるOracle NetプロトコルやOracleリスナー・プロセスなどのコンポーネ ントの総称をOracle Net Servicesという。 OracleクライアントからOracleサーバーへの接続だけでな く、

    Oracleサーバー同士を接続するDatabase Linkや Data GuardなどもOracle Net Servicesの役割。 Oracle Net Services Copyright © 2022, Oracle and/or its affiliates 6 tnslsnr Oracleクライアント Oracle Net Services Database Link Data Guard Oracleインスタンス • 共有メモリー • バックグラウンド・プロセス Oracleリスナー・プロセス • 接続リクエスト受信 データベース • ファイルの集合
  4. 各種言語用のOracle接続ドライバ メジャーなほとんどの言語にOracle接続ドライバがある ほとんどの言語にOracle接続ドライバがある • Oracle Proprietary Drivers • Oracle Open

    Source Drivers • Third Party Open Source Drivers • 多くの言語用ドライバはC言語用のOracle Call Interface (OCI)の上に実装されている Oracleプリコンパイラ 各言語のソース・コードにSQLを埋め込むとOracleにアク セスするOCIのAPIに変換したコードを出力するコンパイラ • Pro*C • Pro*COBOL 7 Copyright © 2022, Oracle and/or its affiliates 言語 API C OCI, ODBC, ODPI-C C++ OCCI Java JDBC .NET ODP.NET Node.js node-oracledb Python cx_Oracle PHP OCI8, PDO_OCI R ROracle Erlang erloci Perl DBD::Oracle Ruby ruby-oci8 Rust rust-oracle Go goracle, go-oci8 Julia Oracle.ji
  5. Oracle Call Interfaceをベースとする接続ドライバ Copyright © 2022, Oracle and/or its affiliates

    Third Party Open Source Drivers Oracle Open Source Drivers Oracle Call Interface (OCI) Typically from Oracle Instant Client ZIPs or RPMs ODPI-C Also used by custom apps Python cx_Oracle Node.js node-oracledb Go godror Julia Oracle.jl Rust rust- oracle PHP OCI8 PHP PDO_OCI R ROracle Go go-oci8 Erlang oranif Perl DBD:: Oracle Ruby ruby- oci8 Oracle Call Interface, Oracle C++ Call Interface, ODBC, JDBC, ODP.NET, Pro*C, Pro*COBOL, SQLJ, OLE DB, OLE DB for OLAP Oracle Proprietary Drivers
  6. Copyright © 2022, Oracle and/or its affiliates 9 Oracle Net

    Servicesはクライアントとサーバーのプラットフォームの組み合わせを選ばない マルチ・プラットフォーム Windows x64 Linux x86-64 Solaris SPARC Solaris x86 HP-UX AIX zLinux Windows x64 Linux x86-64 Solaris SPARC Solaris x86 HP-UX AIX zLinux Oracleクライアント Oracleサーバー Oracle Net
  7. 接続できるバージョンの組み合わせ クライアントとサーバーのバージョンが離れすぎるとサポートされない • My Oracle Support Doc ID 207303.1 (Client

    / Server Interoperability Support Matrix for Different Oracle Versions)に接続可能なクライアントとサーバーのバージョンの組み合わせが記載されている • Oracle7.3.4から最新リリースまでのすべての組み合わせが参照できる • バージョンが離れすぎると接続できなくなる 10 Copyright © 2022, Oracle and/or its affiliates クライアント サーバー 21c 19c 18c 12.2.0 12.1.0 11.2.0 21c Yes Yes Yes Yes Yes No 19c Yes Yes Yes Yes Yes Yes※ 18c Yes Yes Yes Yes Yes Yes※ 12.2.0 Yes Yes Yes Yes Yes Yes※ 12.1.0 Yes Yes Yes Yes Yes Yes 11.2.0 No Yes※ Yes※ Yes※ Yes Yes ※ Patch Set Release 11.2.0.3 もしくは11.2.0.4のみ Supported Extend Support Market Driven Support
  8. Oracle Databaseサーバーの接続先を指定する記法 「サービス」に接続するという概念 接続記述子(Connect Descriptor) • Oracle Netの全パラメータを指定することが可能な記法 • これをあらかじめ定義して別名をつけておくファイルがtnsnames.ora

    簡易接続(EZCONNECT) • Layer 4以下のプロトコルをTCP/IPに決め打ちし簡略化した記法 • 本番システムの高可用性構成(RACやData Guard)では使用しない 簡易接続プラス(EZCONNECT Plus) 19c以降 • EZCONNECTに接続記述子のパラメータを指定できるように拡張した記法 • 高可用性構成でも使用可能 12 Copyright © 2022, 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
  9. Oracleクライアントは「サービス」に接続する データベースのワークロードを抽象化した概念 13 Copyright © 2022, 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 インスタンス
  10. CDB 「サービス」で接続するデータベースを区別する データベースごとに一意なサービス名を持っている 14 Copyright © 2022, Oracle and/or its

    affiliates tnslsnr Oracleクライアント Non-CDB Oracle インスタンス1 Oracle インスタンス2 service1 service2 PDB2 PDB3 service3 host:port/service1 host:port/service2 サービス データベースごとに一意 Oracleリスナー・プロセス 1つのネットワーク・ポートで複数のサービスに対応
  11. ネットワーク接続リクエストを受けるOracleリスナー・プロセスと実行エンジンのOracleインスタンスが独立 Oracle Databaseアーキテクチャ Copyright © 2022, Oracle and/or its affiliates

    15 tnslsnr oracle oracle LGWR DBWn Oracleクライアント System Global Area (共有メモリー領域) Oracleリスナー・プロセス ネットワーク接続リクエストを受ける Oracleサーバー・プロセス SQL処理の主体 System Global Area 共有メモリー領域 バックグラウンド・プロセス 内部処理 データベース ストレージ上のファイル群 Oracleインスタンス
  12. 1本の物理コネクションが1つのOracleサーバー・プロセスと直結 専用サーバー(Dedicated Server)接続 - 最も基本的な接続形態 Copyright © 2022, Oracle and/or

    its affiliates 16 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)
  13. Oracleインスタンス側の設定で使用するOracleリスナーを指定する 動的サービス登録 Copyright © 2022, Oracle and/or its affiliates 18

    CDB2 tnslsnr データベース Oracle インスタンス LREG 初期化パラメータ listener.ora Oracleリスナーの設定はリスニングするアドレスの情報のみ Oracleインスタンスのパラメータ LREG(Lister REGistration) プロセスがサービス情報を登録 LISTENER_name = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)) (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = port)) ) ) LOCAL_LISTENER = (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = port)) ※ 直接ADDRESS句を記述するのではなくtnsnames.oraファイルにエイリアスを定義してもよい
  14. Oracleリスナー・プロセスが認識しているサービス: ノード・リスナー lsnrctl servicesコマンド • 1つのOracleリスナー・プロセスに複数のサービスが登録されている • サービス → インスタンス

    → ハンドラ の階層構造 • ハンドラとは接続形態(専用サーバー接続など)によって異なるプロセスの種類 19 Copyright © 2022, Oracle and/or its affiliates $ lsnrctl services [リスナー名] (中略) サービス"pdb19a.jp.oracle.com"には、1件のインスタンスがあります。 インスタンス"rac19a2"、状態READYには、このサービスに対する1件のハンドラがあります... ハンドラ: "DEDICATED" 確立:0 拒否:0 状態:ready LOCAL SERVER サービス"pdb19asvcrel.jp.oracle.com"には、1件のインスタンスがあります。 インスタンス"rac19a2"、状態READYには、このサービスに対する1件のハンドラがあります... ハンドラ: "DEDICATED" 確立:0 拒否:0 状態:ready LOCAL SERVER tnslsnr service instance handler service instance handler
  15. データ・ディクショナリに登録されている Oracleインスタンスが持っているサービス Copyright © 2022, Oracle and/or its affiliates 20

    SQL> select con_id,name,NETWORK_NAME from v$active_services 2 order by con_id; CON_ID NAME NETWORK_NAME ---------- -------------------- -------------------- 1 rac19aXDB rac19aXDB 1 rac19a.jp.oracle.com rac19a.jp.oracle.com 1 SYS$USERS 1 SYS$BACKGROUND 3 svcpdb19a svcpdb19a 3 svcpdb19atac svcpdb19atac 3 pdb19a pdb19a SQL> select con_id,name,NETWORK_NAME from v$active_services 2 order by con_id; CON_ID NAME NETWORK_NAME ---------- -------------------- -------------------- 3 pdb19a pdb19a 3 svcpdb19a svcpdb19a 3 svcpdb19atac svcpdb19atac ルート・コンテナに接続すると 全サービスが見える PDBに接続するとそのPDB のサービスのみが見える
  16. Oracle Netの名前空間のドメイン名DB_DOMAINで修飾される Oracleリスナーに登録されるサービス名 Copyright © 2022, Oracle and/or its affiliates

    21 SQL> select con_id,name,NETWORK_NAME from v$active_services 2 order by con_id; CON_ID NAME NETWORK_NAME ---------- -------------------- -------------------- 1 rac19aXDB rac19aXDB 1 rac19a.jp.oracle.com rac19a.jp.oracle.com 1 SYS$USERS 1 SYS$BACKGROUND 3 svcpdb19a svcpdb19a 3 svcpdb19atac svcpdb19atac 3 pdb19a pdb19a ルート・コンテナに接続すると 全サービスが見える データ・ディクショナリのサービス名にOracleインスタンスの 初期化パラメータDB_DOMAINで修飾したものが Oracleリスナーに登録されるサービス名 tnslsnr データ・ディクショナリ DB_DOMAIN =jp.oracle.com svcpdb19a.jp.oracle.com svcpdb19a
  17. 接続に関する典型的なエラー ORA-12514 Copyright © 2022, Oracle and/or its affiliates 22

    tnslsnr データ・ディクショナリ DB_DOMAIN =jp.oracle.com svcpdb19a.jp.oracle.com svcpdb19a sqlplus $ sqlplus user/password@host:port/svcpdb19a ORA-12514:リスナーは接続記述子でリクエストされたサービスを現在認識していません 接続リクエストはOracleリスナーに届いたが、指定されたサービス名と合致するものがない 接続で指定しなければらなないのはOracle Net上の名前
  18. Oracleリスナーに登録されるデフォルト・サービス名 サービス名のデフォルト値は(プラガブル)データベース名を継承する Copyright © 2022, Oracle and/or its affiliates 23

    DB_NAME DB_UNIQUE_NAME SERVICE_NAMES DB_DOMAIN • CREATE DATABASE で指定する名前 • データベースを構成するファイルが持つ名前 • 管理操作上指定するデータベース名 • ディレクトリ名やコマンドでの指定 • サービス名のデフォルト値 • アプリケーションからの接続には使用しない PDB_NAME tnslsnr プラガブル・データベース ルート・コンテナ (またはNon-CDB構成) デフォルト値は継承 デフォルト値は継承 CREATE DATABASEの名前 CREATE PLUGGABLE DATABASEの名前
  19. データベース名の階層 DB_NAMEとDB_UNIQUE_NAME Copyright © 2022, Oracle and/or its affiliates 24

    REDOログ リカバリ REDOログ リカバリ 更新 プライマリ・データベース スタンバイ・データベース スタンバイ・データベース DB_UNIQUE_NAME=A1 DB_UNIQUE_NAME=A2 DB_UNIQUE_NAME=A3 Data Guardフィジカル・スタンバイの全データベースはデータ・ブロック内の構造まで全く同じになる。 DB_NAME=A 管理操作上 区別する名前は一意 データベースのファイル群 が持っている名前は共通 DB_NAME=A DB_NAME=A DB_UNIQUE_NAME DB_NAME
  20. 特殊なサービスがある Oracleリスナーに登録されないサービス Copyright © 2022, Oracle and/or its affiliates 26

    SQL> select con_id,name,NETWORK_NAME from v$active_services 2 order by con_id; CON_ID NAME NETWORK_NAME ---------- -------------------- -------------------- 1 rac19aXDB rac19aXDB 1 rac19a.jp.oracle.com rac19a.jp.oracle.com 1 SYS$USERS 1 SYS$BACKGROUND 3 svcpdb19a svcpdb19a 3 svcpdb19atac svcpdb19atac 3 pdb19a pdb19a ルート・コンテナに接続すると 全サービスが見える SYS$USERS サービス名を指定せずに接続したセッションが属するサービス 例 $ sqlplus / as sysdba SYS$BACKGROUND Oracleインスタンスのバックグラウンド・プロセスが属するサービス
  21. プロセスの持つ属性をグループ化してリソース管理 SGAにアタッチしているプロセスはなんらかのサービスに属している Copyright © 2022, Oracle and/or its affiliates 27

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

    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) ... ...
  23. サービスでリソース制御する例: Oracle Autonomous Database リソース制限が異なる複数のサービスがあらかじめ定義されている Autonomous Databaseインスタンス(1個のプラガブル・データベース)作成時点で、接続サービスが複数定義されている。 • リソース・マネージャのコンシューマ・グループにマッピングされ、 同時実行性や並列処理等を制御

    インスタンス接続時に、接続サービスを選択するだけでリソース制御が可能。 30 Copyright © 2022, 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分以上アイドル状態の続くセッションは自動的に切断される
  24. デフォルト・サービスをアプリケーションからの接続には使用しない アプリケーションからの接続には追加のサービスを作成する マニュアル: Oracle Database 19c Multitenant管理者ガイド https://docs.oracle.com/cd/F19136_01/multi/administering-pdbs-with-sql-plus.html#GUID-5A2471BC- 8501-4E38-BD28-7EE182F3B3A7 32

    Copyright © 2022, Oracle and/or its affiliates 15.2.2.1.2 デフォルトおよびユーザー定義のサービス PDBを作成すると、PDBの新しいデフォルト・サービスが自動的に作成されます。 各データベース・サービス名は、1つのCDB内で一意である必要があり、特定のリスナーからアクセスされるインスタンスを持 つすべてのCDBのスコープ内で一意である必要があります。デフォルト・サービスの名前はPDBと同じになります。このサー ビスは、ユーザーが管理できず、管理タスクにのみ使用する必要があります。 アプリケーションには常にユーザー定義のサービスを使用します。これは、ユーザー定義のサービスはアプリケーションの要件 に適合するようにカスタマイズできるためです。デフォルトのPDBサービスをアプリケーションに使用しないことをお薦めします。
  25. Oracleインスタンスとデータベースの状態遷移 Copyright © 2022, Oracle and/or its affiliates 33 Oracle

    インスタンス Oracle インスタンス SHUTDOWN - NOMOUNT - 1. pfile/spfileを読んで SGA確保とプロセス起動 2. CONTROL_FILESで制 御ファイルの位置を認識 制御ファイル 初期化パラメータ CDB PDB
  26. Oracleインスタンスとデータベースの状態遷移 Copyright © 2022, Oracle and/or its affiliates 34 Oracle

    インスタンス Oracle インスタンス SHUTDOWN - NOMOUNT - MOUNT - Oracle インスタンス 1. pfile/spfileを読んで SGA確保とプロセス起動 2. CONTROL_FILESで制 御ファイルの位置を認識 制御ファイル 3. 制御ファイルをオープン 4. オンラインREDOログ・ファ イルとデータファイルの位置 を認識 REDOログ・ファイル データファイル 初期化パラメータ CDB PDB
  27. Oracleインスタンスとデータベースの状態遷移 Copyright © 2022, Oracle and/or its affiliates 35 Oracle

    インスタンス Oracle インスタンス SHUTDOWN - NOMOUNT - MOUNT - OPEN MOUNT Oracle インスタンス Oracle インスタンス 1. pfile/spfileを読んで SGA確保とプロセス起動 2. CONTROL_FILESで制 御ファイルの位置を認識 制御ファイル 3. 制御ファイルをオープン 4. オンラインREDOログ・ファ イルとデータファイルの位置 を認識 REDOログ・ファイル 5. オンラインREDOログ・ファ イルとデータファイルをオー プン 6. PDBはMOUNT状態 データファイル 初期化パラメータ CDB PDB
  28. Oracleインスタンスとデータベースの状態遷移 Copyright © 2022, Oracle and/or its affiliates 36 Oracle

    インスタンス Oracle インスタンス SHUTDOWN - NOMOUNT - MOUNT - OPEN MOUNT Oracle インスタンス Oracle インスタンス 1. pfile/spfileを読んで SGA確保とプロセス起動 2. CONTROL_FILESで制 御ファイルの位置を認識 制御ファイル 3. 制御ファイルをオープン 4. オンラインREDOログ・ファ イルとデータファイルの位置 を認識 REDOログ・ファイル 5. オンラインREDOログ・ファ イルとデータファイルをオー プン 6. PDBはMOUNT状態 データファイル OPEN OPEN Oracle インスタンス 7. PDBをオープン プラガブル・データベース 初期化パラメータ CDB PDB
  29. Oracleインスタンスとデータベースの状態遷移 Copyright © 2022, Oracle and/or its affiliates 37 Oracle

    インスタンス Oracle インスタンス SHUTDOWN - NOMOUNT - MOUNT - OPEN MOUNT OPEN OPEN Oracle インスタンス Oracle インスタンス Oracle インスタンス 1. pfile/spfileを読んで SGA確保とプロセス起動 2. CONTROL_FILESで制 御ファイルの位置を認識 制御ファイル 3. 制御ファイルをオープン 4. オンラインREDOログ・ファ イルとデータファイルの位置 を認識 データ・ディクショナリ REDOログ・ファイル 5. オンラインREDOログ・ファ イルとデータファイルをオー プン 6. PDBはMOUNT状態 8. データ・ディクショナリに登 録された追加のサービスを 起動 データファイル OPEN OPEN Oracle インスタンス 7. PDBをオープン プラガブル・データベース 初期化パラメータ CDB PDB
  30. 各サービス名が最初にOracleリスナーに登録されるタイミング デフォルト・サービス名が登録されるのはMOUNT状態 Copyright © 2022, Oracle and/or its affiliates 38

    Oracle インスタンス Oracle インスタンス SHUTDOWN - NOMOUNT - MOUNT - OPEN MOUNT OPEN OPEN Oracle インスタンス Oracle インスタンス Oracle インスタンス 1. pfile/spfileを読んで SGA確保とプロセス起動 2. CONTROL_FILESで制 御ファイルの位置を認識 CDBデフォルト・サービス名 制御ファイル 3. 制御ファイルをオープン 4. オンラインREDOログ・ファ イルとデータファイルの位置 を認識 データ・ディクショナリ REDOログ・ファイル 5. オンラインREDOログ・ファ イルとデータファイルをオー プン 6. PDBはMOUNT状態 8. データ・ディクショナリに登 録された追加のサービスを 起動 データファイル OPEN OPEN Oracle インスタンス 7. PDBをオープン プラガブル・データベース tnslsnr SERVICE_NAMES PDB_NAME service PDBデフォルト・サービス名 追加したサービス 初期化パラメータ CDB PDB
  31. Oracleリスナー経由でMOUNT状態のデータベースに接続する SYSユーザーのパスワード・ファイルはデータベースの外側にある 通常ユーザーで接続試行 通常ユーザーの認証情報はSYSTEM表領域に格納され ているのでOPEN状態でないと接続不可 SYSユーザーで接続試行 SYSユーザーの認証情報はパスワード・ファイルに格納さ れておりOPEN以外の状態でも接続可能 39 Copyright

    © 2022, Oracle and/or its affiliates $ sqlplus user/password@tnsalias SQL*Plus: Release 21.0.0.0.0 - Production on 月 1月 24 21:35:45 2022 Version 21.3.0.0.0 Copyright (c) 1982, 2021, Oracle. All rights reserved. ERROR: ORA-01109: データベースがオープンされていません。 ユーザー名を入力してください: $ sqlplus sys/password@tnsalias as sysdba SQL*Plus: Release 21.0.0.0.0 - Production on 月 1月 24 21:36:51 2022 Version 21.3.0.0.0 Copyright (c) 1982, 2021, Oracle. All rights reserved. Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Version 21.3.0.0.0 に接続されました。 SQL>
  32. Oracleリスナー経由でMOUNT状態のデータベースに接続する MOUNT状態でのネットワーク接続が必要な場合がある Recovery Manager (RMAN) RMANで一貫性バックアップを取得 Data Guardフィジカル・スタンバイ REDOログの転送先はデフォルト・サービス名 40

    Copyright © 2022, Oracle and/or its affiliates CDB2 tnslsnr データベース Oracle インスタンス rman $ rman target sys/password@tnsalias プライマリ・データベース スタンバイ・データベース MOUNT MOUNT OPEN READ WRITE REDOログ
  33. デフォルト値はDB_UNIQUE_NAMEを継承 DB_DOMAIN Oracleリスナーに登録されるサービス名 デフォルト・サービスと追加したサービスを使い分ける Copyright © 2022, Oracle and/or its

    affiliates 41 DB_NAME DB_UNIQUE_NAME SERVICE_NAMES PDB_NAME tnslsnr プラガブル・データベース ルート・コンテナ (またはNon-CDB構成) デフォルト値はDB_NAMEを継承 CREATE DATABASEの名前 CREATE PLUGGABLE DATABASEの名前 service デフォルト・サービス • MOUNTでアクティブ • 管理系 追加したサービス • OPEN後にアクティブ • アプリケーション系 追加したサービス
  34. CDB Oracleクライアントは「サービス」に接続する データベースごとに一意なサービス名を持っている Copyright © 2022, Oracle and/or its affiliates

    42 tnslsnr Oracleクライアント Non-CDB Oracle インスタンス1 Oracle インスタンス2 service1 service2 PDB2 PDB3 service3 host:port/service1 host:port/service2 サービス データベースのワークロードを抽象化 Oracleリスナー・プロセス 1つのネットワーク・ポートで複数のサービスに対応 動的サービス登録 デフォルト・サービス • MOUNT状態でアクティブ • 管理系接続 追加したサービス • OPEN後にアクティブ • アプリケーション接続
  35. service 共有ストレージ・共有キャッシュ型クラスタ Oracle Real Application Clusters (RAC) Copyright © 2022,

    Oracle and/or its affiliates 45 ストレージ・ノード • ストレージ・デバイス コンピュート・ノード • CPU+メモリー • メモリーの一貫性を全自動で維持 全コンピュート・ノードは全ストレージにアクセス可能 データベース・クライアント • シングル・インスタンス構成と同じアクセス方法 • シングル・インスタンス構成と同様に データにアクセス可能 • インターフェースが変化しない ※RACの詳細は Oracle Database Technology Night #42
  36. Copyright © 2022, Oracle and/or its affiliates 46 Oracle Real

    Application Clusters (RAC) のコンポーネント
  37. Oracle Real Application Clusters (RAC)のコンポーネント Oracle Clusterwareによって起動・停止が管理される Copyright © 2022,

    Oracle and/or its affiliates 47 Clusterware Clusterware tnslsnr tnslsnr SCANリスナー tnslsnr Oracle インスタンス ASM インスタンス Oracle インスタンス ASM インスタンス データベース ストレージ上のファイル群 ノード1 ノード2 前半での説明 Oracleリスナー・プロセス ネットワーク接続リクエストを受ける SCANリスナー・プロセス ネットワーク接続リクエストを受ける Oracleインスタンス DBMS本体 ASMインスタンス クラスタ・ファイルシステム Oracle Clusterware クラスタ・メンバー管理 仮想IPアドレス OracleリスナーのIPアドレス
  38. ソフトウェアのパッケージング Oracle Grid Infrastructure Copyright © 2022, Oracle and/or its

    affiliates 48 Oracle Clusterware Clusterware Oracle Database Oracle ASM RAC 11g Release 1まで tnslsnr Oracle Database Oracle tnslsnr シングル・インスタンス構成 • ASMインスタンスはOracleインスタン スを改造したもの • $ORACLE_HOME/bin/oracle
  39. Oracle Grid Infrastructure ソフトウェアのパッケージング Oracle Grid Infrastructure Copyright © 2022,

    Oracle and/or its affiliates 49 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インスタンス
  40. Oracle Real Application Clusters (RAC)のコンポーネント Oracle Clusterwareによって起動・停止が管理される Copyright © 2022,

    Oracle and/or its affiliates 50 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
  41. 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 © 2022, Oracle and/or its affiliates 51
  42. Oracleリスナーと仮想IPアドレス (Virtual IP address: VIP) OracleリスナーはVIPで接続リクエストを待ち受けている 仮想IPアドレス(Virtual IP address) •

    Oracle Clusterwareが起動と停止を管理 • Oracleリスナーが接続を待ち受けるIPアドレス • SCAN VIPとノードVIPの2種類がある 52 Copyright © 2022, Oracle and/or its affiliates Oracle インスタンス Oracle インスタンス ノード 1 ノード 2 service1 service1 tnslsnr tnslsnr tnslsnr SCANVIP 1 SCANVIP 2 SCANVIP 3 tnslsnr VIP 1 tnslsnr VIP 2 Single Client Access Name VIP (SCAN VIP) • クラスタを代表する接続リクエスト先のIPアドレス • 可用性のために複数のOracleリスナーが起動 ノードVIP (もしくは単にVIP) • 実際にセッションを確立するIPアドレス • 各ノードに固有のOracleリスナーが起動 • シングル・インスタンス構成のリスナーと同じ役割
  43. サービス属性の設定 Oracle Clusterwareを操作するsrvctlコマンド 53 Copyright © 2022, Oracle and/or its

    affiliates Oracle インスタンス Oracle インスタンス ノード 1 ノード 2 service1 service1 Clusterware Clusterware srvctl (1) srvctlコマンド発行 (2) Oracle ClusterwareがOracleインスタンスに対して DBMS_SERVICEパッケージのプロシージャを実行 • srvctl add service ... • srvctl modify service ... • srvctl start service ... • デフォルト・サービスは操作不可 • DBMS_SERVICE.CREATE_SERVICE() • DBMS_SERVICE.MODIFY_SERVICE() • DBMS_SERVICE.START_SERVICE() • Oracle Grid Infrastructureがインストールされている 環境ではこれらのプロシージャを直接発行してはならない
  44. サービス属性を設定できるのは追加したサービスのみ Oracle Clusterwareのsrvctlコマンド 54 Copyright © 2022, Oracle and/or its

    affiliates Oracle インスタンス Oracle インスタンス ノード 1 ノード 2 service1 service1 Clusterware Clusterware デフォルト・サービス (管理系接続) 追加したサービス (アプリケーション接続) • デフォルト・サービスは操作不可 • MOUNT状態以降で常にアクティブ • srvctlコマンドで操作可能 • OPEN状態でアクティブになる • 起動・停止 • Oracleインスタンスへの配置指定 • 接続ロード・バランス設定 • アプリケーション・コンティニュイティ SERVICE_NAMES PDB_NAME
  45. RACの接続ロード・バランス 物理コネクション確立のロード・バランスは2段階ある (1)接続リクエスト発行 クライアント側接続ロード・バランス 接続文字列のLOAD_BALANCE=ONは接続リクエスト を出す先の負荷分散。 複数あるSCANリスナーのどれに接続リクエストを発行する かが決まる。 (2)接続先リダイレクト サーバー側接続ロード・バランス

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

    its affiliates 57 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) ) )
  47. Single Client Access Name (SCAN) DNSで1つのSCANホスト名と複数のSCAN VIPが対応づけられる 58 Copyright ©

    2022, 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 接続リクエスト発行
  48. 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 © 2022, Oracle and/or its affiliates 59 tnslsnr service1 instance1 instance2 service1の 接続先候補 (1)接続リクエスト発行
  49. (2) リダイレクト指示 セッション確立とリダイレクト 動的サービス登録: Oracleリスナーの2つの役割 Copyright © 2022, Oracle and/or

    its affiliates 60 tnslsnr Oracle インスタンス LREG LOCAL_LISTENER tnslsnr REMOTE_LISTENER • セッション確立に使用するリスナーの指定 • 同一ノード内 • リダイレクトに使用するリスナーの指定 • 同一ノード内とは限らない • LOCAL_LISTENERの情報も登録される Oracleクライアント (1) 接続リクエスト発行 (3) 接続リクエスト発行
  50. REMOTE_LISTENERでリダイレクト用Oracleリスナーを指定 動的サービス登録 Copyright © 2022, Oracle and/or its affiliates 61

    tnslsnr Oracle インスタンス1 LREG LOCAL_LISTENER = (ADDRESS=(HOST=VIP1)(PORT=1521)) VIP 1 REMOTE_LISTENER =scanhost:1521 • LOCAL_LISTENERが指すのはノードVIPのリスナー • セッション確立に使用するリスナーの指定 • シングル・インスタンス構成の場合と同様の役割 • REMOTE_LISTENERが指すのはSCAN VIPのリスナー • リダイレクトに使用するリスナーの指定 • EZCONNECT記法でSCANホスト名を指す • LOCAL_LISTENERの情報も登録される scanhost scanvip1 scanvip2 scanvip3 DNSサーバー SCANリスナーはクラスタのどこかのノードで起動している tnslsnr tnslsnr tnslsnr SCANVIP 1 SCANVIP 2 SCANVIP 3
  51. Oracle インスタンス3 LREG SCANリスナーにはすべてのOracleインスタンスの情報が登録される 動的サービス登録 Copyright © 2022, Oracle and/or

    its affiliates 62 Oracle インスタンス1 LREG Oracle インスタンス2 LREG REMOTE_LISTENER =scanhost:1521 全OracleインスタンスはSCANリスナーを 指している SCANリスナーに全Oracleインスタンスの 情報が登録される ノード1 ノード2 ノード3 tnslsnr tnslsnr tnslsnr SCANVIP 1 SCANVIP 2 SCANVIP 3 SCANリスナーはクラスタのどこかのノード で起動している
  52. LOCAL_LISTENERとREMOTE_LISTENERがどこで設定されるか OracleインスタンスをNOMOUNT起動後にOracle Clusterwareが設定 Copyright © 2022, Oracle and/or its affiliates

    63 Clusterware Clusterware tnslsnr tnslsnr SCANリスナー tnslsnr Oracle インスタンス ASM インスタンス Oracle インスタンス ASM インスタンス ノード1 ノード2 1. Oracle ClusterwareはOracleリスナーのリスニング・ポイントを 掌握している 2. OracleリスナーはVIPとセットで配置される 3. 初期化パラメータ「ファイル」にはLOCAL_LISTENERと REMOTE_LISTENERは設定されていない 4. Oracle ClusterwareによってNOMOUNT起動後にALTER SYSTEM SETで設定される 5. SCOPE=MEMORYなのでspfileには記録されない
  53. LOCAL_LISTENERとREMOTE_LISTENERがどこで設定されるか OracleインスタンスをNOMOUNT起動後にOracle Clusterwareが設定 Copyright © 2022, Oracle and/or its affiliates

    64 Oracle インスタンス Oracle インスタンス SHUTDOWN - NOMOUNT - MOUNT - OPEN MOUNT OPEN OPEN Oracle インスタンス Oracle インスタンス Oracle インスタンス 1. pfile/spfileを読んで SGA確保とプロセス起動 2. CONTROL_FILESで制 御ファイルの位置を認識 CDBデフォルト・サービス名 制御ファイル 3. 制御ファイルをオープン 4. オンラインREDOログ・ファ イルとデータファイルの位置 を認識 データ・ディクショナリ REDOログ・ファイル 5. オンラインREDOログ・ファ イルとデータファイルをオー プン 6. PDBはMOUNT状態 8. データ・ディクショナリに登 録された追加のサービスを 起動 データファイル OPEN OPEN Oracle インスタンス 7. PDBをオープン プラガブル・データベース tnslsnr SERVICE_NAMES PDB_NAME service PDBデフォルト・サービス名 追加したサービス 初期化パラメータ CDB PDB Clusterware ALTER SYSTEM SET LOCAL_LISTENER=... ALTER SYSTEM SET REMOTE_LISTENER=...
  54. Oracleリスナー・プロセスが認識しているサービス(SCANリスナー) lsnrctl servicesコマンド • サービス → インスタンス → ハンドラ の階層構造

    • SCANリスナーには全Oracleの情報が登録される • 1つのサービスを担当する複数のOracleインスタンスがある • ハンドラにはリダイレクト先のLOCAL_LISTENERの情報も登録されている 65 Copyright © 2022, Oracle and/or its affiliates $ lsnrctl services SCANリスナー名 (中略) サービス"pdb19a.jp.oracle.com"には、2件のインスタンスがあります。 インスタンス"rac19a2"、状態READYには、このサービスに対する1件のハンドラがあります... ハンドラ: "DEDICATED" 確立:0 拒否:0 状態:ready REMOTE SERVER (ADDRESS=(PROTOCOL=TCP)(HOST=10.185.151.120)(PORT=1521)) インスタンス"rac19a3"、状態READYには、このサービスに対する1件のハンドラがあります... ハンドラ: "DEDICATED" 確立:0 拒否:0 状態:ready REMOTE SERVER (ADDRESS=(PROTOCOL=TCP)(HOST=10.185.151.122)(PORT=1521)) tnslsnr service instance service instance handler handler
  55. Oracleリスナー・プロセスが認識しているサービス: ノード・リスナー (再掲) lsnrctl servicesコマンド • 1つのOracleリスナー・プロセスに複数のサービスが登録されている • サービス →

    インスタンス → ハンドラ の階層構造 • ハンドラとは接続形態(専用サーバー接続など)によって異なるプロセスの種類 66 Copyright © 2022, Oracle and/or its affiliates $ lsnrctl services [リスナー名] (中略) サービス"pdb19a.jp.oracle.com"には、1件のインスタンスがあります。 インスタンス"rac19a2"、状態READYには、このサービスに対する1件のハンドラがあります... ハンドラ: "DEDICATED" 確立:0 拒否:0 状態:ready LOCAL SERVER サービス"pdb19asvcrel.jp.oracle.com"には、1件のインスタンスがあります。 インスタンス"rac19a2"、状態READYには、このサービスに対する1件のハンドラがあります... ハンドラ: "DEDICATED" 確立:0 拒否:0 状態:ready LOCAL SERVER tnslsnr service instance handler service instance handler
  56. Oracle インスタンス3 PMON すべてのOracleリスナーにすべてのOracleインスタンスの情報が登録される 参考: Oracle Real Application Clusters 11g

    Release 1までの構成 Copyright © 2022, Oracle and/or its affiliates 67 Oracle インスタンス1 PMON Oracle インスタンス2 PMON REMOTE_LISTENERは全リスナーを指 している ノード1 ノード2 ノード3 tnslsnr VIP 1 tnslsnr VIP 2 tnslsnr VIP 3 REMOTE_LISTENER = (ADDRESS_LIST= (ADDRESS=(HOST=VIP1)(PORT=1521)) (ADDRESS=(HOST=VIP2)(PORT=1521)) (ADDRESS=(HOST=VIP3)(PORT=1521))) LOCAL_LISTENER = (ADDRESS=(HOST=VIP3)(PORT=1521)) LOCAL_LISTENERはノード・リスナーを 指している(11g Release 2以降と同じ) すべてのOracleリスナーがセッション確立とリダイレクトの両方の役割を兼ねる
  57. Oracle インスタンス3 PMON すべてのOracleリスナーにすべてのOracleインスタンスの情報が登録される 参考: Oracle Real Application Clusters 11g

    Release 1までの構成 Copyright © 2022, Oracle and/or its affiliates 68 Oracle インスタンス1 PMON Oracle インスタンス2 PMON ノード1 ノード2 ノード3 tnslsnr VIP 1 tnslsnr VIP 2 tnslsnr VIP 3 REMOTE_LISTENER = (ADDRESS_LIST= (ADDRESS=(HOST=VIP1)(PORT=1521)) (ADDRESS=(HOST=VIP2)(PORT=1521)) (ADDRESS=(HOST=VIP3)(PORT=1521))) LOCAL_LISTENER = (ADDRESS=(HOST=VIP3)(PORT=1521)) Oracleクライアント (DESCRIPTION = (LOAD_BALANCE=ON) (FAILOVER=ON) (ADDRESS = (PROTOCOL = TCP) (HOST = vip1) (PORT = 1521)) (ADDRESS = (PROTOCOL = TCP) (HOST = vip2) (PORT = 1521)) (ADDRESS = (PROTOCOL = TCP) (HOST = vip3) (PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = service_name) ) ) • クライアントは全VIPを列挙する • EZCONNECT記法が使えない
  58. tnslsnr Oracle インスタンス Oracle インスタンス tnslsnr ノード 1 ノード 2

    service1 service1 tnslsnr SCAN リスナー Oracleクライアント (2)リダイレクト サービスの負荷配分情報もリスナーに登録される REMOTE_LISTENERでSCANリスナーを指す サービスの属性 CLB_GOALとGOAL DBA_SERVICESなどの列 • CLB_GOAL: 物理コネクションの設定 • GOAL: ロード・バランシング・アドバイザの設定 サービスの設定 $ srvctl add service -db DB_UNIQUE_NAME -pdb PDB_NAME -service servicename -clbgoal 物理コネクションの設定 -rlbgoal ロード・バランシング・アドバイザの設定 リダイレクト先を決める負荷分散アルゴリズムはサービスの属性 サーバー側接続ロード・バランス (Server-Side Connection Load Balancing) Copyright © 2022, Oracle and/or its affiliates 69 (1)接続リクエスト発行
  59. tnslsnr Oracle インスタンス Oracle インスタンス tnslsnr ノード 1 ノード 2

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

    service1 service1 サーバー側接続ロード・バランス設定の使い分け リダイレクト先を決める負荷分散アルゴリズムはサービスの属性 都度接続(コネクション・プールしない) 71 Copyright © 2022, Oracle and/or its affiliates Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1 service1 Oracleクライアント アプリケーション・サーバー tnslsnr SCAN リスナー tnslsnr CLB_GOAL=SHORTでアドバイザ に従ってリダイレクト先を選択 CLB_GOAL=LONGでセッション数 を均等にリダイレクトする
  61. Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1 service1

    ロード・バランシング・アドバイザ SQL実行性能を観測し最適な負荷配分比率のガイドを生成 Copyright © 2022, Oracle and/or its affiliates 72 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インスタンスへの最適なリクエスト比率を算出
  62. コネクション・プール Pool Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2

    service1 service1 ランタイム接続ロード・バランス (Runtime Connection Load Balancing: RCLB) ロードバランシング・アドバイザの算出した負荷配分に従う 都度接続(コネクション・プールしない) 73 Copyright © 2022, Oracle and/or its affiliates Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1 service1 Oracleクライアント アプリケーション・サーバー ロードバランシング・アドバイザの比率 に従って物理コネクションを選択 スレッド tnslsnr SCAN リスナー tnslsnr ロードバランシング・アドバイザの比率 に従ってリダイレクト先を選択 CLB_GOAL=LONGでセッション数 を均等にリダイレクトする
  63. 高速アプリケーション通知 (Fast Application Notification: FAN) Oracle ClusterwareからOracleクライアントにメッセージ通知する仕組み ONS (Oracle Notification

    Service)プロセス • Oracle Clusterwareからクライアントへメッセージ伝搬を担う • コネクション・プールからONSプロセスに接続 • SQL実行用コネクションとは別 Fast Application Notification (FAN) • Oracle Clusterwareからクライアントにイベント通知 • Runtime Load Balancing (RLB)イベント • UP/DOWNイベント Oracle製コネクション・プールがFAN対応 • Universal Connection Pool for Java (UCP) • OCI Session Pool • ODP.NET Unmanaged Driver 74 Copyright © 2022, Oracle and/or its affiliates Connection Pool ノード 1 ノード 2 アプリケーション・サーバー Clusterware Clusterware ons ons FANイベント FANイベント
  64. 新規コネクション確立時の接続リクエスト失敗 Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1

    service1 tnslsnr SCAN リスナー Oracleクライアント 接続フェイルオーバー機能 確立済みコネクションの異常切断 76 Copyright © 2022, Oracle and/or its affiliates tnslsnr Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1 service1 tnslsnr SCAN リスナー Oracleクライアント oracle
  65. 新規コネクション確立時の接続リクエスト失敗 接続時フェイルオーバー (Connect-Time Failover: CTF) 77 Copyright © 2022, 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) ) )
  66. SCANホスト名の指定は複数の接続先候補があると解釈される DNSで1つのSCANホスト名と複数のSCAN VIPが対応づけられる 78 Copyright © 2022, 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 接続リクエスト発行
  67. 確立済みコネクションの異常切断 (透過的)アプリケーション・コンティニュイティ / (Transparent) Application Continuity Copyright © 2022, Oracle

    and/or its affiliates 79 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対応クライアントでもある ※アプリケーション・コンティニュイティの詳細は Oracle Database Technology Night #39
  68. 新規コネクション確立時の接続リクエスト失敗 Oracle インスタンス1 Oracle インスタンス2 ノード 1 ノード 2 service1

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

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

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

    異常に対処 • 接続時フェイルオーバー • アプリケーション・コンティニュイティ データベース・クライアント データベース・サーバー ネットワーク越しの異常検出
  72. TCP/IPの異常系の挙動 (2) OS以下が異常で無応答になる場合 送信時 受信待ち時 86 Copyright © 2022, Oracle

    and/or its affiliates tnslsnr sqlplus OS Hardware OS Hardware OS connect() write() タイムアウト oracle sqlplus OS Hardware OS Hardware ずっと待ち read() ACKがない ので再送
  73. Oracle Clusterwareによる正常性監視 OSを即時停止する場合がある Oracle Clusterware • インターコネクト・ネットワークと共有ストレージを介してOracle Clusterware同士が正常性確認を行っている • 異常検出の内容によってはOSを即時停止する場合

    がある • OSが即時停止されるノード上のプロセスはTCP FINフラグを送信するチャンスもない • 通信相手からは無応答になる 87 Copyright © 2022, Oracle and/or its affiliates ノード 1 ノード 2 Clusterware Clusterware OS OS OS即時停止
  74. Oracleリスナーと仮想IPアドレス (Virtual IP address: VIP) (再掲) OracleリスナーはVIPで接続リクエストを待ち受けている 仮想IPアドレス(Virtual IP address)

    • Oracle Clusterwareが起動と停止を管理 • Oracleリスナーが接続を待ち受けるIPアドレス • SCAN VIPとノードVIPの2種類がある 88 Copyright © 2022, Oracle and/or its affiliates Oracle インスタンス Oracle インスタンス ノード 1 ノード 2 service1 service1 tnslsnr tnslsnr tnslsnr SCANVIP 1 SCANVIP 2 SCANVIP 3 tnslsnr VIP 1 tnslsnr VIP 2 Single Client Access Name VIP (SCAN VIP) • クラスタを代表する接続リクエスト先のIPアドレス • 可用性のために複数のOracleリスナーが起動 ノードVIP (もしくは単にVIP) • 実際にセッションを確立するIPアドレス • 各ノードに固有のOracleリスナーが起動 • シングル・インスタンス構成のリスナーと同じ役割
  75. 仮想IPアドレスのフェイルオーバー ノード障害を検出するとOracle Clusterwareによって正常ノードに移動される Copyright © 2022, Oracle and/or its affiliates

    89 ノード 1 ノード 2 SCANVIP 1 SCANVIP 2 VIP 1 VIP 2 Clusterware Clusterware SCANVIP 3 ノード 1 ノード 2 SCANVIP 1 SCANVIP 2 VIP 1 VIP 2 Clusterware Clusterware SCANVIP 3 フェイルオーバー
  76. TCP/IPの異常系の挙動 (2) 仮想IPアドレスのフェイルオーバーによる対処 何かが送信されるとVIPがRST応答を返す Copyright © 2022, Oracle and/or its

    affiliates 90 送信時 tnslsnr sqlplus OS Hardware OS Hardware connect() write() 異常検出 RST OS Hardware VIPフェイルオーバー完了 VIPがアクティブになった後は 一瞬でRST応答を返す VIP ACKがない ので再送
  77. TCP/IPの異常系の挙動 (3) TCP keepaliveによる受信待ちからの送信への変形 OS以下が異常で無応答になる場合 送信時 受信待ち時 91 Copyright ©

    2022, Oracle and/or its affiliates oracle sqlplus OS Hardware OS Hardware OS タイムアウト oracle sqlplus OS Hardware OS Hardware ずっと待ち read() ACKがない ので再送 keepalive プローブ送信 TCP keepalive有効化
  78. Oracleクライアント側でのTCP keepalive有効化 ENABLE=BROKENとTCP keepaliveタイマーの調整 Copyright © 2022, Oracle and/or its

    affiliates 92 (DESCRIPTION = (ENABLE=BROKEN) (LOAD_BALANCE=ON) (FAILOVER=ON) (ADDRESS = (PROTOCOL = TCP) (HOST = scanhost) (PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = service_name) ) ) Oracleクライアント (1)接続記述子にENABLE=BROKENを追加するとTCP keepaliveが有効になる 異常検出 RST VIPフェイルオーバー完了 VIPがアクティブになった後は 一瞬でRST応答を返す VIP ACKがないので再送 最後の正常応答 TCP keepaliveタイマー デフォルト値 7200秒 (2)要調整 TCP keepalive probe
  79. ノード 1 ノード 2 tnslsnr 1 SCAN VIP1 SCANリスナーのフェイルオーバー SCAN

    VIPがフェイルオーバーするとSCANリスナーもフェイルオーバーする Copyright © 2022, Oracle and/or its affiliates 93 Clusterware Clusterware ノード 1 ノード 2 tnslsnr 1 SCAN VIP1 Clusterware Clusterware フェイルオーバー tnslsnr 1 SCAN VIP1 • SCAN VIPとSCANリスナーはセットで正常ノードで起動する • フェイルオーバー先のノードで接続リクエストを受信
  80. tnslsnr 2 tnslsnr 1 ノード 1 ノード 2 ノード・リスナーはフェイルオーバーしない ノードVIPがフェイルオーバーしてもノード・リスナーはフェイルオーバーしない

    Copyright © 2022, Oracle and/or its affiliates 94 Clusterware Clusterware VIP 1 VIP 2 ノード 1 ノード 2 Clusterware Clusterware • VIP 1のみフェイルオーバーする • ノード・リスナーはフェイルオーバーしない • VIP 1はRST応答を返すためだけにいる • ノード1が正常起動したらVIP 1はいつでもフェイルバックできる tnslsnr 2 tnslsnr 1 1 フェイルオーバー フェイルバック
  81. Connection Pool TCP/IPの異常系の挙動 (2) 高速接続フェイルオーバーによる対処 Oracle ClusterwareからOracleクライアントにメッセージ通知する仕組み ONS (Oracle Notification

    Service)プロセス • Oracle Clusterwareからクライアントへメッセージ伝搬を担う • コネクション・プールからONSプロセスに接続 • SQL実行用コネクションとは別 Fast Application Notification (FAN) • Oracle Clusterwareからクライアントにイベント通知 • Runtime Load Balancing (RLB)イベント • UP/DOWNイベント Oracle製コネクション・プールがFAN対応 • Universal Connection Pool for Java (UCP) • OCI Session Pool • ODP.NET Unmanaged Driver 95 Copyright © 2022, Oracle and/or its affiliates ノード 1 ノード 2 アプリケーション・サーバー Clusterware Clusterware ons ons FANイベント DOWNイベントへの対応 高速接続フェイルオーバー FANイベント
  82. Connection Pool TCP/IPの異常系の挙動 (2) 高速接続フェイルオーバーによる対処 高速接続フェイルオーバー (Fast Connection Failover: FCF)

    96 Copyright © 2022, Oracle and/or its affiliates ノード 1 ノード 2 Clusterware Clusterware ons ons FANイベント (1) Oracle Clusterware • サービス停止/ノード停止を検出すると停止対象を記述した FAN DOWNイベントを発行 (2) FAN対応コネクション・プール • 各物理コネクションがどのサービス/Oracleインスタンス/ノード に接続しているか把握している • DOWNイベントに記述されている該当コネクションを破棄 • サーバー側の異常検出
  83. 異常を検出したら、異常に対処する機能が発動する ネットワーク越しの異常検出 Copyright © 2022, Oracle and/or its affiliates 97

    異常を検出 異常に対処 • 接続時フェイルオーバー • アプリケーション・コンティニュイティ • TCP FIN/RST応答 • 仮想IPアドレス(VIP) • TCP keepalive • 高速接続フェイルオーバー(FCF)
  84. サービスはデータベースのワークロードを抽象化した概念 Oracle Database 10gからの概念 Copyright © 2022, Oracle and/or its

    affiliates 98 Oracleバージョン 機能 Oracle9i • Real Application Clusters • サービスがクラスタ構成を抽象化 • Data Guard • DB_UNIQUE_NAME Oracle Database 10g Release 1 • サービスがデータベースのワークロードを抽象化 • Automatic Workload Repository • Oracle Clusterware • Automatic Storage Management • Fast Application Notification (JDBC thinドライバ) • 高速接続フェイルオーバー Oracle Database 10g Release 2 • Fast Application Notification (OCI/ODP.NET) • ランタイム接続ロード・バランス • セッション数均等化がデフォルト Oracle Database 11g Release 1 • Universal Connection Pool for Java Oracle Database 11g Release 2 • Oracle Grid Infrastructure • Single Client Access Name Oracle Database 12c Release 1 • Multitenant Architecture • アプリケーション・コンティニュイティ (JDBC thinドライバ) Oracle Database 12c Release 2 • アプリケーション・コンティニュイティ (OCI/ODP.NET)
  85. Oracle Autonomous Database Exadataをベースにして高度な抽象化がなされた自律型データベース・サービス Exadata上のプラガブル・データベース 指定する変数はOCPU数とストレージ容量のみ Oracle Computing Unit (OCPU)

    1 OCPUは1CPU物理コアに相当 スケールアップかつスケールアウトを抽象化 • OCPU数に比例したCPU時間 • OCPU数に比例したメモリー容量 • OCPU数に比例したストレージ性能 無停止でOCPU数(リソース割り当て)を変更 100 Copyright © 2022, Oracle and/or its affiliates
  86. サービスでリソース制御する例: Oracle Autonomous Database (再掲) リソース制限が異なる複数のサービスがあらかじめ定義されている Autonomous Databaseインスタンス(1個のプラガブル・データベース)作成時点で、接続サービスが複数定義されている。 • リソース・マネージャのコンシューマ・グループにマッピングされ、

    同時実行性や並列処理等を制御 インスタンス接続時に、接続サービスを選択するだけでリソース制御が可能。 101 Copyright © 2022, 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分以上アイドル状態の続くセッションは自動的に切断される
  87. Oracle Autonomous Database Oracle Computing Unit(OCPU) の1変数にハードウェア・リソースを抽象化 102 Copyright ©

    2022, Oracle and/or its affiliates DBサーバー ストレージ Oracle Computing Unit (OCPU) • 1 OCPUは1CPU物理コアに相当 • スケール・アップかつスケール・アウトを抽象化 • OCPU数に比例したCPU時間 • OCPU数に比例したメモリー容量 • OCPU数に比例したストレージ性能 • 無停止でOCPU数(リソース割り当て)を変更 CPU メモリー Autonomous Databaseインスタンス • 1つのプラガブル・データベースのこと • OCPUに抽象化されたリソース割り当て • サービスでリソース制御 スケール・アップ スケール・アウト サービス • データベースのワークロードを抽象化 service
  88. Our mission is to help people see data in new

    ways, discover insights, unlock endless possibilities.