Menu Close

Oracle 使用 SCANs 是如何创建数据库连接

参考Oracle官网:https://docs.oracle.com/database/121/RILIN/undrstnd.htm#RILIN1271

1. Oracle侦听器是什么

侦听器是Oracle基于服务器端的一种网络服务,主要用于侦听客户端向数据库服务器端提出的连接请求。

Oracle网络配置有三个配置文件 listener.oratnsnames.orasqlnet.ora,其目录均在$ORACLE_HOME/network/admin

Oracle客户端与服务器端的连接是通过客户端发出连接请求,由服务器端侦听器对客户端连接请求进行合法检查,如果连接请求有效,则进行连接,否则拒绝该连接。

所以你要连接远程数据库,那么远程数据库就要配置侦听器,客户端则不需要配置。

file

那它是工作原理是什么呢,接着往下看!

2. 侦听器的工作流程

2.1. 术语

  • SCAN VIP
    SCAN VIP 是在 crsctl status resource –t 命令的输出中找到的资源之一。 SCAN VIP 的数量将与设置中的 SCAN LISTENERS 数量相同。SCAN VIP 是分配给 SCAN 侦听器的物理 IP 地址。如果在 crsctl status resource –t 命令的输出中确定 SCAN VIP 在线,则 IP 地址在物理网络端口上在线。 只有当 SCAN VIP 在线时,我们才能启动 SCAN 侦听器。

  • SCAN LISTENER
    SCAN Listener 是 Oracle 组件,它使用 SCAN VIP(IP 地址)在端口(默认为 1521)上开始运行服务。 所以如果 SCAN VIP 不在线,SCAN 侦听器不会启动。 这是 SCAN 侦听器和 SCAN VIP 之间的主要区别。SCAN LISTENER 的名称称为 SCAN NAME,并在 DNS 服务器中注册。 所以简而言之,SCAN LISTENERSCAN VIP 是相互关联的。

  • Node VIP
    Node VIP(即各节点的VIP) 是当当前节点宕机时能够重定位到其他节点本地侦听器的 IP 地址。 仅使用节点 VIP 的缺点是应用服务器的 TNS 记录应该更新所有节点 VIP 地址。 您可以识别分配给Node VIP 的 IP 地址将成为 LOCAL 侦听器的一部分。 自己测试一下,在每个节点上运行 lsnrctl status ,你会发现本地侦听器有两个IP地址——1个节点IP和2个节点VIP

2.2. 流程示意图

file

2.3. 流程详细说明

根据环境,当您使用 SCAN 通过服务名称连接到 Oracle RAC 数据库时,会发生以下操作。编号的动作对应于上图中所示的箭头。

  1. 每个实例的 LREG 进程向本地节点上的默认侦听器和每个 SCAN 侦听器注册数据库服务,该侦听器由 REMOTE_LISTENER 数据库参数指定。 侦听器会根据实例和调度程序处理的工作量动态更新。

  2. 客户端使用以下形式的连接描述符发出数据库连接请求:

    orausr/@scan_name:1521/webapp

    注意:如果使用 Easy Connect 命名方法,请确保客户端上的 sqlnet.ora 文件在 NAMES.DIRECTORY_PATH 参数指定的命名方法列表中包含 EZCONNECT

  3. 客户端使用 DNS 来解析 scan_name。 DNS返回分配给SCAN的三个地址后,客户端向第一个IP地址发送连接请求。 如果连接请求失败,则客户端尝试使用下一个 IP 地址进行连接。

  4. 当连接请求成功时,客户端连接到集群的 SCAN 侦听器,该集群托管 sales 数据库并具有提供 webapp 服务的实例,在本示例中为 sales1sales2。 SCAN 侦听器比较实例 sales1sales2 的工作负载以及运行它们的节点的工作负载。 如果 SCAN 侦听器确定 node2 的负载低于 node1,则 SCAN 侦听器选择 node2并将该节点上的本地侦听器的地址发送回客户端
    file

  5. 客户端连接到 node2 上的本地侦听器。本地侦听器启动一个专用的服务器进程以连接到数据库。

  6. 客户端直接连接到 node2 上的专用服务器进程并访问 sales2 数据库实例。

