Oracle 监听 (oracle Listener)

Oracle Listener

1 监听的作用

  • 监听客户端请求

    监听器运行在数据库服务器之上,与Oracle实例(可为多个)相关关联,是一个专门的进程process,在windows的服务项目或者Linux的运行进程列表中,都会看到对应的运行进程。Windows上名为TNSLSNR,Linux/Unix平台上是lsnrctl。监听器守候在服务器制定端口(默认为:1521),监听客户端的请求。

  • 为客户端请求分配Server Process

    监听器只负责接听请求,之后将请求转接给Oracle Server Process。在Oracle的服务模式下,客户端进程是不允许直接操作数据库实例和数据,而是通过一个服务进程Server Process(也称为影子进程)作为代理。监听器接受到请求之后,就向操作系统(或者Dispatcher组件)要求fork(或分配)一个Server Process与客户端相连。

  • 注册实例服务

    本质上将,listener是建立实例和客户端进程之间联系的桥梁。Listener与实例之间的联系,就是通过注册的过程来实现的。注册的过程就是实例告诉监听器,它的数据库数据库实例名称instance_name和服务名service_names。监听器注册上这样的信息,对客户端请求根据监听注册信息,找到正确的服务实例名称。目前Oracle版本中,提供动态注册和静态注册两种方式。

  • 错误转移failover

    Failover是RAC容错的一个重要方面功能,其功能是在数据库实例崩溃的时候,可以自动将请求转移到其他可用实例上的一种功能。可以提供很大程度上的可用性(Availability)功能。这个过程中,发现实例已经崩溃,并且将请求转移到其他实例上,就属于是listener的功能。

  • 负载均衡

    在RAC架构中,Oracle实现了负载均衡。当一个客户请求到来时,Oracle会根据当前RAC集群环境中所有实例的负载情况,避开负载较高的实例,将请求转移到负载较低的实例进行处理。在早期RAC版本中,负载轻重的衡量是根据监听器当前维护连接数目来确定的,而不是实时查看多实例的负载。RAC环境中的监听器之间进行沟通通信。~

2 静态监听与动态监听

  • 动态监听,指的是Oracle 实例注册到监听服务的方式是动态的,是在实例启动的过程中, 或者启动后定时由进程将实例信息注册至监听进程的监听配置,实例停止,则监听服务不再监听该实例。
  • 静态监听,指的是Oracle 实例注册至监听服务的方式是静态的,实例启动后,可手动从数据库发起注册命令,将实例注册至监听服务。 之后,监听服务则一直对该实例进行监听,与实例是否启动无关。

2.1 区别

  远程连接 信息来源 配置文件 参数
动态监听 只有数据库启动后 由PMON或者LREG根据实例参数文件中的service_name,instance_name动态注册,实例未启动,不监听任何实例 不显示配置文件 local_listener
静态监听 任何时间都可以连 根据监听的配置获取service_name,ORACLE_HOME信息,实例未启动时同样监听该实例,只是状态不是READY 显示配置文件
  1. 连接

    动态注册的监听,只有当数据库启动时,才可以远程连接。

    静态注册的监听,无论数据库是否启动,都可以连接,也就是说,可以通过静态监听远程启动停止数据库,而动态监听不可以。

  2. 注册方式

    动态监听,在Oracle 11G 及之前是通过pmon进行来进行注册的。Oracle 12C 之后,监听的注册由专有进程LREG 负责。

    静态监听,需要手动注册,手动注册语句如下:

    alter system register;
    
  3. 配置文件

    动态的配置文件,在lsnrctl status中是不显示的。而在静态监听的配置中是显示的。

  4. 参数

    动态监听最好配置local_listener,而静态监听不需要配置。local_listener

  5. 实例信息获取

    动态监听,是PMON进程根据参数文件中的service_names, instance_name 来进行注册的。

    静态监听,是通过监听的参数文件中的配置取得service_name,ORACLE_HOME 等信息,再注册到监听的。

  6. 网络

    动态监听, 只能注册到默认监听上,默认监听的是TCP协议,1521端口。如果不想默认的方式注册,则需要通过配置local_listener参数来实现。

    静态监听, 可以根据需要进行配置,是使用TCP协议 还是UDP 协议 ,使用哪个端口.

