首页 > 代码库 > Oracle RAC 集群 SCAN 说明
Oracle RAC 集群 SCAN 说明
1 SCAN 概述
之前有网友在我Blog 留言说我的RAC 搭建中没有写SCAN 配置,这个之前应该是有写过,但刚搜了一下,没找到,正好重新整理一下,并做下实验,实验就用Oracle 12c 进行测试。
在Oracle 11g 之前,我们去连接RAC 集群,都是配置如下的内容:
dave_rac=
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = yes)
(FAILOVER=ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.68)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.69)(PORT = 1521))
)
(CONNECT_DATA = http://www.mamicode.com/
(SERVICE_NAME = dave)
(failover_mode=(type=select)(method=basic))
)
)
这里的68和69 是VIP 的地址,是PUBLIC 网卡上的虚拟IP。 那我们这里只有2个节点,如果我们增加了RAC的集群数,那么就需要修改所有的客户端的配置,这个就很麻烦。
所以在Oracle 11gR2 中,引入了SCAN(Single ClientAccess Name)的特性。SCAN是一个域名,可以解析至少1个IP,最多解析3个SCAN IP,客户端可以通过这个SCAN 名字来访问数据库,另外SCAN ip必须与public ip和VIP在一个子网。
启用SCAN 之后,会在数据库与客户端之间,添加了一层虚拟的服务层,就是SCAN IP和SCAN IP Listener,在客户端仅需要配置SCAN IP的tns信息,通过SCANIP Listener,连接后台集群数据库。这样,不论集群数据库是否有添加或者删除节点的操作,均不会对客户端产生影响,也就不需要修改配置。
配置SCAN有3种方法:
1. 使用/etc/hosts文件
这个是我们目前用的最多的方式,但是缺点只能对应一个SCAN IP,该方法Oracle 不推荐,但是简单,不需要单独的DNS 服务器,使用该方法,客户端还是需要VIP来链接。 Oracle 推荐使用其他的2种方法来实现SCAN 功能。
2. 在DNS中定义域名,只需要在DNS中配置即可实现SCAN 功能。
3. 通过Grid Naming Server(GNS),需要配置DNS 和DHCP才能实现SCAN 功能。
配置好之后,直接在客户端的tnsnames里写SCAN NAME就可以了,如下:
RACSCAN =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan.gns.cndba.com)(PORT = 1521))
(CONNECT_DATA =http://www.mamicode.com/
(SERVER = DEDICATED)
(SERVICE_NAME = dave)
)
)
以后RAC 增加删除节点,客户端都不需要修改。
2 SCAN 工作流程
在启用SCAN 特性之后,除了多几个SCAN IP 之外,还会多几个SCAN IP Listener,每个SCAN IP对应一个SCAN IP Listener,为了性能考虑,每个SCAN IP以及其对应的SCAN IP Listener将被独立的分配到各个节点上。
如果Cluster中其中某个运行SCAN IP的节点出现异常,则其余正常的SCAN IP节点将自动接管。
如果客户端是11g R2的版本,则客户端只需在tns中配置域名解析,即可实现failover,如果客户端版本低于11g R2,则无法通过域名解析出多个SCAN IP地址,因此如果要实现failover,必须在客户端的tns中配置3个SCAN IP的地址进行解析,这也是为何Oracle强烈建议在使用11g R2数据库时,客户端也最好使用11g R2的原因。
上图是SCAN 的工作流程图,图的右边是一个4个节点的RAC 集群,所以有4个Local Listener。 配置了3个SCAN IP和3个 SCAN Listeners。这3个SCAN IP 是随机的落在RAC节点上。
客户端链接的时候,会随机的连接到某一个某一个SCAN IP及起对应的SCAN IP Listner上, SCAN IP Listener接收到连接请求时,会根据 LBA 算法(least loaded instance),将该客户端的连接请求,转发给对应的Instance上的VIP Listener,从而完成了整个客户端与服务器的连接过程。
简单点就是:
client -> scan listener -> locallistener -> local instance
3 SCAN 相关的几个名词说明
3.1 SCAN VIP
SCAN VIP,即SCAN IP,是由DNS或者GNS、hosts解析出来的IP地址。目前SCANVIP最多能有三个,它们循环地被客户端所请求到。
SCAN VIP数量和节点数没有关系,正如上图所示,4个节点,3个SCAN VIP,SCAN VIP是随机的落在哪个节点上的,这个过程也是动态变化的。
3.2 GNS VIP
GNS VIP同SCAN VIP, GNS VIP是提供GNS服务的IP地址,它绑定到某个节点的PUBLIC IP所在网卡上,当节点出现故障,GNS资源会自动切换到其他正常的节点继续提供GNS解析服务。如果我们不使用GNS解析方法,那么也不会存在GNS VIP。
3.3 SCAN LISTENER
SCAN监听器,实现SCAN的负载均衡功能。如果RAC上有三个SCAN VIP,那么SCAN监听器也有三个,它们各自监听SCAN VIP的连接请求。
SCAN监听器的注册是由REMOTE_LISTENER参数控制的,任何实例都会向所有的SCAN监听器注册,所以SCAN LISTENER 会包含所有实例的名称。
这样SCAN监听器可以实时了解所有实例的运行情况的,因此能够准确地将连接重定向到空闲服务器的本地监听器上。
SCAN监听器是跟着SCAN VIP随机分配到节点服务器上,如果某个节点发生故障,运行在此节点上的SCANVIP会进行漂移,这时候SCAN监听器也跟着漂移到正常的节点上,继续为SCAN VIP监听连接请求,当PMON进程下次动态更新实例信息到该SCAN监听器之后,它又重新接受客户端的连接。
3.4 REMOTE_LISTENER
Oracle 参数,设置该参数之后,任何实例都会向SCAN监听器注册,所以SCAN监听器能够负载均衡地分发连接请求到节点本地监听器上。
因为SCAN IP有多个,他们对应的是同一个域名,因此在数据库中,需要使用easyconnect naming method方式,需要修改sqlnet.ora的配置文件添加ezconnect,如:
NAMES.DIRECTORY_PATH=(tnsnames,ezconnect)。
设置格式:REMOTE_LISTENER=SCAN:PORT,如REMOTE_LISTENER=rac-scan.cndba.cn:1521。
配置之后,RAC数据库的每个节点的PMON进程,会用广播的方式向每个SCAN Listener进行注册,同时CRS的后台进程ONS,会采集各个节点的负载状况,通知SCAN Listener,以便SCAN Listener根据负载情况,将新连接分配到当前负载最低的节点上。
管理理论部分,就这么多,接下来,会整理2篇Oracle 12c 环境下使用DNS和GNS 实现SCAN 的Blog,具体的了解下如何实现这种功能。
参考:
Grid Infrastructure Single ClientAccess Name (SCAN) Explained (文档 ID 887522.1)
--------------------------------------------------------------------------------------------
版权所有,文章禁止转载,否则追究法律责任!
AboutDave:
--------------------------------------------------------------------------------------------
QQ: 251097186
Email: tianlesoftware@gmail.com
Blog: http://blog.csdn.net/tianlesoftware
Weibo: http://weibo.com/tianlesoftware
Twitter: http://twitter.com/tianlesoftware
Facebook: http://www.facebook.com/tianlesoftware
Linkedin: http://cn.linkedin.com/in/tianlesoftware
Dave 的QQ群:
--------------------------------------------------------------------------------------------
注意:加群必须注明表空间和数据文件关系 | 不要重复加群
CNDBA_1: 62697850 (空) CNDBA_2: 62697716 (满) CNDBA_3: 283816689
CNDBA_4: 391125754 CNDBA_5: 104207940 CNDBA_6: 62697977 CNDBA_7: 142216823(满)
Oracle RAC 集群 SCAN 说明