忘れかけのIT備忘録

今まで学んできた知識や小技、なるほど!と思ったことをメモするブログです。

SCAN検証

SCANについて、机上の知識はあるものの、実務経験が無いため、実際の動きを検証しました。

SCAN(Single Client Access Name:単一クライアントアクセス名)は、11gR2の新機能でクライアントがインスタンスやサービスが起動しているノードを意識せず、DBに接続する方法です。
SCANはSCANリスナーと対応付けられており、SCANリスナーによってロードバランス(サーバー・ロード・バランス)とフェイルオーバーが提供されます。(従来(11gR1)までは各ノードのリスナーが提供していました)
ポリシー管理型データベースの場合、ノードVIPとインスタンスやサービスが動的に変更される(固定されていない)ため、SCANで接続するのが一般的です。

従来(11gR1)まではクライアントでノード名(ノードVIP)、ポート番号、サービス名を指定してDBに接続していました。
SCANはクライアントでSCAN名(SCAN VIP)、ポート番号、サービス名を指定してDBに接続します。

(例1) ローカルネーミング接続でノード名(ノードVIP)を指定する場合
HOGE =
  (DESCRIPTION =
    (FAILOVER = ON)(LOAD_BALANCE = ON)
    (ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip.oracle12c.jp)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip.oracle12c.jp)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = node3-vip.oracle12c.jp)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = hoge)
    )
  )

(例2) ローカルネーミング接続でSCAN名(SCAN VIP)を指定する場合
HOGE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = scan.oracle12c.jp)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = hoge)
    )
  )

SCAN名はDNSサーバーかhostsファイルに設定します。
なお、DNSサーバーを使用する場合、最大3つまでのSCANリスナーを登録できますが、hostsを使用する場合、1つだけSCANリスナーを登録できます。
SCANリスナーはランダムにいずれかのノードで起動しており、クライアントが接続するインスタンスやサービスが登録されているローカルリスナーのアドレスをクライアントへ戻します。

SCANのメリットはノード追加・削除した場合でもクライアントのtnsnames.oraを修正せずにDBに接続できることだと思います。(とりあえずSCANに接続すれば、後はSCANリスナーが接続先のローカルリスナーアドレスを戻してくれるため)
ノードVIPを指定している場合、いちいちクライアントのtnsnames.oraを修正しないといけません。

では早速、SCANの動きを見てみようと思います。

■検証環境

①SCAN名で問い合わせ
②SCANリスナーアドレスを戻す(DNSラウンドロビンでSCANリスナーアドレスを1つ戻す)
③SCANリスナーに接続できるローカルリスナーを問い合わせ
④ローカルリスナーアドレスを戻す(対象サービスを提供するインスタンスのノード)
⑤ローカルリスナーに接続

■前提
DNSサーバーはdnsmasqを使用しています
・検証環境図ではクライアントからサービスへ接続するように書いていますが、検証ではnode1を疑似クライアントにしています(手抜きですみません)
・3ノードRAC(管理者管理型DB)

■設定情報

DNSサーバーのhosts
[root@dns ~]# cat /etc/hosts
192.168.56.101  node1.oracle12c.jp      node1      #ノード1
192.168.56.102  node2.oracle12c.jp      node2      #ノード2
192.168.56.103  node3.oracle12c.jp      node3      #ノード3
192.168.56.111  node1-vip.oracle12c.jp  node1-vip  #ノード1(VIP)
192.168.56.112  node2-vip.oracle12c.jp  node2-vip  #ノード2(VIP)
192.168.56.113  node3-vip.oracle12c.jp  node3-vip  #ノード3(VIP)

#scan
192.168.56.201  scan.oracle12c.jp       scan       #SCAN1
192.168.56.202  scan.oracle12c.jp       scan       #SCAN2
192.168.56.203  scan.oracle12c.jp       scan       #SCAN3

#dns
192.168.56.254  dns.oracle12c.jp        dns        #DNS

