Oracle 19c RAC基于服务的负载均衡核心是SERVICE_NAME,而非tnsnames.ora中的LOAD_BALANCE=on;客户端通过SERVICE_NAME连接,DBA需创建并启动服务、配置CLB_GOAL/GOAL、确保REMOTE_LISTENER指向SCAN且执行ALTER SYSTEM REGISTER,再通过lsnrctl验证load字段,缺一不可。
oracle 19c rac 基于服务的负载均衡,不是靠 tnsnames.ora 里 load_balance=on 实现的——那是客户端随机选地址,跟服务无关;真正起作用的是服务(service_name)在数据库层的配置和注册行为。
为什么 SERVICE_NAME 是核心,而不是 ADDRESS 或 LOAD_BALANCE
客户端连接时指定的 SERVICE_NAME,决定了这个连接归属哪个服务;而每个服务可独立配置运行在哪几个实例、按什么指标分发新连接(如会话数、响应时间)、是否启用跨实例故障转移。客户端连错服务名,LOAD_BALANCE=on 再对也白搭。
-
SERVICE_NAME必须由 DBA 创建并启动,不能只写在 tnsnames.ora 里就自动生效 - 一个服务可以绑定多个实例,但默认只在“首选”实例上运行;要实现跨实例负载,必须显式用
srvctl modify service启用-r(preferred)和-a(available)列表 - 服务的负载策略由
CLB_GOAL和GOAL参数控制,不是客户端参数能覆盖的
CLB_GOAL 和 GOAL 的区别与实操设置
CLB_GOAL 控制服务器端监听器如何选择实例接收新连接;GOAL 影响 FAN 事件和连接池的故障转移行为。两者常被混用,但作用层级不同。
-
CLB_GOAL = SERVICE_TIME:监听器根据各实例最近的操作平均响应时间分发连接(需启用 AWR 和服务统计) -
CLB_GOAL = THROUGHPUT:按每秒完成的事务数(TPS)分发,适合 OLTP 场景 -
GOAL = SERVICE_TIME或GOAL = NONE:影响 UCP/OJDBC 连接池是否主动重路由已建立连接(仅当配合 FAN 时生效) - 修改后必须执行
srvctl stop service→srvctl start service,否则不加载新参数
检查服务是否真正在多实例上注册并带负载信息
光看 srvctl status service 显示 “running” 不代表负载均衡生效;关键要看 SCAN Listener 是否收到了各实例的实时负载数据。
- 运行
lsnrctl status LISTENER_SCAN1 | grep -A 10 "Service \"your_service_name\"",输出中必须出现类似service_handler="DEDICATED", load=42的字段,否则说明 PMON 没上报或REMOTE_LISTENER指向错误 - 确认每个实例的
REMOTE_LISTENER指向 SCAN 地址(如scan.example.com:1521),不是 VIP 或 localhost - 改完
REMOTE_LISTENER后,必须立刻在每个实例执行ALTER SYSTEM REGISTER;,否则可能延迟数分钟才注册 - 若使用 GNS,
REMOTE_LISTENER必须指向 GNS VIP,而非 SCAN —— 静默失败,无报错日志
tnsnames.ora 里怎么写才不干扰服务级负载
客户端 TNS 配置只需保证能解析到服务,其余参数尽量精简。加错 LOAD_BALANCE=on 或 FAILOVER=on 反而可能绕过服务策略,导致连接全打到第一个注册实例。
- 推荐写法:
MYAPP = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = scan.example.com)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = myapp_svc))) - 不要在 DESCRIPTION 里加
LOAD_BALANCE=on—— 它会让客户端随机挑 SCAN 地址,而 SCAN 本身已按CLB_GOAL转发,双重随机反而失衡 - 不要用多个 ADDRESS 指向不同 VIP —— 这属于客户端轮询,和服务注册机制冲突;SCAN 就是为此设计的统一入口
- JDBC URL 中写死
jdbc:oracle:thin:@scan.example.com:1521/myapp_svc即可,无需嵌套 DESCRIPTION
服务级负载均衡的复杂点不在客户端配置,而在服务定义、实例注册状态、监听器负载字段可见性这三者的闭环验证。漏掉任意一环,比如忘了 ALTER SYSTEM REGISTER 或没在 lsnrctl status 里看到 load=xx,整个链路就断了——此时客户端连得再顺,也全是单点承接。


