2.2 监听中的服务名和实例名

静态监听,一切基于配置文件。对于动态监听来讲,服务名和实例名是有一定识别规则的:

实例名
优先使用instance_name参数值,如果该参数没有设置,将使用db_name.
服务名
优先使用service_names参数值,如果没该参数有设置,将拼接db_unique_name和db_domain两个参数的值作为监听的service。

2.3 配置示例

 

2.3.1 静态监听

静态监听的信息是配置在listener.ora 这个参数文件中的。示例如下:

SID_LIST_LISTENER_halberd =
    (SID_LIST =
     (SID_DESC =
       (SID_NAME = PLSExtProc)
       (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
       (PROGRAM = extproc)
     )
     (SID_DESC =
       (SID_NAME = dbm012)
       (ORACLE_HOME = /u01/app/oracle/product/11.2.0.4/dbhome_1)
       (GLOBAL_DBNAME=halberd1)
     )
    )

LISTENER_FOREIGN =
    (DESCRIPTION_LIST =
     (DESCRIPTION =
       (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
       (ADDRESS = (PROTOCOL = TCP)(HOST = 172.29.30.13)(PORT = 1522))
      )
     )

2.3.2 动态监听

动态监听,是不需要配置参数文件的,最多在数据库里配置local_listener 参数。示例如下:

alter system set LOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521))';

其实我们可以看到,local_listener 的值 ,就是tnsnames 中的一部分,我们也可以通过先配置tnsnemes.ora 文件,然后设置 local_listener=$tnsnames 即可。比如:

alter system set LOCAL_LISTENER='test_dg'; -- test_dg 为tnsname.

也可以直接设置ip:port/service_name 进行配置:

alter system set local_listener='xx.xx.xx.xx:1521/service_name';

3 密码

 

3.1 设置密码

设置密码需要通过lsnrctl 命令进入交互式,然后输入change_password 或者set password 来设置新的密码:

LSNRCTL> change_password
Old password:
New password:
Reenter new password:
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ecp-uc-db1)(PORT=1521)))
Password changed for LISTENER
The command completed successfully
LSNRCTL> set password
Password:
The command completed successfully
LSNRCTL> save_config
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ecp-uc-db1)(PORT=1521)))
Saved LISTENER configuration parameters.
note
10G 数据库中,需要在参数文件中添加LOCAL_OS_AUTHENTICATION_LISTENER = OFF以关闭本地操作系统认证。

4 相关脚本

 

4.1 通过日志查看链接风暴

  • 统计每分钟连接数

    grep '13-APR-2014 19:[01-24]' ./listener.log.bak1 |awk '{print $1,$2,$6}'|awk -F":" '{print $1,":",$2}'|sort -n |uniq -c
    
  • 统计每秒每个IP的连接数

    - 10g/11G
    egrep '13-APR-2014 12:[10-24]'  ./listener.log |awk '{print $1,$2,$6}'|awk '{print $2,$3}'|awk -F'(' '{print $1 $4}'|tr -d '(ADDRESS=(PROTOCOL=tcp)(HOST='|sort -n |uniq -c
    - 12c 格式发生变化
    egrep '13-APR-2014 12:[10-24]'  ./listener.log |awk '{print $1,$2,$8}'|awk '{print $2,$3}'|awk -F'(' '{print $1 $4}'|tr -d '(ADDRESS=(PROTOCOL=tcp)(HOST='|sort -n |uniq -c
    
  • 统计时间点上用户、进程连接数

    egrep '13-APR-2014 12:18:36'  ./listener.log.bak1 |awk -F "*" '{print $2}'|awk -F'(' '{print $6 $8}'|sed 's/)/ /g'|sort -n |uniq -c
    

5 参数

 

5.1 remote_listener

