合 Oracle rac集群中的IP类型简介
Tags: OracleLinux高可用racASM监听remote_listenerSCAN IPVIPPublic IP禁用HAIPVirtual IPHAIPGNS VIPPrivate IP
Oracle rac集群中的IP类型简介
在Oracle RAC中,Public IP、Private IP、Virtual IP、SCAN IP、GNS VIP及HAIP的作用分别是什么?
从Oracle 11g开始,安装RAC至少需要7个IP地址,两块网卡(一块公网网卡,一块私网网卡),其中public、vip和scan都在同一个网段,使用的是公网网卡,private在另一个网段,使用的是私网网卡。主机名不能包含下横线,如:RAC_01是不允许的。通过执行ifconfig -a检查两个节点的网络设备名称是否一致。另外,在配置了/etc/hosts文件后,在安装RAC之前,公网、私网共4个IP可以ping通,其它3个IP不能ping通才是正常的。
从Oracle 18c开始,scan建议至少为3个。
在安装RAC时,其IP地址的规划类似于下表所示:
其在/etc/hosts文件中的配置如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [root@raclhr-19c-n1 ~]# more /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 #Public IP 192.168.59.52 raclhr-19c-n1 192.168.59.53 raclhr-19c-n2 #Private IP 192.168.2.52 raclhr-19c-n1-priv 192.168.2.53 raclhr-19c-n2-priv #Virtual IP 192.168.59.54 raclhr-19c-n1-vip 192.168.59.55 raclhr-19c-n2-vip #Scan IP 192.168.59.56 raclhr-19c-scan 192.168.59.57 raclhr-19c-scan 192.168.59.58 raclhr-19c-scan |
下面分别介绍一下RAC环境中的几种IP及其作用。
(一)Public IP
Public IP称为公网IP,它是网卡上的真实IP。每个节点在安装Oracle软件之前都需要事先配置Public IP。Oracle通过Public IP对外提供网络服务。如果RAC中Public IP所在的网卡设备故障,那么该节点将无法继续对外提供服务,所以,建议通过开启操作系统层面的多网卡绑定技术来实现IP Failover。如果是双节点RAC环境,那么需要在tnsnames.ora文件中写入对应两个节点的Public IP、端口号以及通信协议。如果没有开启负载均衡功能(软/硬件),那么当tnsnames.ora文件中第一个ADDRESS对应的主机故障或关机,那么在客户端连接时,Oracle会等待一个网络超时,然后继续连接第二个ADDRSS对应的数据库实例。即使RAC一个节点依然可以对外提供服务,用户每次连接都需要等待几秒钟。网络超时会让用户体验相当不好。所以,在Oracle 10g RAC中VIP(Virtual IP)的出现完美地解决了这个问题。
需要注意的是,这里的Public IP不是云平台上的弹性公网IP(Elastic IP,简称EIP),在云平台上,EIP提供独立的公网IP资源,包括公网IP地址与公网出口带宽服务。可以与弹性云服务器、裸金属服务器、虚拟IP、弹性负载均衡、NAT网关等资源灵活地绑定及解绑。一个弹性公网IP只能绑定一个云资源使用。
使用EIP就可以连接到公共的网络资源,该IP是对外开放的IP,是属于收费的内容。
(二)Private IP
对于Oracle集群来说,私网通信是非常重要的,因为节点和节点之间的通信绝大部分都是要通过私网来实现的。私网通信基本上可以分为两种:第一种是集群层面之间的通信;第二种是数据库实例之间的通信。第一种通信(例如:节点间的网络心跳)的主要特点是持续存在、实时性要求高,但是数据量比较小,所以通过TCP/IP协议传递就可以了。第二种通信是缓存融合(Cache Fusion)造成的实例之间的数据传输,其特点是数据量很大,而且速度要求非常高,TCP/IP协议此时已经不能满足要求了,所以需要使用UDP或者RDS,同时Oracle也一直建议用户对集群的私网进行高可用性和负载均衡的配置。
与Public IP一样,Private IP称为私网IP或心跳IP,它也是网卡上的真实IP,每个节点在安装Oracle集群软件之前都需要事先配置Private IP。Private IP用于集群间多节点心跳同步和Cache Fusion等任务,在Oracle 12c中还需要担任Flex ASM的任务。当然,如果不设置Private IP而是由Public IP也可以去完成这些任务。但是,这样做只会使Public IP所在网卡负载过大,一旦网卡设备发生故障,集群将会分裂踢出掉一部分节点保证一致性,使RAC性能不稳定。从Oracle 11g开始,都需要配置Private IP。
对于Oracle 10g和11gR1版本的集群,Oracle并不提供私网的高可用性和负载均衡特性,而是建议用户在操作系统层面配置(例如Linux bonding、AIX etherchannel等),从而开启操作系统层面的多网卡绑定技术实现IP Failover。从Oracle 11.2.0.2版本开始推出的HAIP技术提供了私网的高可用性和负载均衡特性,从而替代了操作系统层面的网卡绑定技术,功能更强大更兼容,但是HAIP的bug较多,在云平台上安装rac,一般会禁用掉HAIP。
(三)Virtual IP(VIP)
VIP是Oracle 10g RAC的新特性,称为虚拟IP。VIP是在Public IP所在的网卡上由Oracle集群软件虚拟出来的一个IP,需要和Public IP设置在同一个子网网段中。Oracle集群软件安装之前只需定义好(/etc/hosts文件)即可,而无需事先配置。在正常情况下,VIP和Public IP的功能是一模一样的。后台进程PMON对每个节点的VIP所在的监听器注册实例信息,本地监听器中会看到两个地址host,一个是Public IP,一个是VIP。当节点故障时,Oracle集群软件会把VIP自动飘逸到其它节点上,但是本地监听器却没有飘逸到其它节点上。客户端tnsnames.ora文件中host选项不再需要配置Public IP而选择配置VIP,这样做的好处是在双节点RAC架构中当第一个节点故障时,第二个节点会有两个VIP,客户端连接第一个VIP失败后会立即连接第二个VIP对应的实例,整个切换过程是非常短暂的,用户完全感受不到RAC架构中有节点故障。整个连接过程可以说对用户是透明了。但是并非真正意义上的透明,用户还是可以知道整个RAC架构是由多少个节点组成,所以,Oracle 11g RAC中推出了SCAN IP的新概念,可以实现对用户连接的透明性,用户不再需要知道整个RAC架构中是由多少个节点组成的。
VIP的特点:
(1)VIP是通过VIPCA脚本创建的。
(2)VIP作为Nodeapps类型的CRS Resource注册到OCR中,并由CRS维护状态。
(3)VIP会绑定到节点的Public网卡上,故Public网卡有两个地址。
(4)当某个节点发生故障时,CRS会把故障节点的VIP转移到其它节点上。
(5)每个节点的LISTENER会同时监听Public网卡上的Public IP和VIP。
(6)客户端的tnsnames.ora一般会配置指向节点的VIP。
可以使用如下命令让节点1的VIP强制漂移到节点2上去:
1 | crsctl relocate resource ora.raclhr-11gr2-n1.vip -n raclhr-11gR2-N2 -f |
以下命令针对Oracle 11g版本之前:
1 | crs_relocate ora.lhr-11gr2-rac1.vip -c lhr-11gR2-rac2 -f |
(四)SCAN IP
从Oracle 11gR2 RAC开始引入SCAN(Single Client Access Name,集群的单客户端访问名称)IP的概念,相当于在客户端和数据库之间增加一层虚拟的网络服务层,即是SCAN IP和SCAP IP LISTENER。在客户端的tnsnames.ora配置文件中,只需要配置SCAN IP,然后用户即可访问数据库,并且实现了负载均衡的功能。客户端通过SCAN IP、SCAN IP LISTENER来负载均衡地连接到RAC数据库。同之前各版本的RAC相比,使用SCAN IP的好处就是,当后台RAC数据库添加、删除节点时,客户端配置信息无需修改。SCAN提供一个域名来访问RAC,域名可以解析1个到3个(注意,最多3个)SCAN IP,可以通过DNS、GNS或/etc/hosts文件来解析实现。需要注意的是,SCAN IP、VIP和Public IP必须属于同一子网。
SCAN监听器可以监听到集群中运行的所有数据库,它是实现SCAN负载均衡的原理所在。SCAN监听器跟着SCAN VIP随机分配到节点服务器上,如果某个节点发生故障,那么运行在此节点上的SCAN VIP会进行漂移,这时候SCAN监听器也跟着漂移到正常的节点上,继续为SCAN VIP监听连接请求。当PMON进程下次动态更新实例信息到该SCAN监听器之后,它又重新接收客户端的连接。这和VIP产生漂移的时候是有所区别的。
要使用SCAN IP来连接rac数据库,并且实现负载均衡的功能,那么需要在数据库中配置参数remote_listener:
1 | alter system set remote_listener='raclhr-19c-scan:1521' sid='*'; |
其中,raclhr-19c-scan是集群的scan名称。
通过设置这个参数,任何数据库实例都会向SCAN监听器注册,主要用于注册远程数据库实例,所以SCAN监听器能够负载均衡地分发连接请求到节点本地监听器上,也就是连接到其本地节点上实例上。
scan监听器的监听状态如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | [root@raclhr-19c-n1 ~]# lsnrctl status LISTENER_SCAN1 LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 02-MAR-2021 15:06:21 Copyright (c) 1991, 2019, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1))) STATUS of the LISTENER ------------------------ Alias LISTENER_SCAN1 Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production Start Date 02-MAR-2021 09:54:36 Uptime 0 days 5 hr. 11 min. 45 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/19.3.0/grid/network/admin/listener.ora Listener Log File /u01/app/grid/diag/tnslsnr/raclhr-19c-n1/listener_scan1/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER_SCAN1))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.59.56)(PORT=1521))) Services Summary... Service "86b637b62fdf7a65e053f706e80a27ca" has 2 instance(s). Instance "rac19c1", status READY, has 1 handler(s) for this service... Instance "rac19c2", status READY, has 1 handler(s) for this service... Service "9188f464f9113646e053343ba8c0fe51" has 2 instance(s). Instance "rac19c1", status READY, has 1 handler(s) for this service... Instance "rac19c2", status READY, has 1 handler(s) for this service... Service "pdblhr1" has 2 instance(s). Instance "rac19c1", status READY, has 1 handler(s) for this service... Instance "rac19c2", status READY, has 1 handler(s) for this service... Service "rac19c" has 2 instance(s). Instance "rac19c1", status READY, has 1 handler(s) for this service... Instance "rac19c2", status READY, has 1 handler(s) for this service... Service "rac19cXDB" has 2 instance(s). Instance "rac19c1", status READY, has 1 handler(s) for this service... Instance "rac19c2", status READY, has 1 handler(s) for this service... Service "rac19c_CFG" has 2 instance(s). Instance "rac19c1", status READY, has 1 handler(s) for this service... Instance "rac19c2", status READY, has 1 handler(s) for this service... The command completed successfully |
接下来做负载均衡测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [root@raclhr-19c-n2 ~]# more lhr_load_banlance.sh #!/bin/bash for i in {1..100} do echo $i sqlplus -S "sys/lhr@192.168.59.56/rac19c as sysdba" <<EOF select instance_name from v\$instance; EOF done exit 0 EOF [root@raclhr-19c-n2 ~]# chmod +x lhr_load_banlance.sh [root@raclhr-19c-n2 ~]# ./lhr_load_banlance.sh > a.txt [root@raclhr-19c-n2 ~]# more a.txt | grep rac19c1 | wc -l 42 [root@raclhr-19c-n2 ~]# more a.txt | grep rac19c2 | wc -l 58 |
可以看到,通过SCAN IP基本上是负载均衡的连接到rac的2个节点上。