クラスタリソース情報
[root@node1 ~]# /u01/app/12.1.0/grid/bin/crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details       
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.CRS.dg
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
               ONLINE  ONLINE       node3                    STABLE
ora.DATA.dg
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
               ONLINE  ONLINE       node3                    STABLE
ora.FRA.dg
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
               ONLINE  ONLINE       node3                    STABLE
ora.LISTENER.lsnr
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
               ONLINE  ONLINE       node3                    STABLE
ora.asm
               ONLINE  ONLINE       node1                    Started,STABLE
               ONLINE  ONLINE       node2                    Started,STABLE
               ONLINE  ONLINE       node3                    Started,STABLE
ora.net1.network
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
               ONLINE  ONLINE       node3                    STABLE
ora.ons
               ONLINE  ONLINE       node1                    STABLE
               ONLINE  ONLINE       node2                    STABLE
               ONLINE  ONLINE       node3                    STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       node2                    STABLE
ora.LISTENER_SCAN2.lsnr
      1        ONLINE  ONLINE       node3                    STABLE
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  ONLINE       node1                    STABLE
ora.MGMTLSNR
      1        ONLINE  ONLINE       node1                    169.254.243.236 192.
                                                                                 168.100.101,STABLE
ora.cvu
      1        OFFLINE OFFLINE                               STABLE
ora.mgmtdb
      1        ONLINE  ONLINE       node1                    Open,STABLE
ora.node1.vip
      1        ONLINE  ONLINE       node1                    STABLE
ora.node2.vip
      1        ONLINE  ONLINE       node2                    STABLE
ora.node3.vip
      1        ONLINE  ONLINE       node3                    STABLE
ora.oc4j
      1        ONLINE  ONLINE       node3                    STABLE
ora.orcl.db
      1        ONLINE  ONLINE       node1                    Open,STABLE
      2        ONLINE  ONLINE       node2                    Open,STABLE
      3        ONLINE  ONLINE       node3                    Open,STABLE
ora.orcl.hoge.svc
      1        ONLINE  ONLINE       node1                    STABLE
      2        ONLINE  ONLINE       node2                    STABLE
      3        ONLINE  ONLINE       node3                    STABLE
ora.scan1.vip
      1        ONLINE  ONLINE       node2                    STABLE
ora.scan2.vip
      1        ONLINE  ONLINE       node3                    STABLE
ora.scan3.vip
      1        ONLINE  ONLINE       node1                    STABLE
--------------------------------------------------------------------------------

サービス設定情報
[oracle@node1 ~]$ srvctl config service -db orcl -service hoge
サービス名: hoge
サーバー・プール: 
カーディナリティ: 3
切断: false
サービス・ロール: PRIMARY
管理ポリシー: AUTOMATIC
DTPトランザクション: false
AQのHA通知: false
グローバル: false
コミット結果: false
フェイルオーバー・タイプ: 
フェイルオーバー・メソッド: 
TAFフェイルオーバー再試行: 
TAFフェイルオーバー遅延: 
接続ロード・バランシングの目標: LONG
ランタイム・ロード・バランシングの目標: NONE
TAFポリシー仕様: NONE
エディション: 
プラガブル・データベース名: 
最大タイム・ラグ: ANY
SQL翻訳プロファイル: 
保存時間: 86400秒
リプレイ開始時間: 300秒
セッション状態一貫性: 
GSMフラグ: 0
サービスは有効です
優先インスタンス: orcl1,orcl2,orcl3
使用可能なインスタンス:

SCAN設定情報 ※ノード2・3も同様
[grid@node1 ~]$ srvctl config scan
SCAN名: scan.oracle12c.jp、ネットワーク: 1
サブネットIPv4: 192.168.56.0/255.255.255.0/eth0, static
サブネットIPv6
SCAN 0 IPv4 VIP: 192.168.56.203
SCAN VIPは有効です。
SCAN VIPはノード: で個別に有効になっています
SCAN VIPはノード: で個別に無効になっています
SCAN 1 IPv4 VIP: 192.168.56.201
SCAN VIPは有効です。
SCAN VIPはノード: で個別に有効になっています
SCAN VIPはノード: で個別に無効になっています
SCAN 2 IPv4 VIP: 192.168.56.202
SCAN VIPは有効です。
SCAN VIPはノード: で個別に有効になっています
SCAN VIPはノード: で個別に無効になっています