3. 远程侦听器与本地侦听器(Remote_Listener 与 Local_Listener)

3.1. REMOTE_LISTENER

REMOTE_LISTENER 指定一个网络名称,该名称解析为 Oracle Net 远程侦听器的地址或地址列表(即未在与此实例相同的机器上运行的侦听器)。 地址或地址列表在 TNSNAMES.ORA 文件或为您的系统配置的其他地址存储库中指定。

远程侦听器是驻留在一台计算机上的侦听器,它将连接重定向到另一台计算机上的数据库实例。 远程侦听器通常用于 Oracle Real Application Clusters (Oracle RAC) 环境。 您可以为专用或共享服务器环境配置远程侦听器的注册,例如使用 Oracle RAC。

REMOTE_LISTENER 实际上起到一个重定向的功能,它必须和本地侦听一起才能正常工作。

当本地侦听器不能访问时(主要是禁用了本地 VIP 地址的端口),原本已经建立的连接池再次与数据库连接时可能会出现下列错误:

[c3p0] A PooledConnection that has already signalled a Connection error is still in use!
翻译:[c3p0] 已经发出连接错误信号的 PooledConnection 仍在使用中!

3.2. LOCAL_LISTENER

LOCAL_LISTENER(即单节点/RAC的本地侦听器) 指定解析为 Oracle Net 本地侦听器(即与此实例在同一台机器上运行的侦听器)的地址或地址列表的网络名称。地址或地址列表在 TNSNAMES.ORA 文件或为您的系统配置的其他地址存储库中指定。

默认情况下,PMON 进程在默认本地地址 TCP/IP 端口 1521 上向其本地侦听器注册服务信息。如果侦听器配置与数据库配置同步,则 PMON 可以向非默认本地侦听器或非默认本地侦听器注册服务信息。另一个节点上的远程侦听器。当 listener 的协议地址在 listener.ora 文件中指定,并且在初始化参数文件中指定 listener 的位置时,就会发生同步。

要让 PMON 向不使用 TCP/IP 端口 1521 的本地侦听器注册,请在初始化参数文件中配置 LOCAL_LISTENER 参数以定位本地侦听器。

如果是RAC节点,它会侦听该节点的 PUBLIC IPVIP,实例在启动的时候会向本地侦听器进行注册,也会向SCAN侦听器注册(限于11gR2以上版本)。如果RAC中某个节点发生故障,该节点的VIP会漂移到其它节点。安装后默认的本地侦听端口为1521。注意本地侦听器不会发生漂移。

4. 如何配置侦听

4.1. listener.ora-主要负责服务器端的侦听配置

1)配置的基本模板

# listener.ora Network Configuration File: /home/oracle/app/product/11/db/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER_ORA =               (注:LISTENER_ORA 为侦听名字)
(DESCRIPTION_LIST =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 12.1.4.5)(PORT = 1521))
  )
)

SID_LIST_LISTENER_ORA =     (注:LISTENER_ORA 为侦听名字)
(SID_LIST =
  (SID_DESC =
    (GLOBAL_DBNAME = wsj)
    (ORACLE_HOME = /home/oracle/app/product/11/db)
    (SID_NAME = wsj)
   )
)
ADR_BASE_LISTENER = /oracle/app/oracle

其中:

参数名 参数含义
PROTOCOL 指的是侦听接收链接的协议
HOST 是指的侦听运行的主机或者IP地址
PORT 指的是侦听运行的端口
SID_NAME 指的是侦听服务的实例名
GLOBAL_NAME 指的是侦听服务的服务名
ORACLE_HOME 指的是侦听服务的$ORACLE_HOME
  1. 如果 [侦听名]SID_LIST_[侦听名] 配置是成对出现的,这代表是静态侦听;如果listener.ora 文件只有 [侦听名] 的配置,侦听就变成动态侦听。

  2. 动态注册:客户端(sys用户)只能在远程数据库启动的情况下连接上,远程数据库关闭时客户端连接不上远程数据库。

  3. 静态注册:无论远程数据库处于开启还是关闭状态,客户端(sys用户)都可连接上。

  4. 静态注册可以在客户端控制服务器端数据库的启停,而动态注册则不可以,动态注册的侦听在实例关闭时会被注销。

  5. 数据库关闭的状态下,只有sys用户可连入数据库,其他用户不可连入。

