Oracle RAC层面提供两种不同的方式进行负载均衡:
1.通过Connection Balancing,按照某种算法把用户分配到不同的节点。
2.通过service,在应用层上分散负载,也可认为是根据业务进行分散负载。
Connection Balancing
这种负载均衡是在用户连接这个层次进行的,在用户请求建立连接时,根据每个节点的负载决定把连接分配给哪个实例,而一旦连接建立之后,会话的所有操作都在这个实例上完成,二不会再分派给其他节点了。
1.客户端负载均衡 (Client-Side LB)
客户端负载均衡(Client -Side LB) 是 oracle 8i使用的方法,配置在客户端的tnsnames.ora文件中,加入了LOAD_BALANCE=ON条目.
当客户端发起连接时,会从地址列表中随机的选取一个,在使用随机算法把连接请求分配到各个实例。
配置示例(客户端):
breath =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = breath01-vip)(PORT = 1522))
(ADDRESS = (PROTOCOL = TCP)(HOST = breath02-vip)(PORT = 1522))
(LOAD_BALANCE = ON)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = breath)
)
)
2.服务器端均衡(Server-Side LB)
Server-Side 是从Oracle 9i 引入的。它的实现依赖于Listener收集负载信息。在数据库运行过程中,PMON后台进程会收集系统的负载信息,然后登记到listener中
最少1分钟,最多10分钟PMON就要做一个信息更新,并且如果节点负载越高,更新频率就越高,以保证listener能掌握每个节点准确的负载情况。
如果listener关闭了,PMON进程会每隔1秒钟检查listener是否重启。除了这个自动的定时更新任务外,用户也可以使用 alter system register 命令来手动进行注册
这个自动更新动作可以从listener的日志中看到,比如下面的这个listener日志片段很清楚的记录了这些动作。
注意,实例启动是PMON进程进行的第一次注册过程叫做Server-register,而后更新过程叫做service-update.
查看日志:
[grid@breath01 ~]$ tail -100 /u01/app/grid/diag/tnslsnr/breath01/listener/trace/listener.log | grep service_update
08-NOV-2017 09:28:18 * service_update * breath1 * 0
08-NOV-2017 09:33:56 * service_update * +ASM1 * 0
08-NOV-2017 09:33:57 * service_update * breath1 * 0
08-NOV-2017 09:38:19 * service_update * breath1 * 0
08-NOV-2017 09:38:22 * service_update * breath1 * 0
08-NOV-2017 09:38:34 * service_update * breath1 * 0
08-NOV-2017 09:39:04 * service_update * breath1 * 0
08-NOV-2017 09:48:22 * service_update * breath1 * 0
08-NOV-2017 09:48:31 * service_update * breath1 * 0
08-NOV-2017 09:48:58 * service_update * breath1 * 0
08-NOV-2017 09:58:25 * service_update * breath1 * 0
08-NOV-2017 09:58:37 * service_update * breath1 * 0
[grid@breath01 ~]$ cat /u01/app/grid/diag/tnslsnr/breath01/listener/trace/listener.log | grep service_register | tail -10
02-NOV-2017 10:52:07 * service_register * LsnrAgt * 0
02-NOV-2017 10:52:24 * service_register * +ASM1 * 0
02-NOV-2017 10:52:45 * service_register * breath1 * 0
02-NOV-2017 17:20:49 * service_register * breath1 * 0
03-NOV-2017 15:12:33 * service_register * LsnrAgt * 0
03-NOV-2017 15:13:01 * service_register * breath1 * 0
03-NOV-2017 15:13:03 * service_register * +ASM1 * 0
07-NOV-2017 09:39:32 * service_register * LsnrAgt * 0
07-NOV-2017 09:40:16 * service_register * +ASM1 * 0
07-NOV-2017 09:41:17 * service_register * breath1 * 0
配置方法
所有节点的tnsnames.ora文件添加以下内容:
[oracle@breath01 ~] cat c a t ORACLE_HOME/network/admin/tnsnames.ora
BREATH_REMOTE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = breath01-vip)(PORT = 1522))
(ADDRESS = (PROTOCOL = TCP)(HOST = breath02-vip)(PORT = 1522))
)
其中一个节点修改数据库remote_listener 参数。
SYS@breath1>alter system set remote_listener='BREATH_REMOTE' scope=both sid='*';
检查参数设置
SYS@breath1>show parameter remote_lis
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_listener string BREATH_REMOTE
SYS@breath2>show parameter remote_lis
NAME TYPE