在 Linux 上的 Oracle 负载均衡实现路径
- Oracle RAC 原生负载均衡:包含客户端连接负载均衡与服务器端负载均衡。客户端通过在 tnsnames.ora 的地址列表上启用 LOAD_BALANCE=YES,由 SQL*Net 随机分发新连接到各节点的 VIP;服务器端由 PMON 向监听注册负载与连接数,监听依据负载将新连接定向到更空闲的实例。适用于多节点 RAC 场景,提供连接级均衡与高可用。
- SCAN 与 VIP 配合:在 11gR2+ 推荐使用 SCAN(Single Client Access Name) 统一接入,由集群 DNS/SCAN Listener 做连接分发;各节点使用 VIP 避免节点故障时的 TCP 长等待,结合 FAN/ONS 快速通知客户端故障,提升体验。
- 非 RAC 的替代方案:单实例或 DG 场景可用 HAProxy/Keepalived 等 4 层/7 层负载均衡器做连接转发(适合读写分离、应用侧连接管理),但需应用支持重连与事务一致性策略。
RAC 原生负载均衡配置步骤
- 前提:已部署 Oracle Grid Infrastructure + RAC,各节点网络与 VIP/SCAN 正常,数据库对外暴露**服务名(SERVICE_NAME)**而非实例名。
- 客户端配置(tnsnames.ora 示例)
- 服务器端负载均衡关键要点
- 验证
- 多次从客户端连接,执行
SHOW PARAMETER instance_name; 或查询 GV$SESSION 观察连接在不同实例间分布;配合 lsnrctl status 查看服务与实例注册情况。
非 RAC 场景的可选方案
- 适用:单实例、Active Data Guard 备库只读、或暂不具备 RAC 条件但需要连接分发/故障切换。
- 方案:在 Linux 上部署 HAProxy/Keepalived(4 层 TCP 转发或 7 层代理),对外暴露 VIP,后端指向多个数据库监听 VIP:1521。
- 注意:
- 负载均衡器只分发“连接”,不做 SQL 读写分离或事务粘滞;如需读写分离,应在应用或中间层实现。
- 建议开启 TCP 健康检查 与 连接复用,并合理设置超时,避免长事务被中断。
- 故障切换依赖 VIP/Keepalived 联动,应用需具备自动重连机制以容忍短暂中断。
关键参数与排错要点
- 连接串必须使用服务名(SERVICE_NAME),而非实例名;客户端启用 LOAD_BALANCE=YES 实现连接级均衡。
- 服务器端确保 remote_listeners 正确指向集群监听入口,且 PMON 已向监听注册(lsnrctl status 能看到多个实例)。
- 使用 VIP/SCAN 提升故障切换体验;结合 FAN/ONS 快速上送事件,减少客户端阻塞时间。
- 验证方法:多次新连接观察实例分布、检查监听状态与 service_register 信息、在业务低峰/高峰分别评估连接均衡度与响应时延。