之前有网友在我Blog 留言说我的RAC 搭建中没有写SCAN 配置,这个之前应当是有写过,但刚搜了1下,没找到,正好重新整理1下,并做下实验,实验就用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 =
(SERVICE_NAME = dave)
(failover_mode=(type=select)(method=basic))
)
)
这里的68和69 是VIP 的地址,是PUBLIC 网卡上的虚拟IP。 那我们这里只有2个节点,如果我们增加了RAC的集群数,那末就需要修改所有的客户真个配置,这个就很麻烦。
所以在Oracle 11gR2 中,引入了SCAN(Single ClientAccess Name)的特性。SCAN是1个域名,可以解析最少1个IP,最多解析3个SCAN IP,客户端可以通过这个SCAN 名字来访问数据库,另外SCAN ip必须与public ip和VIP在1个子网。
启用SCAN 以后,会在数据库与客户端之间,添加了1层虚拟的服务层,就是SCAN IP和SCAN IP Listener,在客户端仅需要配置SCAN IP的tns信息,通过SCANIP Listener,连接后台集群数据库。这样,不论集群数据库是不是有添加或删除节点的操作,均不会对客户端产生影响,也就不需要修改配置。
配置SCAN有3种方法:
1. 使用/etc/hosts文件
这个是我们目前用的最多的方式,但是缺点只能对应1个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 =
(SERVER = DEDICATED)
(SERVICE_NAME = dave)
)
)
以后RAC 增加删除节点,客户端都不需要修改。
在启用SCAN 特性以后,除多几个SCAN IP 以外,还会多几个SCAN IP Listener,每一个SCAN IP对应1个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 的工作流程图,图的右侧是1个4个节点的RAC 集群,所以有4个Local Listener。 配置了3个SCAN IP和3个 SCAN Listeners。这3个SCAN IP 是随机的落在RAC节点上。
客户端链接的时候,会随机的连接到某1个某1个SCAN IP及起对应的SCAN IP Listner上, SCAN IP Listener接收到连接要求时,会根据 LBA 算法(least loaded instance),将该客户真个连接要求,转发给对应的Instance上的VIP Listener,从而完成了全部客户端与服务器的连接进程。
简单点就是:
client -> scan listener -> locallistener -> local instance
SCAN VIP,即SCAN IP,是由DNS或GNS、hosts解析出来的IP地址。目前SCANVIP最多能有3个,它们循环地被客户端所要求到。
SCAN VIP数量和节点数没有关系,正如上图所示,4个节点,3个SCAN VIP,SCAN VIP是随机的落在哪一个节点上的,这个进程也是动态变化的。
GNS VIP同SCAN VIP, GNS VIP是提供GNS服务的IP地址,它绑定到某个节点的PUBLIC IP所在网卡上,当节点出现故障,GNS资源会自动切换到其他正常的节点继续提供GNS解析服务。如果我们不使用GNS解析方法,那末也不会存在GNS VIP。
SCAN监听器,实现SCAN的负载均衡功能。如果RAC上有3个SCAN VIP,那末SCAN监听器也有3个,它们各自监听SCAN VIP的连接要求。
SCAN监听器的注册是由REMOTE_LISTENER参数控制的,任何实例都会向所有的SCAN监听器注册,所以SCAN LISTENER 会包括所有实例的名称。
这样SCAN监听器可以实时了解所有实例的运行情况的,因此能够准确地将连接重定向到空闲服务器的本地监听器上。
SCAN监听器是随着SCAN VIP随机分配到节点服务器上,如果某个节点产生故障,运行在此节点上的SCANVIP会进行漂移,这时候候SCAN监听器也随着漂移到正常的节点上,继续为SCAN VIP监听连接要求,当PMON进程下次动态更新实例信息到该SCAN监听器以后,它又重新接受客户真个连接。
Oracle 参数,设置该参数以后,任何实例都会向SCAN监听器注册,所以SCAN监听器能够负载均衡地分发连接要求到节点本地监听器上。
由于SCAN IP有多个,他们对应的是同1个域名,因此在数据库中,需要使用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(满)