SCAN状態 ※ノード2・3も同様
[grid@node1 ~]$ srvctl status scan
SCAN VIP scan1は有効です
SCAN VIP scan1はノードnode2で実行されています
SCAN VIP scan2は有効です
SCAN VIP scan2はノードnode3で実行されています
SCAN VIP scan3は有効です
SCAN VIP scan3はノードnode1で実行されています

SCANリスナー設定情報 ※ノード2・3も同様
[grid@node1 ~]$ srvctl config scan_listener
SCANリスナーLISTENER_SCAN1は存在します。ポート: TCP:1521
登録招待ノード: 
登録招待サブネット: 
SCANリスナーは有効です。
SCANリスナーはノード: で個別に有効になっています
SCANリスナーはノード: で個別に無効になっています
SCANリスナーLISTENER_SCAN2は存在します。ポート: TCP:1521
登録招待ノード: 
登録招待サブネット: 
SCANリスナーは有効です。
SCANリスナーはノード: で個別に有効になっています
SCANリスナーはノード: で個別に無効になっています
SCANリスナーLISTENER_SCAN3は存在します。ポート: TCP:1521
登録招待ノード: 
登録招待サブネット: 
SCANリスナーは有効です。
SCANリスナーはノード: で個別に有効になっています
SCANリスナーはノード: で個別に無効になっています

SCANリスナー状態 ※ノード2・3も同様
[grid@node1 ~]$ srvctl status scan_listener
SCANリスナーLISTENER_SCAN1は有効です
SCANリスナーLISTENER_SCAN1はノードnode2で実行されています
SCANリスナーLISTENER_SCAN2は有効です
SCANリスナーLISTENER_SCAN2はノードnode3で実行されています
SCANリスナーLISTENER_SCAN3は有効です
SCANリスナーLISTENER_SCAN3はノードnode1で実行されています

SCANリスナー状態
#ノード1
[grid@node1 ~]$ lsnrctl status LISTENER_SCAN3
サービスのサマリー...
サービス"-MGMTDBXDB"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"_mgmtdb"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"hoge"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"node_cluster"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

#ノード2
[grid@node2 ~]$ lsnrctl status LISTENER_SCAN1
サービスのサマリー...
サービス"-MGMTDBXDB"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"_mgmtdb"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"hoge"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"node_cluster"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

#ノード3
[grid@node3 ~]$ lsnrctl status LISTENER_SCAN2
サービスのサマリー...
サービス"-MGMTDBXDB"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"_mgmtdb"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"hoge"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"node_cluster"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、3件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

listener.ora設定情報
#ノード1
[grid@node1 ~]$ cat /u01/app/12.1.0/grid/network/admin/listener.ora
MGMTLSNR=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=MGMTLSNR))))        # line added by Agent

ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN3 = ON

ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN2 = ON

ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1 = ON

VALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN3=OFF     # line added by Agent

VALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN2=OFF     # line added by Agent

VALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN1=OFF     # line added by Agent

VALID_NODE_CHECKING_REGISTRATION_LISTENER = SUBNET

LISTENER =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = LISTENER))
    )
  )

ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER = ON

LISTENER_SCAN3 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = LISTENER_SCAN3))
    )
  )

LISTENER_SCAN2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = LISTENER_SCAN2))
    )
  )

LISTENER_SCAN1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = LISTENER_SCAN1))
    )
  )

ENABLE_GLOBAL_DYNAMIC_ENDPOINT_MGMTLSNR=ON              # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_MGMTLSNR=SUBNET        # line added by Agent

