Oracle RACで接続先にVIPを指定する意味の確認
Oracle RACでは各nodeにVIPが作成されるので、Clientからの接続時にはそちらを指定して接続します。 ※SCANは使用しない前提としています。
接続にVIPを使用するのは障害時に、Clientが通信エラーを検知するまでの時間を短くするためですが、今回は、そのエラー検知までの時間を確認したいと思います。
例えば、2node RACで node2が障害により停止したケースで、接続時Failoverが行われる流れは以下ですが、今回計測するのは、2~4の部分になります。
- node1、node2を接続先として定義した接続文字列 (LOAD_BALANCE=ON、FAILOVER=ON)を使用
- ここでは、先にnode2への接続が試行されたとする
- node2 は障害により停止しているので、接続できない
- Clientに接続エラーが返る
- 接続時Failoverにより、node1へ接続が試行される
- node1は正常なため接続成功する
検証をする構成
## /etc/hosts 10.0.2.15 node1.local node1 10.0.2.16 node2.local node2 10.0.2.17 node1-vip.local node1-vip 10.0.2.18 node2-vip.local node2-vip 10.0.2.19 scan.local scan
手順
- node1から、node2の物理IPと、ノードVIPを指定し簡易接続を行う
- どちらも、エラーとなりますがエラーとなるまでの時間を計測します
- 計測にはtimeコマンドを使用します
- sqlplusのオプションには -l を指定し、接続試行は1回としています
物理IPへ接続試行するコマンド
$ time (sqlplus -l APP_USER/oracle@10.0.2.16:1521/pdb1.local)
VIPへ接続試行するコマンド
$ time (sqlplus -l APP_USER/oracle@10.0.2.18:1521/pdb1.local)
結果
それぞれ、以下の様にエラーとなります。この時の real の値を確認します。
物理IPの場合
node2の物理IPへ到達できないため、
ORA-12543: TNS:destination host unreachable
エラーとなります。
[oracle@node1 ~]$ time (sqlplus -l APP_USER/oracle@10.0.2.16:1521/pdb1.local) SQL*Plus: Release 19.0.0.0.0 - Production on Sat Feb 13 16:13:30 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. ERROR: ORA-12543: TNS:destination host unreachable SP2-0751: Unable to connect to Oracle. Exiting SQL*Plus real 0m3.089s user 0m0.009s sys 0m0.007s
VIPの場合
node2のVIPは node1へFailoverしていますが、
node1のリスナーはnode2-vipではLISTENしていないため、
ORA-12541: TNS:no listener
エラーとなります。
time (sqlplus -l APP_USER/oracle@10.0.2.18:1521/pdb1.local) SQL*Plus: Release 19.0.0.0.0 - Production on Sat Feb 13 16:17:09 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. ERROR: ORA-12541: TNS:no listener SP2-0751: Unable to connect to Oracle. Exiting SQL*Plus real 0m0.033s user 0m0.009s sys 0m0.013s
計測結果
それぞれ5回計測し、その時の realの値のみ抜粋しています。
総じて、物理IPへ接続を試行した方がエラーとるまでに時間がかかりました。
理由は、物理IPを指定した場合はTCP接続がエラーとなるまで待機してからClientにエラーが返るのに対し、VIPを指定した場合は、node2-vipはnode1にFailoverしているため、パケットはnode1へ到達し、そこでLISTNERがLISTNERが存在しない事に気きエラーとなるからです。
## node2の物理IPへ --- $ time (sqlplus -l APP_USER/oracle@10.0.2.16:1521/pdb1.local) --- 1. real 0m3.089s 2. real 0m1.683s 3. real 0m0.224s 4. real 0m3.093s 5. real 0m1.087s ## node2のVIPへ --- $ time (sqlplus -l APP_USER/oracle@10.0.2.18:1521/pdb1.local) --- 1. real 0m0.033s 2. real 0m0.032s 3. real 0m0.025s 4. real 0m0.024s 5. real 0m0.028s
まとめ
Oracle RACで接続先に物理IPを指定した場合、接続エラーとなるまでの時間が長い事が確認できました。
接続文字列でFAILOVERを有効にしていれば、障害時も正常nodeへ接続Failoverする事ができますが、仮に物理IPを指定していた場合、TCP応答が返り接続エラーとなってからFailoverするため、新規接続に時間を要する事になります。
その他
物理IPを指定した場合は、もう少し時間がかる(TCP接続timeoutの60s)ことを期待していましたが、それよりは、かなり早い結果となりました。
これは、検証を実施した環境ではTCP timeoutまで待機せずとも、物理IPへ接続できない事が確認されたため、その時点でエラーとなったものと想像しています。
参考
こちらの資料が、Failoverの説明としても分かり易いです。
https://blogs.oracle.com/otnjp/kusakabe-004
他、記事と関係ないですが、
- Client Failover Best Practicesfor Highly Available Oracle DatabasesOracle Database 12c
https://www.oracle.com/technetwork/database/availability/client-failover-2280805.pdf - Oracle Client Failover -Under theHood
https://www.doag.org/formes/pubfiles/8587361/2016-DB-Robert_Bialek-Oracle_Client_Failover_-_Ein_Blick_hinter_die_Kulissen-Manuskript.pdf