Oracle RAC 负载均衡使得从客户端发起的连接能够有效地分配到监听器负载较小的实例上。有两种方式实现客户端负载均衡,一是通过配置客户端的load_balance,一是通过配置服务器端的remote_listener参数。两种方式各有优劣,而且两者并不相互排斥,因此可以结合两种方式来更加有效的实现负载均衡。本文将描述两者结合的使用情况(oralce 10g rac)。
1配置需求
1. 1、服务器端各节点监听器正常提供服务,如果使用非缺省的1521端口,请参考 ORACLE RAC 下非缺省端口监听配置(listener.ora tnsnames.ora)
2. oracle@bo2dbp:~> more $ORACLE_HOME/network/admin/listener.ora
3. # listener.ora.bo2dbp Network Configuration File: /u01/oracle/db/network/admin/listener.ora.bo2dbp
4. # Generated by Oracle configuration tools.
5.
6. LISTENER_BO2DBP =
7. (DESCRIPTION_LIST =
8. (DESCRIPTION =
9. (ADDRESS = (PROTOCOL = TCP)(HOST = bo2dbp-vip.2gotrade.com)(PORT = 1521)(IP = FIRST))
10. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.51)(PORT = 1521)(IP = FIRST))
11. )
12. )
13.
14. SID_LIST_LISTENER_BO2DBP =
15. (SID_LIST =
16. (SID_DESC =
17. (SID_NAME = PLSExtProc)
18. (ORACLE_HOME = /u01/oracle/db)
19. (PROGRAM = extproc)
20. )
21. )
22.
23. oracle@bo2dbp:~> lsnrctl status
24. Service "GOBO4" has 2 instance(s).
25. Instance "GOBO4A", status READY, has 2 handler(s) for this service...
26. Instance "GOBO4B", status READY, has 1 handler(s) for this service...
27.
28. 2、服务器端的remote_listener参数设置
29. 要求remote_listener参数的连接标识符在服务器端的tnsnames.ora中有对应的条目
30.
31. SQL> show parameter listener
32.
33. NAME TYPE VALUE
34. ------------------------------------ ----------- ------------------------------
35. local_listener string
36. remote_listener string remote_lsnr_gobo4
37.
38. oracle@bo2dbp:~> more $ORACLE_HOME/network/admin/tnsnames.ora
39. # tnsnames.ora Network Configuration File: /u01/oracle/db/network/admin/tnsnames.ora
40. # Generated by Oracle configuration tools.
41. remote_lsnr_gobo4 =
42. (ADDRESS_LIST =
43. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.61)(PORT = 1521))
44. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.62)(PORT = 1521))
45. )
46.
47. 3、客户端tnsnames.ora中启用load_balance
48. oracle@SZDB:~> tail -11 $ORACLE_HOME/network/admin/tnsnames.ora
49.
50. GOBO4 =
51. (DESCRIPTION =
52. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.61)(PORT = 1521))
53. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.62)(PORT = 1521))
54. (LOAD_BALANCE = yes)
55. (CONNECT_DATA =
56. (SERVER = DEDICATED)
57. (SERVICE_NAME = GOBO4)
58. )
59. )
2测试Load Balance
1. #还是使用之前的脚步来进行测试
2. #Author : Robinson
3. #Blog : http://blog.csdn.net/robinson_0612
4. oracle@SZDB:~> more load_balance.sh
5. #!/bin/bash
6. for i in {1..1000}
7. do
8. echo $i
9. sqlplus -S system/oracle@GOBO4 <<EOF
10. select instance_name from v\$instance;
11. EOF
12. sleep 1
13. done
14. exit 0
15.
16. oracle@SZDB:~> ./load_balance.sh >load_bal.log
17.
18. #查看日志
19. oracle@SZDB:~> grep GOBO4A load_bal.log |wc -l
20. 750
21. oracle@SZDB:~> grep GOBO4B load_bal.log |wc -l
22. 250
23.
24. #查看监听器的日志
25. oracle@bo2dbp:/u01/oracle/db/network/log> grep establish listener_bo2dbp.log |wc -l
26. 894
27.
28. oracle@bo2dbp:/u01/oracle/db/network/log> grep INSTANCE_NAME=GOBO4 listener_bo2dbp.log |wc -l
29. 415
30.
31. #从上面的查询中可以得知,节点bo2dbp总共接受了894个连接请求,而有415连接请求是由bo2dbs转发过来的
32. #因此,实际上从客户端发起到bo2dbp的实际连接请求数为894-415=479
33.
34. #下面来看在节点bo2dbs上的监听日志
35. oracle@bo2dbs:/u01/oracle/db/network/log> grep establish listener_bo2dbs.log |wc -l
36. 665
37.
38. oracle@bo2dbs:/u01/oracle/db/network/log> grep INSTANCE_NAME=GOBO4 listener_bo2dbs.log |wc -l
39. 144
40. #从上面的查询中可知,节点bo2dbs总共接受了665个连接请求,而有144个连接请求是由bo2dbp转发过来的
41. #因此,实际上从客户端发起到bo2dbs的实际连接请求数为655-144=511
42.
43. #从上面的结果可知,
44. #基于客户端的连接请求数为节点bo2dbp为479,节点bo2dbs为511
45. #监听器路由到本地实例数目为,节点bo2dbp,479-144=335,节点bo2dbs,511-415=96
46. #远程监听器路由道本地实例的数据为,节点bo2dpb为415,节点bo2dbs为144
47. #监听器路由的概念是指基于服务器端的负载均衡
48. #即服务器端的监听器根据自身以及远程监听器的负载情况来确定将当前的连接请求转发到本地或远程,此即为路由。
扫描二维码关注我的微学堂
搜索刘老师微信号:Rman-2014,备注“Oracle学习与咨询”,即可添加好友;或者扫描下面二维码,关注我的“微学堂”公众号,了解最新OCP认证动态、题库及答案解析、培训机构及讲师介绍、课堂授课内容等。每天还有一篇技术文章发布哦!