#ノード2
[grid@node2 ~]$ cat /u01/app/12.1.0/grid/network/admin/listener.ora
LISTENER_SCAN3=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN3))))        # line added by Agent
LISTENER_SCAN2=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN2))))        # line added by Agent
MGMTLSNR=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=MGMTLSNR))))                    # line added by Agent
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER))))                    # line added by Agent
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1))))        # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON                                                # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN1=OFF                                             # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON                                                      # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER=SUBNET                                                # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_MGMTLSNR=ON                                                      # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_MGMTLSNR=SUBNET                                                # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN2=ON                                                # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN2=OFF                                             # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN3=ON                                                # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN3=OFF                                             # line added by Agent

#ノード3
[grid@node3 ~]$ cat /u01/app/12.1.0/grid/network/admin/listener.ora
MGMTLSNR=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=MGMTLSNR))))                    # line added by Agent
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER))))                    # line added by Agent
LISTENER_SCAN2=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN2))))        # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN2=ON                                                # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN2=OFF                                             # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON                                                      # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER=SUBNET                                                # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_MGMTLSNR=ON                                                      # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_MGMTLSNR=SUBNET                                                # line added by Agent

リスナー情報
#ノード1
[grid@node1 ~]$ lsnrctl status LISTENER
サービスのサマリー...
サービス"+ASM"には、1件のインスタンスがあります。
  インスタンス"+ASM1"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"-MGMTDBXDB"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"_mgmtdb"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"hoge"には、1件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"node_cluster"には、1件のインスタンスがあります。
  インスタンス"-MGMTDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、1件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、1件のインスタンスがあります。
  インスタンス"orcl1"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

#ノード2
[grid@node2 ~]$ lsnrctl status LISTENER
サービスのサマリー...
サービス"+ASM"には、1件のインスタンスがあります。
  インスタンス"+ASM2"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"hoge"には、1件のインスタンスがあります。
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、1件のインスタンスがあります。
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、1件のインスタンスがあります。
  インスタンス"orcl2"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

#ノード3
[grid@node3 ~]$ lsnrctl status LISTENER
サービスのサマリー...
サービス"+ASM"には、1件のインスタンスがあります。
  インスタンス"+ASM3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"hoge"には、1件のインスタンスがあります。
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl"には、1件のインスタンスがあります。
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclXDB"には、1件のインスタンスがあります。
  インスタンス"orcl3"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。

クライアントのtnsnames.ora設定情報
[oracle@node1 ~]$ cat /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = scan.oracle12c.jp)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

HOGE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = scan.oracle12c.jp)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = hoge)
    )
  )

 

■検証パターン
hogeサービスへ接続

■検証
hogeサービスへ接続
疑似クライアントからSCANを使用してhogeサービスへ接続できるか検証します

【検証手順】
1. 疑似クライアントで「sqlplus system/XXXXX@HOGE」を1秒単位で10回実行する
2. 各ノードのリスナーログ、SCANリスナーログを確認して接続状況を確認する

【想定】
SCANを使用してhogeサービスへ接続できるはず

【検証結果】
SCANを使用してhogeサービスへ接続できた

【作業ログ】

1. 疑似クライアントで「sqlplus system/XXXXX@HOGE」を1秒単位で10回実行する
※10回繰り返すスクリプトを使いました

2. 各ノードのリスナーログ、SCANリスナーログを確認して接続状況を確認する
接続するコマンドを10回繰り返した後の各ノードのリスナーログ、SCANリスナーログ見てみます
※接続時間帯で抜粋しています

ノード1のSCANリスナーログ(listener_scan3.log)
18-9月 -2022 22:03:13 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=42010)) * establish * hoge * 0
18-9月 -2022 22:03:19 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=42018)) * establish * hoge * 0
18-9月 -2022 22:03:25 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=42024)) * establish * hoge * 0

ノード1のリスナーログ(listener.log)
18-9月 -2022 22:03:17 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl1)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=32557)) * establish * hoge * 0
18-9月 -2022 22:03:19 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl1)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=32559)) * establish * hoge * 0
18-9月 -2022 22:03:27 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl1)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=32567)) * establish * hoge * 0