该参数主要用于RAC环境中监听器的远程注册,监听器的远程注册主要用于实现负载均衡。

通常情况下,客户端发出的连接请求会首先被LOCAL_LISTENER接收,然后由Master Instance来决定当前的连接请求应该由哪个目标Instance发出Server Process响应这个连接请求。在启用了负载均衡的情形下,Master Instance会将请求转发到负载较小的实例。如果此时Remote_Listener中指定的实例负载较小,那么当前的请求会被重定向到负载较小的Instance中来建立连接,派生服务器进程进行相应连接。

REMOTE_LISTENER参数在RAC环境下非常重要,是服务器实现负载均衡的一个工具。在服务器端的连接中,Oracle NET通过remote_listener确定当前RAC中的远程监听和实例,以便分发连接。

RAC环境中的监听器可以分为本地监听器和SCAN监听器,分别对应LOCAL_LISTENER和REMOTE_LISTENER参数。

在RAC环境下不管是使用了默认的TCP和1521还是其他协议都建议配置LOCAL_LISTENER。

该参数,同时可以实现监听与实例分离,就是监听在一个节点上,而实例在另外一个节点上。

5.2 local_listener

本地监听器对应的设置参数为LOCAL_LISTENER。这个参数控制着本地监听器的注册,因为本地监听器的工作机制关系,通过本地监听器的数据库连接请求只会连接到本地节点的实例上。

RAC的每个节点上都会有独立的本地监听器,它会监听该节点的Public IP和VIP,而每个节点的实例在启动的时候也会向本地监听器进行注册,当然它也会向SCAN监听器注册,当VIP或者Public IP有连接请求的时候,本地监听器就接受处理并和本地实例建立连接。如果某个节点故障,那么其上面的VIP会进行漂移,但本地监听器并不会产生漂移。

6 scan listener

oracle11gR2 RAC开始引入scan概念,SCAN监听器可以监听到集群中运行的所有数据库,它是实现SCAN负载均衡的原理所在。 一个RAC 支持1~3个SCAN 配置,可以配置域名也可以配置IP地址,如果使用IP地址,有几个IP 配置就集群就会启动几个SCAN listener。 一般通过dns服务器或gns服务器解析scan,也可以使用/etc/hosts文件解析scan,只不过oracle官方不建议这样做。

因为域名可配置为轮询访问IP,三个IP轮流使用。假如我们配置了3个ip供SCAN 使用,同时配置了DNS 解析,监听配置中HOST的值是域名。 当其中一个IP故障不能使用时,dns 会自动解析下一个IP 地址。而且只有一个scan listener.

如果我们通过/etc/hosts ,配置3个IP地址,并为每个IP配置一个别名,集群启动后就会有三个scan 监听,当其实一个IP出现问题,无法使用时,对应的监听将失去存在的意义 。

那么怎么解决这个问题呢: 使用客户端TAF配置,来实现类似于DNS轮询功能。

这里需要说明的是,有的人认为scan ip 只能是1个或者3个,这是不对的,scan ip 可以是1至3个。也就是说可以配置2个SCANIP. 而有人把Oracle的建议当作准则和金科玉律,不去尝试,不去认知,不去了解内部真实的动作机制和原因,这样的人,你的成长是有限的。 应对局面的能力也是有限的。

scan listener 实现的功能是路由转发。将接收到的连接请求,转发到压力较小的节点的VIP上去。有研究的朋友,应该都知道, 每一个SCANIP,都对应着一个scan vip。这个SCAN VIP 就是各个节点上的VIP地址。而本地监听监听的地址包括VIP和publicIP. 当本地监听中的VIP地址被请求时,本地监听会进行认证和连接进程的建立。

为什么是转发到VIP上呢? 因为 VIP会漂移呀,很帅呀,这个IP可以继续支持业务访问。一个节点挂了,VIP漂了,pulibc ip 死了。

Author: halberd.lee

Created: 2020-08-02 Sun 11:44

Validate

原文地址:https://www.cnblogs.com/halberd-lee/p/12079480.html