O 的RAC 从8I 开始起步的,然后 9I 10G 11G 12C。目前使用的最多是11G RAC ! 刚开始使用PUBLIC IP和SID 对外提供服务。到了10G的时候出现了VIP,VIP可以漂移到别的节点上的,一当所在的节点宕机了,这不是指数据库挂了,而是服务器都挂了。监控节点是否挂的是CRS集群软件。这个跟KEEP ALIVE软件功能差不多,在VIP上面。VIP的实现完成了RAC高可用了,而11G 出现了SCAN IP和 SCAN 监听. 如今又多了一层监听。 本来官方说是解决RAC集群添加节点时候,要去修改客户端的配置。
在9I的时候 客户端配置TNS_NAME.ORA
开启FAILOVER= ON LOADBLOANCE =YES
然后在下面配置两个PUBIC IP 。如果是FAILOVER还需要配具体参数。
FAIL OVER 实现高可用,LOADBLANCE实现负载均衡。
ORACLE发展思路是,把这些在服务端进行实现。10G 只要配1个IP就行了,就可以实现高可用,那就是VIP。可负载均衡就无法实现,还得配两个VIP。
当然添加节点后,去修改应用服务器下的WEB CONFIG 却是是麻烦事情。
所以增加了个SCAN IP 来解决这个麻烦事情。
然它不当是解决了这个麻烦事情,提供了便利。同时也解决了负载均衡的问题。
先客户端或者是应用端。配置好了域名解析服务,比如说RAC-DB:1521
那么它会去找局域网中的DNS服务器,帮忙解析下,给它一个IP。
这个IP 就是SCAN IP。
应用获得了SCAN IP 然后向 这个IP 发出连接请求,给出IP 端口和服务名。
然后 SCAN LISTENER_x 收到了请求 然后结合自己身上的信息,把请求再转给VIP
监听VIP 地址的监听器收到了转发请求后,就根据自身的信息 关联到数据库实例上。
一般连接请求是: 应用->DNS->SCAN LISTENER ->LOCAL LISTENER ->DB。
本地监听就是LOCAL LISTENER 一般情况下有动态注册和静态注册两种。
liunx grid] lsnrctl status
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.0.8.192)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.0.8.194)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
Instance "+ASM2", status READY, has 1 handler(s) for this service...
Service "orcl" has 1 instance(s).
Instance "orcl2", status READY, has 1 handler(s) for this service...
Service "mysqllink" has 1 instance(s).
Instance "mysqllink", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
其中READY 是动态注册的,是DB实例自己启动后5秒才注册进去。
UNKNOWN 是静态注册,就是人工修改LISNTER.ORA
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.8.192)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = orcl2)
)
)
这样子 我们在监听配置文件上要求监听监听的IP地址 端口,对应的服务名 GLOBAL_DBNAME = ORCL
实例名:SID_NAME 然后是ORACLE_HOME目录。
这样本地监听就 知道我要监听 哪些,然后如何跟DB实例关联起来。
动态注册 是DB实例 PMON进程 向本地监听器,把服务注册到默认IP 默认端口。
如果要 动态注册改变IP 端口这些的话,那要设置参数:local_listener
(ADDRESS=(PROTOCOL=TCP)(HOST=10.0.8.194)(PORT=1522))
实际上就是让本地监听 同时监听 这个IP 这个端口的请求。
服务名来自 SERVICE_NAMES
这样我们解决了本地监听,和DB实例之间的关联关系。假如这个知识要点不懂得话,可以留言。
接下讲SCAN IP和SCAN LISTENER
RAC集群里面可以有3个SCAN IP 对应也必须有3个SCAN LISTENER 。SCAN IP 有人说是SCAN VIP ,它也像VIP样漂移。
除了两个概念外,还有个SCAN NAME。
它是对应DNS的 也对应我们实验中的/ETC/HOSTS
[oracle@rac02 log]$ srvctl config scan
SCAN name: rac-scan, Network: 1/10.0.8.0/255.255.255.0/em1
修改,启停都要涉及到它,每次都要带上它。列如
./srvctl stop scan_listener
./srvctl stop scan
./srvctl status
scan_listener
./srvctl modify scan -n rac-scan
./srvctl modify scan_listener -u
./srvctl start scan
./srvctl start scan_listener
./srvctl status
scan
./srvctl config scan
./srvctl status scan_listener
通过上面我们可以添加剩余两个SCAN VIP 它会自动扫描/etc/hosts/z中
的 rac-scan 对应的Ip
这样 SCAN NAME +SCAN IP + SCAN LISTENER 三者关联起来了。
前面 应用程序 使用SCAN NAME 通过DNS 获得SCAN IP,就跟SCAN LISTENER 关联起来了。
第三个 SCAN LISTENER 如何跟LOCAL LISTENER 关联呢?
那么就是REMOTE_LISTENER 参数 这个参数必须设置 SCAN NAME 外加端口 比如: rac-scan:1521
这个参数是远程监听的意思,向远程监听注册本实例上的服务。其实本地监听,也可以单独放在一个独立的服务器上,然后使用这个参数向其注册。那么SCAN LISTENER 也是远程监听啦!
如果给的是SCAN NAME 那该怎么获得监听所在的服务器IP呢?
一般通过 TNSNAME.ORA,etc/hosts, etc/resolv.conf 来获得。
这个动态注册,除了向远程监听器注册本实例的服务外,还要把自己的IP地址和端口告诉监听器啊?
下面TNS_NAME.ORA配置
SQL> show parameter listener
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
local_listener string
remote_listener string remote_lsnr_gobo4
more $ORACLE_HOME/network/admin/tnsnames.ora
remote_lsnr_gobo4 =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.61)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.62)(PORT = 1521))
)
那还得设置LOCAL_LISTENER ,这个参数除了向本地监听器注册监听IP,端口外,还要向远程监听器注册。通过这个参数的IP和端口。远程监听器和本地监听关联上了。
LSNRCTL> set current_listener LISTENER_SCAN1
Current Listener is LISTENER_SCAN1
LSNRCTL> service
Connecting to
(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))
Services Summary...
Service "orcl" has 1 instance(s).
Instance "orcl2", status READY, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
REMOTE SERVER
(ADDRESS=(PROTOCOL=TCP)(HOST=10.0.8.194)(PORT=1521))
The command completed successfully
负载均衡:
如果SCAN LISTENER 一个服务下面注册了多个实例的话,那么它就开启了负载均衡的功能。
[grid@vmac2 ~]$ lsnrctl status LISTENER_SCAN1
Service "orcl" 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...
同时CRS的后台进程ONS,会采集各个节点的负载状况,通知SCAN Listener,以便SCAN Listener根据负载情况,将新连接分配到当前负载最低的节点上。





