tomy_125 の メモ

個人的な見解や、感想を記載しており、何らかの組織を代表してのものではありません。

Oracle RACで接続先にVIPを指定する意味の確認

Oracle RACでは各nodeにVIPが作成されるので、Clientからの接続時にはそちらを指定して接続します。 ※SCANは使用しない前提としています。

接続にVIPを使用するのは障害時に、Clientが通信エラーを検知するまでの時間を短くするためですが、今回は、そのエラー検知までの時間を確認したいと思います。

例えば、2node RACで node2が障害により停止したケースで、接続時Failoverが行われる流れは以下ですが、今回計測するのは、2~4の部分になります。

  1. node1、node2を接続先として定義した接続文字列 (LOAD_BALANCE=ON、FAILOVER=ON)を使用
  2. ここでは、先にnode2への接続が試行されたとする
  3. node2 は障害により停止しているので、接続できない
  4. Clientに接続エラーが返る
  5. 接続時Failoverにより、node1へ接続が試行される
  6. node1は正常なため接続成功する

検証をする構成

  • Vitrual Box上の2node RAC、19c
  • node1 は起動、node2はOS停止(障害により停止したという想定)
  • IPアドレスの設定
## /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の説明としても分かり易いです。
基本からわかる!高性能×高可用性データベースシステムの作り方 第4回 高可用性構成でのOracle Net構成(1) | Oracle Technology Network Japan Blog

他、記事と関係ないですが、