1、Oracle_11gR2_SCAN_IP scan ip 配置详解在 Oracle 11gR2 以前,如果数据库采用了 RAC 架构,在客户端的 tnsnames 中,需要配置多个节点的连接信息,从而实现诸如负载均衡,failover 等等 RAC 的特性。因此,当数据库 RAC 集群需要添加或删除节点时,需要及时对客户端机器的 tns 进行更新,以免出现安全隐患。 在 11gR2 中,为了简化该项配置工作,引入了 SCAN(Single Client Access Name)的特性,该特性的好处在于,在数据库与客户端之间,添加了一层虚拟的服务层,就是所谓的scan ip 以及 scan ip
2、 listener,在客户端仅需要配置 scan ip 的 tns 信息,通过 scan ip listener,连接后台集群数据库。这样,不论集群数据库是否有添加或者删除节点的操作,均不会对 client 产生影响。 下面,具体介绍下 SCAN(Single Client Access Name)的架构以及配置。 首先,简要的看下在 11gR2 中,安装 RAC 发生的巨大变化,在 10g 以及 11gR1 的时代,安装 RAC 的步骤是先安装 CRS,再安装 DB,而到了 11gR2 的时代,crs 与 asm 被集成在一起,合称为 GRID,必须先安装 GRID 后,才能继续安装 DB,
3、否则,你就跟 11gR2 的 RAC 无缘咯。 而被 11gR2 引入的 SCAN,就是包含在安装 grid 的过程中。SCAN 的定义,有两种途径:1. 在 DNS 中定义域名。 2. 通过 oracle 提供的 Grid Naming Server(GNS)实现 DHCP 自定义。 如果通过 dns 来定义,则需要在网络中定义 3 个 SCAN IP 地址,指向同一个域名,这 3 个ip 地址必须处于同一个子网内,同时域名不能太长,否则您打字也麻烦不是,哈哈。另外,SCAN IP 是由 oracle clusterware 管理的,因此在主机的集群软件(如 IBM HACMP,HP SER
4、VICE GUARD)中不能将此 ip 配置进去,类似于 10g 中的 vip,在 grid 安装前,此 IP是无法 ping 通的。 范例: scan- IN A 192.168.1.111 IN A 192.168.1.112 IN A 192.168.1.113 如果使用 GNS 的方式,则必须有 DHCP 服务,在 cluster 的配置过程中,将会自动向 DHCP服务器申请 3 个 IP 地址作为 SCAN IP 使用。 除了 SCAN IP,在 cluster 的配置过程中,SCAN IP LISTENER 服务也会被建立,每个 SCAN IP 对应一个 SCAN IP LISTE
5、NER,并且,为了提升高可用性,3 个 SCAN IP 以及其对应的SCAN IP LISTENER 将被独立的分配到各个节点上。如果 cluster 中其中某个运行 scan ip的节点出现异常,则其余两个正常的 scan ip 节点将自动接管。注意,此处有个注意点,如果客户端是 11gR2 的版本,则客户端只需在 tns 中配置域名解析,即可实现 failover,如果客户端版本低于 11gR2,则无法通过域名解析出 3 个 SCAN IP 地址,因此如果要实现 failover,必须在客户端的 tns 中配置 3 个 SCAN IP 的地址进行解析,这也是为何 oracle 强烈建议在使
6、用 11gR2 数据库时,客户端也最好使用 11gR2 的原因。 范例: $srvctl config scan_listener SCAN Listener LISTENER_SCAN1 exists. Port: TCP:1521 SCAN Listener LISTENER_SCAN2 exists. Port: TCP:1521 SCAN Listener LISTENER_SCAN3 exists. Port: TCP:1521 $srvctl config scan SCAN name: scan-ip, Network: 1/192.168.1.0/255.255.255.0/
7、SCAN VIP name: scan1, IP: /scan- SCAN VIP name: scan2, IP: /scan- SCAN VIP name: scan3, IP: /scan- SCAN IP 在数据库中的配置方法,以及如何用 SCAN IP,配置 oracle 所谓的自动负载平衡。 既然 SCAN IP 是跟数据库 instance 无关的,例如一个 12 节点的 RAC 或者 24 节点的RAC,都只有 3 个 SCAN IP,并且 SCAN IP 是随机分布在各个 instance 的,那么,SCAN IP LISTENER 如何监听各个节点的数据库呢,同时,该怎么配
8、置哪个 instance 去哪个 SCAN IP LISTENER 注册呢。下面将一一解答。 首先,补充一个概念,在 11gR2 中,SCAN IP 是作为一个新增 IP 出现的,原有的 CRS中的 VIP 仍然存在,从这里,就能看出一点端倪,在 11gR2 的 RAC 架构中,SCAN IP 并非独立存在的,而是和原有的 VIP 结合在一起的。那么他们是如何工作的呢,先来看下下面这个工作原理图:scan ip 其实是 oracle 在客户端与数据库之间,新加的一个连接层,当有客户端访问时,连接到 SCAN IP LISTENER, 而 SCAN IP LISTENER 接收到连接请求时,会根
9、据 LBA 算法(所谓 LBA 算法,就是 least loaded instance),将该客户端的连接请求,转发给对应的 instance 上的 VIP LISTENER,从而完成了整个客户端与服务器的连接过程。简化如下: client - scan listener - local listener - local instance 了解了这个过程以后,对 SCAN IP 的整体架构,就全部清楚了。剩下的,我们再来讲一些技术细节。 SCAN IP 和 SCAN LISTENER 是独立于 RAC 的各个节点的,而每个节点的 VIP , VIP LISTENER 是跟 instance 绑
10、定的,每个节点的 VIP LISTENER,会监听自己所属节点的instance。 因此,在数据库中,我们需要设置 remote_listener 参数,这个参数设置很有讲究,因为 scan ip 有 3 个,scan listener 也有三个,但是他们对应的是同一个域名,因此,在数据库中,我们需要使用 easy connect naming method 方式,就是在 sqlnet.ora 的配置文件中,必须有 NAMES.DIRECTORY_PATH=(tnsnames,ezconnect)存在。另外,配置 remote_listener 的方式也有讲究,以前的版本中,我们通常是在tns
11、names.ora 中写好 remote_listener 的地址以及端口,但是对于 scan listener,不能这么做,必须按照标准格式,设置成 REMOTE_LISTENER=SCAN:PORT 的形式,以我的测试系统为例,就是 REMOTE_LISTENER=scan-:1521,而不需要在tnsnames.ora 中进行额外设置。 经过以上设置后,RAC 数据库的每个节点的 PMON 进程,会用广播的方式向每个 SCAN LISTENER 进行注册,同时 CRS 的后台进程 ONS,会采集各个节点的负载状况,通知 scan listener,以便 scan listener 根据负载情况,将新连接分配到当前负载最低的节点上。