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の異常系の挙動とその対処の仕組みを解説します。

140494d272a4d89883a94fdfdb29dea2?s=128

oracle4engineer
PRO

January 27, 2022
Tweet

More Decks by oracle4engineer

Other Decks in Technology

Transcript

  1. Oracle Databaseのネットワーク接続 Oracle Database Technology Night #52 日下部明 日本オラクル株式会社 2022年1月27日

  2. Safe harbor statement 以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とする ものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することを確約 するものではないため、購買決定を行う際の判断材料になさらないで下さい。 オラクル製品に関して記載されている機能の開発、リリース、時期及び価格については、弊社の裁量により決定され、変 更される可能性があります。 2 Copyright

    © 2022, Oracle and/or its affiliates
  3. Oracle Databaseのネットワーク接続 前半: 1台のサーバー内 後半: Oracle Real Application Clusters 3

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

  5. Copyright © 2022, Oracle and/or its affiliates 5 Oracle Net

    Services Oracle Databaseのネットワーク・コンポーネントの総称
  6. 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リスナー・プロセス • 接続リクエスト受信 データベース • ファイルの集合
  7. 各種言語用の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
  8. 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
  9. 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
  10. 接続できるバージョンの組み合わせ クライアントとサーバーのバージョンが離れすぎるとサポートされない • 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
  11. Copyright © 2022, Oracle and/or its affiliates 11 Oracle Databaseにネットワーク経由で接続

  12. 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
  13. 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 インスタンス
  14. 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つのネットワーク・ポートで複数のサービスに対応
  15. ネットワーク接続リクエストを受ける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インスタンス
  16. 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)
  17. 一般的なネットワーク・ロードバランサーとは指定の方向が逆 ネットワーク・ロード・バランサー ロード・バランサーの設定で後段のインスタンス群を指定 Oracle Database インスタンスの設定でOracleリスナー・プロセスを指定 設定方向の違い Copyright © 2022,

    Oracle and/or its affiliates 17 Load Balancer host1:port host2:port : hostn:port host1 host2 hostn tnslsnr tnslsnr host1:port1 host2:port2 host2:port2 instance1 instance2 host2:port2
  18. 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ファイルにエイリアスを定義してもよい
  19. 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
  20. データ・ディクショナリに登録されている 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 のサービスのみが見える
  21. 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
  22. 接続に関する典型的なエラー 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上の名前
  23. 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の名前
  24. データベース名の階層 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
  25. DB_UNIQUE_NAME 管理操作上区別するデータベース名 Oracleインスタンスのトレースファイル群 $ORACLE_BASE/diag/rdbms/DB_UNIQUE_NAME/SID/trace/ ASM上のOracle Managed Fileのディレクトリ構造 +ASM_DISKGROUP/DB_UNIQUE_NAME/... srvctlコマンド srvctl

    start database -db DB_UNIQUE_NAME 25 Copyright © 2022, Oracle and/or its affiliates
  26. 特殊なサービスがある 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インスタンスのバックグラウンド・プロセスが属するサービス
  27. プロセスの持つ属性をグループ化してリソース管理 SGAにアタッチしているプロセスはなんらかのサービスに属している Copyright © 2022, Oracle and/or its affiliates 27

    oracle oracle 共有メモリー領域 (System Global Area) LGWR DBWn プロセス ($ORACLE_HOME/bin/oracle) サービス (セッションが持つ属性) service1 SYS$BACKGROUND Oracleサーバー・プロセス バックグラウンド・プロセス
  28. (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 oracle@ptvm30.jp.oracle.com (LCK1) SYS$BACKGROUND oracle@ptvm30.jp.oracle.com (RECO) SYS$BACKGROUND oracle@ptvm30.jp.oracle.com (MMNL) SYS$BACKGROUND oracle@ptvm30.jp.oracle.com (SMCO) SYS$BACKGROUND oracle@ptvm30.jp.oracle.com (ARC0) SYS$BACKGROUND oracle@ptvm30.jp.oracle.com (M002) SYS$BACKGROUND oracle@ptvm30.jp.oracle.com (W004) SYS$USERS oraagent.bin@ptvm30.jp.oracle.com (TNS V1-V3) SYS$BACKGROUND oracle@ptvm30.jp.oracle.com (Q006) SYS$BACKGROUND oracle@ptvm30.jp.oracle.com (QM05) SYS$BACKGROUND oracle@ptvm30.jp.oracle.com (W00E) ... ...
  29. AWRレポート サービスごとの統計が出る 29 Copyright © 2022, Oracle and/or its affiliates

  30. サービスでリソース制御する例: 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分以上アイドル状態の続くセッションは自動的に切断される
  31. Copyright © 2022, Oracle and/or its affiliates 31 デフォルト・サービス アプリケーションからの接続には使用しないサービス

  32. デフォルト・サービスをアプリケーションからの接続には使用しない アプリケーションからの接続には追加のサービスを作成する マニュアル: 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サービスをアプリケーションに使用しないことをお薦めします。
  33. Oracleインスタンスとデータベースの状態遷移 Copyright © 2022, Oracle and/or its affiliates 33 Oracle

    インスタンス Oracle インスタンス SHUTDOWN - NOMOUNT - 1. pfile/spfileを読んで SGA確保とプロセス起動 2. CONTROL_FILESで制 御ファイルの位置を認識 制御ファイル 初期化パラメータ CDB PDB
  34. 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
  35. 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
  36. 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
  37. 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
  38. 各サービス名が最初に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
  39. 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>
  40. 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ログ
  41. デフォルト値は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後にアクティブ • アプリケーション系 追加したサービス
  42. 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後にアクティブ • アプリケーション接続
  43. Copyright © 2022, Oracle and/or its affiliates 43 後半 Oracle

    Real Application Clusters
  44. 1つのクライアントからの接続は1本のTCPコネクション 接続ロードバランス どのノードと接続するか 接続フェイルオーバー 障害ノードを避けて正常ノードと接続する RACは複数の物理サーバーから構成される Copyright © 2022, Oracle

    and/or its affiliates 44 データベース・クライアント データベース・サーバー データベース・クライアント データベース・サーバー service service
  45. service 共有ストレージ・共有キャッシュ型クラスタ Oracle Real Application Clusters (RAC) Copyright © 2022,

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

    Application Clusters (RAC) のコンポーネント
  47. 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アドレス
  48. ソフトウェアのパッケージング 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
  49. 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インスタンス
  50. 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
  51. 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
  52. 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リスナーが起動 • シングル・インスタンス構成のリスナーと同じ役割
  53. サービス属性の設定 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がインストールされている 環境ではこれらのプロシージャを直接発行してはならない
  54. サービス属性を設定できるのは追加したサービスのみ 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
  55. Copyright © 2022, Oracle and/or its affiliates 55 接続ロードバランス

  56. 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)リダイレクト
  57. 接続リクエストを発行する先を決定する クライアント側ロード・バランス (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) ) )
  58. 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 接続リクエスト発行
  59. 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)接続リクエスト発行
  60. (2) リダイレクト指示 セッション確立とリダイレクト 動的サービス登録: Oracleリスナーの2つの役割 Copyright © 2022, Oracle and/or

    its affiliates 60 tnslsnr Oracle インスタンス LREG LOCAL_LISTENER tnslsnr REMOTE_LISTENER • セッション確立に使用するリスナーの指定 • 同一ノード内 • リダイレクトに使用するリスナーの指定 • 同一ノード内とは限らない • LOCAL_LISTENERの情報も登録される Oracleクライアント (1) 接続リクエスト発行 (3) 接続リクエスト発行
  61. 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
  62. 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リスナーはクラスタのどこかのノード で起動している
  63. 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には記録されない
  64. 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=...
  65. 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
  66. 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
  67. 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リスナーがセッション確立とリダイレクトの両方の役割を兼ねる
  68. 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記法が使えない
  69. 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)接続リクエスト発行
  70. 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はロード・バランシング・アドバイザに従う • アルゴリズムの指定ができるのは追加したサービスのみ
  71. コネクション・プール 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でセッション数 を均等にリダイレクトする
  72. 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インスタンスへの最適なリクエスト比率を算出
  73. コネクション・プール 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でセッション数 を均等にリダイレクトする
  74. 高速アプリケーション通知 (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イベント
  75. Copyright © 2022, Oracle and/or its affiliates 75 接続フェイルオーバー

  76. 新規コネクション確立時の接続リクエスト失敗 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
  77. 新規コネクション確立時の接続リクエスト失敗 接続時フェイルオーバー (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) ) )
  78. 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 接続リクエスト発行
  79. 確立済みコネクションの異常切断 (透過的)アプリケーション・コンティニュイティ / (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
  80. Copyright © 2022, Oracle and/or its affiliates 80 ネットワーク越しの異常検出 TCPの異常系の挙動とその対処

  81. 新規コネクション確立時の接続リクエスト失敗 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
  82. 新規コネクション確立時の接続リクエスト失敗 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 暗黙の前提 異常を検出したら、異常に対処する機能が発動する
  83. 異常を検出したら、異常に対処する機能が発動する Copyright © 2022, Oracle and/or its affiliates 83 異常を検出

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

    異常に対処 • 接続時フェイルオーバー • アプリケーション・コンティニュイティ データベース・クライアント データベース・サーバー ネットワーク越しの異常検出
  85. TCP/IPの異常系の挙動 (1) OS以下が正常でユーザー空間のプロセスが異常終了するとOSが応答する 新規コネクション確立時の接続リクエスト失敗 確立済みコネクションの異常切断 85 Copyright © 2022, Oracle

    and/or its affiliates tnslsnr sqlplus OS Hardware OS Hardware OS sqlplus SYN RST 一瞬で検出 oracle sqlplus OS Hardware OS Hardware OS sqlplus FIN 一瞬で検出
  86. 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がない ので再送
  87. 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即時停止
  88. 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リスナーが起動 • シングル・インスタンス構成のリスナーと同じ役割
  89. 仮想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 フェイルオーバー
  90. 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がない ので再送
  91. 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有効化
  92. 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
  93. ノード 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リスナーはセットで正常ノードで起動する • フェイルオーバー先のノードで接続リクエストを受信
  94. 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 フェイルオーバー フェイルバック
  95. 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イベント
  96. 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イベントに記述されている該当コネクションを破棄 • サーバー側の異常検出
  97. 異常を検出したら、異常に対処する機能が発動する ネットワーク越しの異常検出 Copyright © 2022, Oracle and/or its affiliates 97

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

  100. 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
  101. サービスでリソース制御する例: 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分以上アイドル状態の続くセッションは自動的に切断される
  102. 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
  103. Thank you 103 Copyright © 2022, Oracle and/or its affiliates

  104. Our mission is to help people see data in new

    ways, discover insights, unlock endless possibilities.
  105. None