2)当 listener.ora 配置为动态侦听时

[oracle@localhost ~]$ cd /oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/
[oracle@localhost admin]$ more listener.ora
# listener.ora Network Configuration File: /oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

ADR_BASE_LISTENER = /oracle/app/oracle

3)当 listener.ora 配置为静态侦听时
查看listener.ora : <当配置listener.ora中GLOBAL_DBNAME的值 == tnsnames.ora中的SERVICE_NAME!!!!!!!!!>

[oracle@localhost admin]$ more listener.ora
# listener.ora Network Configuration File: /oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

ADR_BASE_LISTENER = /oracle/app/oracle

SID_LIST_LISTENER =
(SID_LIST =
  (SID_DESC =
    (GLOBAL_DBNAME = mydb)   ## listener.ora 中 GLOBAL_DBNAME 的值  == tnsnames.ora中的SERVICE_NAME
    (ORACLE_HOME = /oracle/app/oracle/product/11.2.0/dbhome_1)
    (SID_NAME = mydb)  ## 可通过env | grep ORACLE 查看 SID_NAME 和 $ORACLE_HOME的值
  )
)

4.2. tnsnames.ora-主要负责客户端的侦听配置

1)基本模板:

# tnsnames.ora Network Configuration File: /home/oracle/app/product/11/db/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

# RCL为实例名
RCL =
(DESCRIPTION =
  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.30.2)(PORT = 1521))   #TNSNAME 对应的主机,端口,协议
  (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = mydb)    #可通过show parameter service_name;查询service_name 配置listener.ora中GLOBAL_DBNAME的值  == tnsnames.ora中的SERVICE_NAME   )
)

其中:

参数名 参数含义
PROTOCOL 客户端与服务器端通讯的协议,一般为TCP ,该内容一般不用改。
HOST 数据库侦听所在的机器的机器名或IP 地址,数据库侦听一般与数据库在同一个机器上,所以当我说数据库侦听所在的机器一般也是指数据库所在的机器。在UNIX 或WINDOWS 下,可以通过在数据库侦听所在的机器的命令提示符下使用 hostname 命令得到机器名,或通过 ipconfig(for WINDOWS) or ifconfig (for UNIX ) 命令得到IP 地址。需要注意的是,不管用机器名或IP 地址,在客户端一定要用 ping 命令 ping 通数据库侦听所在的机器的机器名,否则需要在 hosts 文件中加入数据库侦听所在的机器的机器名的解析。
PORT 数据库侦听正在侦听的端口,可以察看服务器端的listener.ora 文件或在数据库侦听所在的机器的命令提示符下通过lnsrctl status [listener name] 命令察看。此处Port 的值一定要与数据库侦听正在侦听的端口一样。
SERVICE_NAME 在服务器端,用system 用户登陆后,sqlplus> show parameter service_name 命令察看。
RCL 对应的本机,SALES 对应的另外一个IP 地址,里边还定义了使用主用服务器还是共享服务器模式进行连接

4.3. sqlnet.ora

是驻留在客户端机器和数据库服务器上。使用该文件存储和实现概要文件。数据库服务器可以在sqlnet.ora文件中配置访问控制参数。这些参数指定基于协议的客户机是否允许或拒绝访问。

