在Oracle RAC高可用架构中,网络层的两个地址对象经常被拿出来比较,那就是VIP和SCAN IP。虽然它们看起来都是可以漂移的IP,但用途和内部机制差异很大。VIP自Oracle 10g就已经存在,每个节点配置一个;SCAN IP则是从11g R2开始引入,为客户端提供统一连接入口。理解两者的区别,对于配置客户端连接、排查故障以及优化RAC高可用策略都非常关键。

一、VIP和SCAN IP的定义与资源归属
VIP即虚拟IP,是Oracle Clusterware为每个集群节点分配的一个独立IP地址。它与节点的公有IP处于同一网段,但并不直接固定在某一块物理网卡上,而是作为浮动地址由Clusterware管理。当节点正常运行时,VIP随节点启动并注册到本地监听器;当节点故障时,VIP会被自动漂移到其他存活节点。VIP的主要价值是让客户端在节点故障时能够快速收到连接错误,而不是长时间等待TCP超时。
SCAN IP是Oracle 11g Release 2引入的机制。一个集群通常配置3个SCAN IP,它们由SCAN名称解析而来,并由SCAN Listener监听。SCAN Listener并不固定在某一个节点,而是作为集群资源在多个节点间运行。客户端连接数据库时,只需要配置SCAN名称,无需关心具体节点。SCAN IP将连接请求转发到对应节点的本地监听器和VIP,从而简化了客户端连接配置。
从资源归属看,VIP属于节点级资源,通过ora.rac1.vip这类资源名管理;SCAN IP和SCAN Listener属于集群级资源,通过ora.scan1.vip和ora.LISTENER_SCAN1.lsnr管理。两者的作用域、生命周期和漂移策略都有明显差异,不能混为一谈。
二、监听与连接建立机制对比
VIP与本地监听器绑定。每个节点的本地监听器通常监听在VIP地址上,而不是物理公有IP上。这样做的目的是借助VIP的故障检测能力。当客户端连接VIP时,如果节点发生故障,VIP会迁移到其他节点。但迁移后的VIP上并没有对应的数据库实例在运行,因此客户端会立刻收到连接被拒绝或者ORA-12541之类的错误,然后尝试连接其他地址。这种方式比依赖操作系统TCP超时快得多,能够有效缩短应用侧的故障感知时间。
SCAN Listener则是一种轻量级监听器,它不直接处理数据库会话,而是将连接请求重定向到目标节点的本地监听器。监听流程大致如下:客户端向SCAN IP发起连接,SCAN Listener根据集群中服务分布情况返回一个本地监听器地址,客户端再与对应节点的VIP和本地监听器建立真正连接。这个过程称为连接重定向。SCAN机制还支持负载均衡,可以将新连接引导到负载较低的节点,避免单个节点压力过大。
可以用一个简单测试观察这种重定向。客户端TNS配置为连接SCAN名称,通过SQL*Plus建立连接后查看v$session中的服务名和实例名,会看到实际连接可能落在不同节点上。这也是RAC实现服务端负载均衡的基础。需要注意的是,SCAN Listener本身不承载最终会话,真正的数据访问仍然通过VIP和本地监听器完成。
三、故障转移行为的关键差异
VIP故障转移发生在节点异常时。Clusterware检测到节点失去心跳后,会将故障节点的VIP地址漂移到存活节点。漂移的目的是快速向后续连接该VIP的客户端返回错误,而不是让客户端一直等待。如果VIP不漂移,客户端可能因为ARP缓存和TCP超时等待几十秒甚至几分钟。因此VIP的设计原则是快速失败,让应用及时切换。
SCAN IP的故障转移属于集群资源层面的切换。SCAN Listener作为集群资源,如果所在节点故障,Clusterware会将它切换到其他节点继续运行。客户端并不感知这种切换,因为SCAN名称对应的IP地址不变,连接请求仍会被处理。但需要注意,SCAN Listener切换期间可能会有短暂的连接失败,应用需要具备重试机制,且重试间隔不宜过长。
另一种常见混淆是:有人认为SCAN IP可以替代VIP,其实并不正确。SCAN负责接收连接并分发,VIP负责最终建立数据库会话。两者协同工作,缺一不可。如果只配置SCAN而忽略VIP,或者VIP配置错误,重定向后连接仍会失败。实际排错时,如果连接在SCAN监听阶段正常,但后续无法建立会话,应优先检查各节点的VIP和本地监听器状态。
四、常用配置与查看方法
查看VIP和SCAN IP最常用的是srvctl命令。通过以下命令可以分别查看节点VIP配置、SCAN配置以及SCAN Listener状态。
# 查看某个节点的VIP配置 srvctl config vip -n rac1 # 查看SCAN配置 srvctl config scan # 查看SCAN Listener状态 srvctl status scan_listener
如果需要查看VIP资源在集群中的整体状态,可以使用crsctl stat res -t,输出中会包含ora.rac1.vip和ora.scan1.vip等资源条目。客户端连接串中,使用VIP的写法通常会把所有节点地址都列出来,例如:
RACDB_VIP =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = racdb)
)
)
而使用SCAN IP的连接串则更简洁,只需要配置SCAN名称:
RACDB_SCAN =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = racdb)
)
)
在11g R2以后,Oracle强烈推荐客户端使用SCAN连接,因为当集群增加或删除节点时,客户端无需修改连接串。但如果客户端版本较老或网络环境特殊,可能仍需使用VIP列表方式。不论哪种方式,VIP都是最终建立连接的地址,因此不能只关注SCAN而忽略VIP的健康状态。
五、总结与选型建议
VIP解决的是节点故障快速反馈问题,SCAN IP解决的是客户端连接入口简化问题。VIP绑定节点,SCAN服务集群。运维中建议同时关注两者的状态,尤其是在节点重启、网络抖动之后,及时用srvctl config和crsctl stat res -t检查资源是否正常。
对于新部署的RAC环境,客户端应优先采用SCAN名称连接,并配合服务实现负载均衡和故障转移。对于需要细粒度控制连接目标或使用较老客户端的场景,可以继续使用VIP列表,但要确保所有节点VIP都配置正确。理解两者区别,有助于在出现连接问题时快速定位是SCAN Listener分发异常,还是某个节点VIP漂移导致的服务不可用。
Oracle_RACSCAN_IPVIP修改时间:2026-08-13 04:04:42