Oracle RAC环境下的负载均衡通常被分为客户端负载均衡和服务端负载均衡两类。客户端负载均衡依赖tnsnames.ora中的LOAD_BALANCE参数,由客户端在地址列表中随机选择一个节点发起连接,这种方式的缺点是客户端无法感知各节点的实时负载,容易出现某个节点连接数过高而其他节点闲置的情况。服务端负载均衡则不同,它让监听器在接收连接请求后,根据各实例当前的负载状况,将连接转发给最合适的节点。本文重点讨论服务端负载均衡的实现方式、核心参数配置以及验证手段,帮助DBA构建更均衡的RAC连接环境。

服务端负载均衡与客户端负载均衡的机制差异
客户端负载均衡的工作时机发生在连接建立之前。客户端解析连接描述符中的多个地址,然后按照随机或顺序策略选择一个地址发起连接。如果被选中的节点正在运行,连接就直接建立,至于该节点是否已经承载了大量会话,客户端并不关心。一旦该节点宕机或监听器无响应,客户端才会尝试下一个地址,这属于故障转移而非负载均衡。因此客户端负载均衡是一种无状态的选择策略,它无法在运行时动态调整连接目标。
服务端负载均衡则把决策权交给监听器。当客户端连接到一个监听器时,该监听器并不会立即把连接交给本机实例,而是先查询集群中所有实例的负载信息,这些信息由各实例的后台进程PMON定期更新到监听器。监听器根据负载指标(如会话数、CPU使用率等)选出一个目标实例,然后把客户端连接重定向到该实例的本地监听器,或者直接通过调度进程建立连接。这个过程对客户端透明,客户端只需连接到一个统一的入口即可。
要实现服务端负载均衡,必须满足两个前提条件:一是各实例需要向一个或多个监听器注册自己的服务信息,二是监听器之间能够交换负载数据。在Oracle RAC 11gR2及之后的版本中,SCAN监听器提供了稳定的统一入口,而remote_listener参数则让本地监听器能够把服务注册到远程监听器上,二者配合实现了完整的服务端负载均衡体系。
配置remote_listener与SCAN监听器实现服务端负载均衡
在RAC环境中,每个节点的本地监听器负责接收本机实例的注册信息,但仅靠本地监听器无法实现跨节点的负载转发。要让监听器感知到其他节点的负载,就需要将各实例注册到同一个远程监听器上,最典型的做法是使用SCAN监听器。通过设置remote_listener参数,每个实例的PMON进程会向SCAN监听器注册,这样SCAN监听器就掌握了所有实例的负载快照,进而能够在收到客户端连接请求时做出最优选择。
以下是典型的配置步骤。首先确认SCAN监听器的名称和端口,例如通过srvctl config scan_listener查看。然后修改数据库参数,让所有实例都指向SCAN监听器地址。在Oracle 11gR2及以上版本中,默认的remote_listener通常已经指向SCAN名称,例如rac-scan:1521,但早期版本或手工搭建的环境可能需要手动设置。
-- 查看当前remote_listener参数 SQL> show parameter remote_listener; -- 设置remote_listener为SCAN监听器(示例:rac-scan为SCAN名称,1521为端口) SQL> alter system set remote_listener='rac-scan:1521' scope=both sid='*';
设置完参数后,各实例的PMON进程会在下一个周期自动向远程监听器注册。除了remote_listener,还需要确保每个节点的本地监听器正常运行。本地监听器负责接收来自SCAN监听器的重定向连接,如果本地监听器未启动或配置错误,重定向后的连接将无法建立。可以使用lsnrctl status命令检查本地监听器状态,确认服务已注册。
此外,如果使用共享服务器模式,还需要配置dispatchers参数并确保本地监听器支持转发。但大多数OLTP场景下使用专有服务器模式即可,服务端负载均衡对专有服务器同样有效。配置完成后,可以在任意节点上通过SCAN监听器连接数据库,观察连接是否被分散到不同实例。
验证连接分布效果与常见问题排查
配置生效后,需要从数据库内部和监听器层面进行双重验证。最简单的方法是连续发起多个连接,然后查询每个实例上的会话数量。在任一节点执行以下SQL,可以看到各个实例的会话分布情况。
-- 查询每个实例当前的会话数 SELECT inst_id, COUNT(*) AS session_count FROM gv$session WHERE username IS NOT NULL GROUP BY inst_id ORDER BY inst_id;
如果多次执行后各实例的会话数差异不大,说明服务端负载均衡已经在起作用。另外可以查看监听器日志,以确认是否存在重定向记录。SCAN监听器接收到连接后,如果决定转发到节点2,日志中会出现类似service_update或establishing connection的重定向条目。使用lsnrctl services可以查看远程监听器中注册的服务和实例列表,确保所有节点都注册成功。
实际使用中常见的连接失败问题多与监听器配置或网络有关。例如客户端通过SCAN名称连接时提示监听器不存在,可能是DNS解析问题,SCAN名称必须能够解析到集群中的多个IP地址。如果连接被转发到某节点后失败,检查该节点的本地监听器是否监听正确的VIP地址,以及防火墙是否放行1521端口。另一个典型问题是remote_listener指向了不存在的服务名,导致PMON注册失败,此时数据库实例仍然可以运行,但服务端负载均衡会失效,表现为所有连接都落在客户端首次选中的节点上。
还有一种情况是参数设置正确,但连接分布依然不均。这可能是因为服务端负载均衡的负载指标采集周期较长,或者各实例的负载指标本身差异不大。在较短时间窗口内,Oracle的负载均衡算法并不保证绝对均匀,只是尽量根据负载情况做出合理选择。可以通过调整监听器参数CONNECTION_LOAD_BALANCING来改变行为,在listener.ora中设置该参数为ON或OFF,但并非所有版本支持。对于大多数RAC环境,采用默认的动态负载均衡策略即可满足需求。
Oracle RAC连接负载均衡SCAN监听器修改时间:2026-09-25 02:36:58