参数名 参数含义
BEQUEATH_DETACH 控制unix系统中 signal handling 的开关,默认是 no,即signal handling 打开。DEFAULT_SDU_SIZE:指定session data unit (SDU) 的大小,单位是bytes,建议在client端和server端都设置这个参数,确保链接的时候使用相同的SDU size,如果client端和server端配置的值不匹配会使用较小的。
LOG_DIRECTORY_CLIENT/LOG_DIRECTORY_SERVER 指定客户端/server端log日志文件的位置
NAMES.DEFAULT_DOMAIN 设定客户端解析名字的域
NAMES.DIRECTORY_PATH 指定client name解析方法的次序,默认是 `NAMES.DIRECTORY_PATH=(tnsnames, onames, hostname)。取值可以是tnsnames,ldap(dictionary server),hostname/ezconnect,cds (分布式环境下),nis (Network Information Service (NIS)
SQLNET_ALLOWED_LOGON_VERSIONS 指定运行链接的oracle的版本SQLNET_ALLOWED_LOGON_VERSIONS=(10,9,8)
SQLNET.AUTHENTICATION_SERVICES 指定启动一个或多个认证服务
SQLNET.INBOUND_CONNECT_TIMEOUT 指定客户端没有链接成功超时的时间。超时之后oracle会中断链接,同时报错。
SSL_VERSION 指定ssl链接的版本
TCP.EXCLUDED_NODES 指定不允许访问oracle的节点,可以使用主机名或者IP地址
TCP.INVITED_NODES 指定允许访问db的客户端,他的优先级比TCP.EXCLUDED_NODES高。
TCP.VALIDNODE_CHECKING 使用这个参数来启用上边的两个参数。
TNSPING.TRACE_DIRECTORY 使用这个参数指定tnsping trace文件的目录,默认是$ORACLE_HOME/network/trace 目录

5. 使用 SCANs 创建数据库连接示例

现在让我们借助下图来了解 SCAN 的架构,该图服务于来自应用服务器的用户请求:
file
假设:

  • 4 节点 RAC
  • 3 个 SCAN 侦听器
  • 正在使用的 DNS 服务器
  • 应用程序的 TNS 使用 SCAN_LISTENER 作为主机名
  • 数据库是新的,没有连接

客户端实现与服务端建立连接的过程如下:

  1. 0 秒:当用户 1 尝试使用连接请求 C1 在数据库上建立会话时,它首先访问 DNS 服务器。
  2. 然后 DNS 服务器会将名称 SCAN_LISTENER 解析为第一个 IP 192.168.122.5
  3. C1 请求到达第一个扫描侦听器 SCAN1,默认名称将是 LISTENER_SCAN1,它在 192.168.122.5 SCAN VIP 上运行。
  4. SCAN1 使用来自 LBA 的详细信息,识别设置中每个节点上的负载,并将请求 C1 路由到负载最小的节点。
  5. 在这种情况下,它恰好是负载最少或无负载的节点 2,并且 C1 请求由该节点上的本地侦听器处理,这有助于 C1 在节点 2 上的实例上建立会话。
  6. 第 5 秒:当用户 2 尝试使用连接请求 C2 在数据库上建立会话时,它首先命中 DNS 服务器。
  7. DNS 服务器现在将使用循环算法并将名称 SCAN_LISTENER 解析为第二个 IP 192.168.122.6
  8. C2 请求到达第二个扫描侦听器 SCAN2,默认名称将是LISTENER_SCAN2,它在 192.168.122.6 SCAN VIP 上运行。
  9. SCAN2 使用来自 LBA 的详细信息,识别设置中每个节点上的负载,并将请求 C2 路由到负载最小的节点。
  10. 在这种情况下,它恰好是负载最少或无负载的节点 1,并且 C2 请求由该节点上的本地侦听器处理,这有助于 C2 在节点 1 上的实例上建立会话。

相同的循环和原理适用于其他 3 个连接请求 C3、C4 和 C5

附录:关联或参考文档

A. 参考

SCAN 侦听器在 Oracle RAC 11gR2 中如何工作:https://www.orskl.com/how-does-scan-listener-works-in-oracle-rac-11gr2/
SCAN,VIP,Local Listener,Remote Listener之间的关系:http://www.ohsdba.cn/index.php?m=Article&a=show&id=67

B. 单实例侦听器工作流程

file

客户端通过侦听器建立连接的基本步骤是:

  1. 客户端进程或另一个数据库请求连接。
  2. 侦听器选择一个合适的服务处理器来服务客户端请求并将请求转发给处理器。
  3. 客户端进程直接连接到服务处理程序。 收听者不再参与通信。

C. 关联的文档

清理Oracle监听日志:http://dba.qishuo.xin/?p=411
Oracle RAC 修改监听 (listener)端口:http://dba.qishuo.xin/?p=1152
使用脚本分析Oracle listener日志:http://dba.qishuo.xin/?p=417
ORA-12516:TNS:监听程序找不到符合协议堆栈要求的可用处理程序:http://dba.qishuo.xin/?p=1383