ノード2のSCANリスナーログ(listener_scan1.log)
18-9月 -2022 22:03:11 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=20101)) * establish * hoge * 0
18-9月 -2022 22:03:17 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=20109)) * establish * hoge * 0
18-9月 -2022 22:03:23 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=20115)) * establish * hoge * 0
18-9月 -2022 22:03:29 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=20121)) * establish * hoge * 0

ノード2のリスナーログ(listener.log)
18-9月 -2022 22:03:11 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl2)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=28751)) * establish * hoge * 0
18-9月 -2022 22:03:13 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl2)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=28753)) * establish * hoge * 0
18-9月 -2022 22:03:25 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl2)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=28767)) * establish * hoge * 0

ノード3のSCANリスナーログ(listener_scan2.log)
18-9月 -2022 22:03:15 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=26347)) * establish * hoge * 0
18-9月 -2022 22:03:21 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=26355)) * establish * hoge * 0
18-9月 -2022 22:03:27 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=26361)) * establish * hoge * 0

ノード3のリスナーログ(listener.log)
18-9月 -2022 22:03:15 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18658)) * establish * hoge * 0
18-9月 -2022 22:03:21 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18666)) * establish * hoge * 0
18-9月 -2022 22:03:23 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18668)) * establish * hoge * 0
18-9月 -2022 22:03:29 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18674)) * establish * hoge * 0

★ノードに関係なく、時系列でソートしてみます
SCANリスナーログ
18-9月 -2022 22:03:11 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=20101)) * establish * hoge * 0
18-9月 -2022 22:03:13 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=42010)) * establish * hoge * 0
18-9月 -2022 22:03:15 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=26347)) * establish * hoge * 0
18-9月 -2022 22:03:17 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=20109)) * establish * hoge * 0
18-9月 -2022 22:03:19 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=42018)) * establish * hoge * 0
18-9月 -2022 22:03:21 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=26355)) * establish * hoge * 0
18-9月 -2022 22:03:23 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=20115)) * establish * hoge * 0
18-9月 -2022 22:03:25 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=42024)) * establish * hoge * 0
18-9月 -2022 22:03:27 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=26361)) * establish * hoge * 0
18-9月 -2022 22:03:33 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=26367)) * establish * hoge * 0

リスナーログ
18-9月 -2022 22:03:11 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl2)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=28751)) * establish * hoge * 0
18-9月 -2022 22:03:13 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl2)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=28753)) * establish * hoge * 0
18-9月 -2022 22:03:15 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18658)) * establish * hoge * 0
18-9月 -2022 22:03:17 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl1)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=32557)) * establish * hoge * 0
18-9月 -2022 22:03:19 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl1)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=32559)) * establish * hoge * 0
18-9月 -2022 22:03:21 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18666)) * establish * hoge * 0
18-9月 -2022 22:03:23 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18668)) * establish * hoge * 0
18-9月 -2022 22:03:25 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl2)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=28767)) * establish * hoge * 0
18-9月 -2022 22:03:27 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl1)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=32567)) * establish * hoge * 0
18-9月 -2022 22:03:29 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=hoge)(CID=(PROGRAM=sqlplus)(HOST=node1.oracle12c.jp)(USER=oracle))(INSTANCE_NAME=orcl3)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=18674)) * establish * hoge * 0
※ログでは2秒おきに記録されていますが、スクリプトでは1秒おきに接続するようにしています(おそらく接続時に1秒+スリープ1秒で計2秒かかっている?)

 

■参考資料
オラクルマスター教科書 Oracle Expert RAC 11gR2

■おわりに
SCANリスナーからどのローカルリスナーにリダイレクトしたかを見る方法は分かりませんでした。
ただ、SCANリスナーからいずれかのローカルリスナーにリダイレクトされていることは確認できるため、時間帯を見れば推測できると思います。