Oracle RAC集群的核心价值在于多个实例同时对外服务,但仅有多个实例还不够,必须解决两个问题:连接如何均匀分发到各个节点,以及某个节点故障后如何让会话继续工作。负载均衡负责前者,TAF透明应用故障切换负责后者。本文结合连接描述符参数和故障切换模式,说明如何在RAC环境中配置二者。

Oracle RAC负载均衡的实现机制
RAC负载均衡分为客户端负载均衡和服务端负载均衡两个层面。客户端负载均衡通过tnsnames.ora中的地址列表实现,Oracle Net在建立连接时随机选择一个地址;服务端负载均衡则由监听器根据节点实时负载把连接转发给最空闲的实例。两者可以同时启用,形成两级分发。
客户端负载均衡主要由LOAD_BALANCE=ON控制,如果地址列表包含多个SCAN IP或VIP,监听器会随机或轮询选择。服务端负载均衡依赖REMOTE_LISTENER和SCAN监听器,各实例的PMON进程会把当前负载信息注册到远程监听器,客户端连接SCAN IP后,SCAN监听器再根据服务分布将请求路由到合适节点。这是RAC区别于单实例的关键设计。
负载均衡不是简单的平均连接数,还涉及会话数、CPU负载、服务运行状态等指标。默认情况下,Oracle通过监听器统计的会话计数判断节点繁忙程度,也可以结合Oracle Clusterware的服务目标和资源管理策略,实现基于服务质量的负载分配。只有理解这些机制,才能正确解释为什么连接有时会落在不同节点。
客户端与服务端负载均衡的配置要点
客户端负载均衡配置集中在连接描述符的ADDRESS_LIST和LOAD_BALANCE参数。一个典型的tnsnames.ora条目包含两个VIP地址,开启LOAD_BALANCE=ON后,客户端会随机选择一个地址发起连接;如果第一个地址不可达,再根据FAILOVER=ON切换到下一个地址,配合CONNECT_TIMEOUT和RETRY_COUNT可以减少连接等待时间。
RACDB =
(DESCRIPTION =
(LOAD_BALANCE = ON)
(FAILOVER = ON)
(CONNECT_TIMEOUT = 3)
(RETRY_COUNT = 3)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = racdb.local)
)
)
服务端负载均衡需要数据库参数和监听配置配合。每个实例的REMOTE_LISTENER必须指向集群的SCAN监听器,同时SCAN监听器需要解析到各个VIP。可以在SQL*Plus中执行ALTER SYSTEM SET remote_listener='rac-scan:1521' SCOPE=BOTH;,然后确认每个实例的服务都注册成功。服务端负载均衡的典型表现是:客户端只连接SCAN IP,但最终会话会落在任意一个实例上。
配置完成后可通过lsnrctl services查看服务注册情况,通过v$session或应用日志观察连接分布。需要特别注意的是,客户端负载均衡与服务端负载均衡并不冲突,客户端即使指定了多个VIP,SCAN监听器也可能再次进行路由,因此生产环境建议统一使用SCAN IP,减少客户端维护成本。
TAF透明故障切换的原理与配置示例
TAF全称为Transparent Application Failover,作用是当实例发生故障时,让已经建立的会话自动切换到其他存活实例,并根据模式决定是否恢复查询结果。TAF只对连接建立后的会话生效,不能解决正在执行的事务回滚问题,事务仍需应用层捕获错误后重试。根据切换时机,TAF分为BASIC和PRECONNECT两种方式,前者在故障发生时才建立备用连接,后者会预先建立备用连接,切换速度更快但资源占用更高。
TAF通过连接描述符中的FAILOVER_MODE段落配置,TYPE可以设置为SESSION、SELECT或NONE。SESSION只恢复会话,正在执行的查询会中断;SELECT会额外恢复已经打开的游标和已返回的部分结果集,对报表类应用更友好。下面是一个完整的配置示例,演示在RAC两个节点之间同时启用负载均衡和TAF。
RACDB_TAF =
(DESCRIPTION =
(LOAD_BALANCE = ON)
(FAILOVER = ON)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = racdb.local)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)
TAF还支持RETRIES和DELAY参数,分别控制故障后重连次数和每次重连间隔。默认值通常为RETRIES=180、DELAY=5,表示最长约15分钟内持续尝试。对于需要快速失败的OLTP应用,可以调小重试次数并增加间隔,避免长时间挂起。在配置TAF后,建议使用SELECT instance_name FROM v$instance结合异常模拟进行验证,确认切换行为符合预期。
负载均衡与TAF共存时的注意事项
当RAC同时启用负载均衡和TAF时,连接建立阶段的负载均衡负责选择初始实例,TAF则在实例故障后决定切换策略。两者共用地址列表,但TAF的FAILOVER_MODE只影响已有会话,不影响新建连接。如果客户端地址列表中同时包含多个VIP,TAF会优先切换到其他VIP;如果使用SCAN IP,TAF会自动通过SCAN路由到存活实例。
一个常见的误区是认为TAF可以完全屏蔽所有故障。实际上TAF无法恢复未提交的事务,也无法恢复某些含有会话状态信息的包变量或临时表数据。对于金融、交易等高一致性场景,建议在TAF之上结合应用层重试和事务边界设计,而不是只依赖数据库层切换。另外,PRECONNECT虽然切换快,但会消耗双倍会话资源,需要根据系统承载能力选择。
在配置过程中,还要注意服务名称的一致性、远程监听器的注册状态以及防火墙策略。对于使用Oracle 12c及以上版本的环境,可以考虑使用Application Continuity替代或补充TAF,它能通过事务重放进一步降低故障影响。但就通用性和维护成本而言,TAF仍然是RAC环境中最直接的透明切换方案,配合合理的负载均衡配置,可以明显提高系统可用性。
Oracle RAC负载均衡TAF配置修改时间:2026-08-21 19:33:36