Oracle数据库在Linux环境下的负载均衡主要通过客户端负载均衡、服务器端负载均衡(基于RAC)、第三方负载均衡软件三类方式实现,其中Oracle RAC(Real Application Clusters)+ 服务器端监听负载均衡是企业级主流方案,兼顾高可用性与性能。
Oracle RAC是实现负载均衡的核心组件,需先完成RAC集群部署,步骤如下:
/etc/hosts),设置集群节点间心跳网络(私有IP)与公共网络(对外IP)。Grid Infrastructure是RAC的基础,负责集群管理、资源监控与共享存储访问:
./runInstaller启动图形化安装向导;sudo /opt/grid/install/root.sh完成root脚本配置。./runInstaller,选择“安装Oracle Database软件+配置RAC”;racdb)、字符集(如AL32UTF8)、密码文件(SYS、SYSTEM用户);crsctl add resource ora.rac.database -type ora.database -target "racdb"创建数据库资源,完成RAC实例部署。Oracle RAC通过**监听器(Listener)**实现服务器端负载均衡,将客户端请求分发到集群中负载最小的实例。
编辑$ORACLE_HOME/network/admin/listener.ora文件,添加RAC监听器配置(支持多个节点IP):
LISTENER_RAC = (
DESCRIPTION_LIST = (
DESCRIPTION = (
ADDRESS = (PROTOCOL = TCP)(HOST = racnode1-vip)(PORT = 1521) # 节点1的VIP
ADDRESS = (PROTOCOL = TCP)(HOST = racnode2-vip)(PORT = 1521) # 节点2的VIP
)
),
SID_LIST_LISTENER_RAC = (
SID_DESC = (
SID_NAME = racdb # 数据库实例名
ORACLE_HOME = /opt/oracle/product/19.0.0/dbhome_1
GLOBAL_DBNAME = racdb # 服务名(需与tnsnames.ora一致)
)
)
)
重启监听器使配置生效:lsnrctl stop LISTENER_RAC && lsnrctl start LISTENER_RAC。
编辑客户端$ORACLE_HOME/network/admin/tnsnames.ora文件,定义RAC服务连接信息(启用负载均衡):
RACDB = (
DESCRIPTION = (
ADDRESS_LIST = (
ADDRESS = (PROTOCOL = TCP)(HOST = racnode1-vip)(PORT = 1521)
ADDRESS = (PROTOCOL = TCP)(HOST = racnode2-vip)(PORT = 1521)
)
LOAD_BALANCE = YES # 启用客户端负载均衡(随机选择节点)
),
CONNECT_DATA = (
SERVER = DEDICATED
SERVICE_NAME = racdb # 必须与服务名一致
)
)
注:
LOAD_BALANCE = YES是客户端负载均衡的关键参数,默认值为NO(顺序连接)。
若需更灵活的负载均衡策略(如权重分配、健康检查),可使用HAProxy或Nginx作为前端负载均衡器。
yum install haproxy -y(CentOS);/etc/haproxy/haproxy.cfg,添加Oracle监听配置:frontend oracle_frontend
bind *:1521
mode tcp
default_backend oracle_backend
backend oracle_backend
mode tcp
balance roundrobin # 轮询策略(可选:leastconn最少连接)
server racnode1 racnode1-ip:1521 check inter 2000 rise 2 fall 3
server racnode2 racnode2-ip:1521 check inter 2000 rise 2 fall 3
systemctl start haproxy && systemctl enable haproxy。yum install nginx -y;/etc/nginx/nginx.conf,添加stream模块配置:stream {
upstream oracle_cluster {
server racnode1-ip:1521 weight=5; # 权重分配(可选)
server racnode2-ip:1521 weight=5;
}
server {
listen 1521;
proxy_pass oracle_cluster;
}
}
systemctl start nginx && systemctl enable nginx。使用SQL*Plus从客户端连接RAC服务:
sqlplus sys/password@RACDB as sysdba
执行以下SQL查看当前连接的实例:
SELECT INSTANCE_NAME, STATUS FROM GV$INSTANCE;
多次连接后,应看到实例分布在不同节点(如racnode1、racnode2)。
在监听器节点执行:
lsnrctl status LISTENER_RAC
查看“服务摘要”中的“当前连接数”,确认连接均匀分布在各节点。
tnsnames.ora中的SERVICE_NAME与RAC数据库的GLOBAL_DBNAME一致;/etc/hosts中,避免IP变动影响连接;leastconn适合长连接);