oracle 11gR2 rac listener引入了3项主要的改变:

1. listener默认owner为grid

[oracle@db-42 ~]$ srvctl config listener
Name: LISTENER
Network: 1, Owner: grid
Home:
End points: TCP:1521

2. listener 被oracle agent 所管理 (oraagent)
[grid@db-41 admin]$ ps -ef |grep oraagent
grid 22195 18519 0 16:42 pts/0 00:00:00 grep oraagent
grid 25674 1 0 Jul17 ? 02:51:35 /data/11.2.0/grid/bin/oraagent.bin
grid 27720 1 0 Jul17 ? 00:47:49 /data/11.2.0/grid/bin/oraagent.bin
oracle 32300 1 0 Aug02 ? 01:13:35 /data/11.2.0/grid/bin/oraagent.bin

[grid@db-41 admin]$ cat endpoints_listener.ora
LISTENER_DB-41=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=db-41-vip)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=10.0.0.41)(PORT=1521)(IP=FIRST)))) # line added by Agent

3. SCAN listener被引入

关于 scan listener以下图为例

oracle 使用3个scan-ip来实现scans的HA与loadbalance架构,这里需要重点提一下

1:当scan-ip少于节点总数时候 对应的scan listener 只存在于对应节点,也就是说不可能出现one node more scans的情况

举个例子:

[grid@db-42 admin]$ crsctl stat res -t |grep -i listener
ora.LISTENER.lsnr
ora.LISTENER_SCAN1.lsnr

[grid@db-42 admin]$ crsctl stat res ora.LISTENER_SCAN1.lsnr
NAME=ora.LISTENER_SCAN1.lsnr
TYPE=ora.scan_listener.type
TARGET=ONLINE
STATE=ONLINE on db-42
TARGET=ONLINE
STATE=ONLINE on dm01db02

一个4节点rac只存在一个scan listener 此时的scan-listener存活于node2上面,因为只有一个scan-ip 也就失去了HA的功效

2:对于scan-listener多于节点数的情况,必定会出现一个节点多个scan bundle的情况。

[grid@db-42 admin]$ srvctl config scan
SCAN name: scan-ip, Network: 1/10.0.0.0/255.255.255.0/eth0
SCAN VIP name: scan1, IP: /scan-ip/10.0.0.145

可以看到对于现在的情况 只能存在one bye one的情况,对于使用多个SCAN实现HA与LB 可以通过DNS实现scan-ip动态分配。其实在exadata的默认设置中
也是使用了3个scan-ip 但是由于客户的某种问题,往往也是使用第一种情况。

[grid@dm01db02 ~]$ cat /etc/hosts |grep scan
# you will have to decide on which scan address to uncomment – choose only 1
10.0.1.205 dm01-scan.yihaodian.com dm01-scan
#10.0.1.206 dm01-scan.yihaodian.com dm01-scan
#10.0.1.207 dm01-scan.yihaodian.com dm01-scan

可以看到默认是3个scan-ip 但是由于我们DNS服务种种限制,没有使用HA架构。其实一直觉得SCAN这个东西很鸡肋,一套成熟的RAC系统
必须通过精准的应用切割实现,这也就是为什么很多RAC使用了人为控制,不让也不允许系统的自动负载均衡。不过对于exadata来说,由于
使用了RDS传输协议,使得这种影响降低了很多。

SCAN listener的连接过程如下:

1. app 通过 scan-ip 发起一个connection请求。
2. scan listener 接受并传递这个请求给 local listener.在这个过程中 scan-listener会通过负载均衡算法选择一个负载较低的local listener 传递
3. local listener 接受这个请求 从而创建了一个DB connection.

另外关于朋友提到的 Endpoints_listener 问题:

1. Endpoints_listener.ora file is there for backward compatibility with pre-11.2 databases.

2. DBCA needs to know the endpoints location to configure database parameters and tnsnames.ora file.

3. It used to use the listener.ora file, 11.2 RAC listener.ora by default only has IPC entries.

4. should not be used LSNRCTL management LISTENER, and need to use SRVCTL or CRSCTL tool management, for LSNRCTL will not recognize endpoints_listener. The information ora, cause monitoring not necessary to address, work on the port