Services in RAC 11gR2 mit SCAN

Services werden für den Verbindungsaufbau vom Client zum Oracle-Server verwendet. Speziell bei RAC sind Services wichtig, um eine entsprechende Aufteilung der Last, aber auch ein Failover einer Verbindung einer Anwendung zu einem anderen Knoten zu erlauben, falls der aktuelle Knoten ausfällt. Im folgenden Beispiel wird dieses Zusammenspiel verdeutlicht.

Im ersten Schritt wird ein Service mit dem Namen racservice für die beforzugten Instanzen orcl1 und orcl2 erstellt.
[oracle@rac1 ~]$ srvctl add service -d orcl -s racservice -r orcl1,orcl2 -P PRECONNECT

Dieser Service wird nun gestartet und ist für die beforzugten Instanzen aktiv.
[oracle@rac1 ~]$ srvctl start service -d orcl -s racservice

Das dieser Service für diese beiden Instanzen aktib ist, kann über seinen Status ausgelesen werden.
[oracle@rac1 ~]$ srvctl status service -d orcl -s racservice
Service racservice wird in Instanzen orcl1,orcl2 ausgeführt

oder:
[oracle@rac1 ~]$ srvctl config service -d orcl -s racservice -a
Service-Name: racservice
Service ist aktiviert
Server-Pool: orcl_racservice
Kardinalität: 2
Abmelden: false
Service-Rolle: PRIMARY
Verwaltungs-Policy: AUTOMATIC
DTP-Transaktion: false
AQ HA-Benachrichtigungen: false
Failover-Typ: NONE
Failover-Methode: NONE
TAF-Failover-Wiederholungen: 0
TAF-Failover-Verzögerung: 0
Connection Load Balancing-Ziel: LONG
Runtime Load Balancing-Ziel: NONE
TAF-Policy-Spezifikation: PRECONNECT
Bevorzugte Instanzen: orcl1,orcl2
Verfügbare Instanzen:

Demnach muss nun dieser Service auf beiden Listenern der Knoten, auf denen die Instanzen orcl1 und orcl2 laufen, registriert worden sein.

Auf Knoten rac1:

[oracle@rac1 ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 10-APR-2012 15:33:35

Copyright (c) 1991, 2009, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                10-APR-2012 13:12:16
Uptime                    0 days 2 hr. 21 min. 19 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/11.2.0/grid/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/rac1/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.20)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.220)(PORT=1521)))
Services Summary...
Service "orcl.localdomain" has 1 instance(s).
Instance "orcl1", status READY, has 1 handler(s) for this service...
Service "orclXDB.localdomain" has 1 instance(s).
Instance "orcl1", status READY, has 1 handler(s) for this service...
Service "racservice.localdomain" has 1 instance(s).
Instance "orcl1", status READY, has 1 handler(s) for this service...
The command completed successfully

Auf Knoten rac2:

[oracle@rac2 ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 10-APR-2012 15:52:37

Copyright (c) 1991, 2009, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                10-APR-2012 11:18:42
Uptime                    0 days 4 hr. 33 min. 54 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/11.2.0/grid/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/rac2/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.21)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.221)(PORT=1521)))
Services Summary...
Service "orcl.localdomain" has 1 instance(s).
Instance "orcl2", status READY, has 1 handler(s) for this service...
Service "orclXDB.localdomain" has 1 instance(s).
Instance "orcl2", status READY, has 1 handler(s) for this service...
Service "racservice.localdomain" has 1 instance(s).
Instance "orcl2", status READY, has 1 handler(s) for this service...
The command completed successfully

Da ab Oracle RAC 11g R2 SCAN (Single Client Access Name) eingeführt wurde, muss nun nicht mehr in der TNSNAMES.ORA jeder Knoten für den Service aufgenommen werden, sondern es wird sich gegen den SCAN-Listener verbunden, der wiederum die Anfrage an einen Listener weiterleitet, dessen Instanz weniger belastet ist und den angegebenen Service registriert hat. In diesem Beispiel lautet der Cluster-Name unter dem der SCAN-Listener läuft rac-scan und reagiert auf den Port 1521. Da die Zuweisung der Verbindung nun über den SCAN-Listener erfolgen kann, ist eine ausbalancierte Verbindung nun auch mit dem Easy-Connect möglich, welches unten mit dem Format host:port/service durchgeführt wird.

Abfrage des SCAN-Listeners:

LSNRCTL> set current_listener listener_scan1
Current Listener is listener_scan1
LSNRCTL> status
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER_SCAN1
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                11-APR-2012 13:30:34
Uptime                    0 days 2 hr. 52 min. 18 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/11.2.0/grid/network/admin/listener.ora
Listener Log File         /u01/app/11.2.0/grid/log/diag/tnslsnr/rac1/listener_scan1/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER_SCAN1)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.201)(PORT=1521)))
Services Summary...
Service "orcl.localdomain" has 2 instance(s).
Instance "orcl1", status READY, has 1 handler(s) for this service...
Instance "orcl2", status READY, has 1 handler(s) for this service...
Service "orclXDB.localdomain" has 2 instance(s).
Instance "orcl1", status READY, has 1 handler(s) for this service...
Instance "orcl2", status READY, has 1 handler(s) for this service...
Service "racservice.localdomain" has 2 instance(s).
Instance "orcl1", status READY, has 1 handler(s) for this service...
Instance "orcl2", status READY, has 1 handler(s) for this service...
The command completed successfully

Hauptproblem beim Easy-Connect in Verbindung mit RAC war ja, dass immer nur ein Host angesprochen wird und eine ausbalancierte Verbindungsaufnahme zu allen Instanzen somit nicht möglich war. In unserem Fall ist der Host aber nun der SCAN-Listener. Da ebenfalls der Service bei der Verbindung angegeben wird, leitet nun der SCAN-Listener die Anfrage einen lokalen Listener einer Instanz weiter, auf dem dieser Service existiert. Wir haben den Service racservice auf den Instanzen orcl1 und orcl2 erstellt und gestartet. Sollte es eine weitere Instanz, vielleicht orcl3, geben, so wird diese Instanz bei der Verbindungsaufnahme ignoriert.

Der erste Connect erfolgt an die Instanz orcl2

[oracle@rac1 ~]$ sqlplus system/oracle_4U@rac-scan:1521/racservice.localdomain

SQL*Plus: Release 11.2.0.1.0 Production on Tue Apr 10 15:54:07 2012

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl2

SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options

Der zweite Connect erfolgt an die Instanz orcl1

[oracle@rac1 ~]$ sqlplus system/oracle_4U@rac-scan:1521/racservice.localdomain

SQL*Plus: Release 11.2.0.1.0 Production on Tue Apr 10 15:54:32 2012

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl1

SQL>