IT星球论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 169|回复: 0

Oracle RAC 客户端连接负载均衡(Load Balance)

[复制链接]

2004

主题

1

好友

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

优秀会员 助人为乐 辛勤工作 技术精英 多才多艺 优秀班竹 灌水天才 星球管理 宣传大使 灌水之王 财富勋章 版主勋章 动漫勋章 勤奋会员 论坛精英 PS高手 心 8 闪游皮肤 双鱼座 8★8➹ 志愿者 乖

发表于 2017-10-10 19:44:54 |显示全部楼层
Oracle RAC 客户端连接负载均衡(Load Balance)
    实现负载均衡(Load Balance)是Oracle RAC最重要的特性之一,主要是把负载平均分配到集群中的各个节点,以提高系统的整体吞吐能力。通常情况下有两种方式来实现负载均衡,一个是基于客户端连接的负载均衡,一个是基于服务器端IT论坛(Listener)收集到的信息来将新的连接请求分配到连接数较少实例上的实现方式。本文主要讨论的是基于客户端连接的负载均衡,并给出演示。
        与负载均衡配置之前的监听配置请参考
              ORACLE RAC 监听配置 (listener.ora tnsnames.ora)
              ORACLE RAC 下非缺省端口监听配置(listener.ora tnsnames.ora)

一、客户端的负载均衡
         客户端的负载均衡主要是通过为tnsnames.ora增加load_balance=yes条目来实现,下面看看oracle(Note:226880.1)的解释
        The client load balancing feature enables clients to randomize connection requests among the listeners. Oracle Net progresses through the list of
        protocol addresses in a random sequence, balancing the load on the various listeners. Without client load balancing, Oracle Net progresses through the
        list of protocol addresses sequentially until one succeeds.  This normally is referred to connect-time load balance.
        从上面的描述中可以得知,如果未开启load_balance=yes时,Oracle Net会根据地址列表按顺序来选择一个进行连接,直到连接成功为止。   
        如果第一个host主机连接失败,在有多个地址的情形下,接下来选择第二个地址连接,依此类推,直到连接成功为止。
        当开启了load_balance=yes时,则Oracle Net会从多个地址中随机地选择一个地址进行连接,直到连接成功为止。
        注意,此连接方式仅根据地址列表随机选择,并不考虑到各个实例上当前真正连接数量的多少,也即是没有考虑各个节点真实的连接负载情况。

二、服务器与客户端的配置情况
  1. 1、服务器端IT论坛配置
  2. oracle@bo2dbp:~> more $ORACLE_HOME/network/admin/listener.ora  --#节点bo2dbp上的listener
  3. # listener.ora.bo2dbp Network Configuration File: /u01/oracle/db/network/admin/listener.ora.bo2dbp
  4. # Generated by Oracle configuration tools.

  5. LISTENER_NEW_BO2DBP =
  6.   (DESCRIPTION_LIST =
  7.     (DESCRIPTION =
  8.       (ADDRESS = (PROTOCOL = TCP)(HOST = bo2dbp-vip.2gotrade.com)(PORT = 1314)(IP = FIRST))
  9.       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.51)(PORT = 1314)(IP = FIRST))
  10.     )
  11.   )
  12. ...........................--#其余部分省略,注意此处的配置是使用了1314的非缺省IT论坛端口号   

  13. oracle@bo2dbs:/u01/oracle/db/network/admin> more listener.ora  --#节点bo2dbs上的listener
  14. # listener.ora.bo2dbs Network Configuration File: /u01/oracle/db/network/admin/listener.ora.bo2dbs
  15. # Generated by Oracle configuration tools.

  16. LISTENER_NEW_BO2DBS =
  17.   (DESCRIPTION_LIST =
  18.     (DESCRIPTION =
  19.       (ADDRESS = (PROTOCOL = TCP)(HOST = bo2dbs-vip.2gotrade.com)(PORT = 1314)(IP = FIRST))
  20.       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.52)(PORT = 1314)(IP = FIRST))
  21.     )
  22.   )
  23. ...............

  24. 2、参数配置
  25. -->instrance ora10g1上的参数配置
  26. SQL> show parameter instance_na

  27. NAME                                 TYPE        VALUE
  28. ------------------------------------ ----------- ------------------------------
  29. instance_name                        string      ora10g1

  30. SQL> show parameter listener

  31. NAME                                 TYPE        VALUE
  32. ------------------------------------ ----------- ------------------------------
  33. local_listener                       string      local_lsnr_ora10g1
  34. remote_listener                      string      remote_lsnr_ora10g

  35. -->instrance ora10g2上的参数配置
  36. SQL> show parameter instance_name

  37. NAME                                 TYPE        VALUE
  38. ------------------------------------ ----------- ------------------------------
  39. instance_name                        string      ora10g2

  40. SQL> show parameter listener

  41. NAME                                 TYPE        VALUE
  42. ------------------------------------ ----------- ------------------------------
  43. local_listener                       string      local_lsnr_ora10g2
  44. remote_listener                      string      remote_lsnr_ora10g

  45. -->instrance ora10g2上的监听信息
  46. SQL> ho ps -ef | grep lsnr
  47. oracle   17372     1  0 11:00 ?        00:00:00 /u01/oracle/db/bin/tnslsnr LISTENER_NEW_BO2DBS -inherit
  48. oracle   17502 24301  0 12:10 pts/0    00:00:00 /bin/bash -c ps -ef | grep lsnr
  49. oracle   17504 17502  0 12:10 pts/0    00:00:00 grep lsnr

  50. SQL> ho lsnrctl status LISTENER_NEW_BO2DBS
  51. Listening Endpoints Summary...
  52.   (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.62)(PORT=1314)))
  53.   (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.52)(PORT=1314)))
  54. Services Summary...
  55. Service "ora10g" has 2 instance(s).
  56.   Instance "ora10g1", status READY, has 1 handler(s) for this service...
  57.   Instance "ora10g2", status READY, has 2 handler(s) for this service...
  58. ..........
  59.   
  60. -->由于只是测试基于客户端的load balance,因此移出remote_listener参数
  61. SQL> alter system reset remote_listener scope=both sid='*';
  62. alter system reset remote_listener scope=both sid='*'
  63. *
  64. ERROR at line 1:
  65. ORA-32009: cannot reset the memory value for instance * from instance ora10g2

  66. SQL> alter system reset remote_listener scope=spfile sid='*';

  67. System altered.

  68. SQL> ho srvctl stop database -d ora10g  -->关闭数据库ora10g

  69. SQL> ho srvctl start database -d ora10g  -->启动数据库ora10g使得刚刚修改的remote_listener生效

  70. SQL> ho lsnrctl status LISTENER_NEW_BO2DBS  -->此时可以看到只有ora10g2注册到IT论坛

  71. Listening Endpoints Summary...
  72.   (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.62)(PORT=1314)))
  73.   (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.52)(PORT=1314)))
  74. Services Summary...
  75. Service "PLSExtProc" has 1 instance(s).
  76.   Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
  77. Service "ora10g" has 1 instance(s).
  78.   Instance "ora10g2", status READY, has 1 handler(s) for this service...
  79. ..........  

  80. oracle@bo2dbp:~> lsnrctl status LISTENER_NEW_BO2DBP  #同样在节点bo2dbp也只有ora10g1注册到IT论坛

  81. Listening Endpoints Summary...
  82.   (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.61)(PORT=1314)))
  83.   (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.51)(PORT=1314)))
  84. Services Summary...
  85. Service "ora10g" has 1 instance(s).
  86.   Instance "ora10g1", status READY, has 1 handler(s) for this service...
  87. .........

  88. 3、客户端配置
  89. SZDB:~ # ifconfig eth1 | grep "inet addr"|cut -d " " -f12|cut -d : -f2  #客户端主机的ip
  90. 192.168.7.2

  91. SZDB:~ # su - oracle
  92. oracle@SZDB:~> cat /etc/hosts     --#客户端主机添加了RAC上的两个虚拟节点的ip信息
  93. 192.168.7.61   bo2dbp-vip.2gotrade.com    bo2dbp-vip
  94. 192.168.7.62   bo2dbs-vip.2gotrade.com    bo2dbs-vip

  95. oracle@SZDB:~> tail -12 $ORACLE_HOME/network/admin/tnsnames.ora

  96. ORA10G =
  97.   (DESCRIPTION =
  98.     (ADDRESS = (PROTOCOL = TCP)(HOST = bo2dbp-vip.2gotrade.com)(PORT = 1314))
  99.     (ADDRESS = (PROTOCOL = TCP)(HOST = bo2dbs-vip.2gotrade.com)(PORT = 1314))
  100.     (LOAD_BALANCE = yes)
  101.     (CONNECT_DATA =
  102.       (SERVER = DEDICATED)
  103.       (SERVICE_NAME = ora10g)
  104.     )
  105.   )

复制代码
三、测试负载均衡(load balance)
  1. 1、启用load balance的测试

  2. oracle@SZDB:~> more load_balance.sh
  3. #!/bin/bash
  4. for i in {1..100}
  5. do
  6. echo $i
  7. sqlplus -S system/oracle@ORA10G <<EOF
  8. select instance_name from v\$instance;
  9. EOF
  10. sleep 1
  11. done
  12. exit 0  

  13. # Author: Robinson Cheng
  14. # Blog :  http://blog.csdn.net/robinson_0612  
  15. oracle@SZDB:~> ./load_balance.sh >load_bal.log
  16. oracle@SZDB:~> head -20 load_bal.log
  17. 1

  18. INSTANCE_NAME
  19. ----------------
  20. ora10g2

  21. 2

  22. INSTANCE_NAME
  23. ----------------
  24. ora10g1

  25. 3

  26. INSTANCE_NAME
  27. ----------------
  28. ora10g2

  29. 4

  30. oracle@SZDB:~> grep ora10g1 load_bal.log |wc -l
  31. 47
  32. oracle@SZDB:~> grep ora10g2 load_bal.log |wc -l
  33. 53

  34. 从上面的log日志中可以看出启用客户端的负载均衡基本上使得从客户端发起连接的能够保持均衡。
  35.   
  36. 2、未启用load balance的测试  
  37. 从客户端的tnsnames.ora中移出(LOAD_BALANCE = yes)选项,然后继续使用上面的脚本来测试
  38. oracle@SZDB:~> grep ora10g1 no_load_bal.log |wc -l
  39. 100
  40. oracle@SZDB:~> grep ora10g2 no_load_bal.log |wc -l
  41. 0

  42. 从上面的日志中可以看出当移出LOAD_BALANCE = yes项后,所有的用户连接请求都被定为到ora10g1,这是因为连接请求从tnsnames.ora中选择
  43. 列在ADDRESS项中排在第一行的位置。
  44. 下面我们关闭实例ora10g1,再来测试连接情形

  45. oracle@bo2dbp:~> srvctl stop instance -d ora10g -i ora10g1

  46. oracle@SZDB:~> ./load_balance.sh >no_load_bal_new.log
  47. oracle@SZDB:~> grep ora10g1 no_load_bal_new.log |wc -l
  48. 0
  49. oracle@SZDB:~> grep ora10g2 no_load_bal_new.log |wc -l
  50. 100  

  51. 由于实例ora10g1已经关闭,因此所有的连接请求都被分配到ora10g2。
复制代码
四、总结  
1、客户端的负载均衡配置较为简单,仅仅是在客户端的tnsnames.ora添加 LOAD_BALANCE = yes |on
2、其连接分配原则是根据tnsnames.ora中连接标识符下的ADDRESS列表随机选择来进行与服务器之间的连接
3、如果选择列表中的某个节点listener或instance不可用,则再从剩余的ADDRESS列表随机选择,直到成功为止
  
五、更多参考
有关基于用户管理的备份和备份恢复的概念请参考
    Oracle 基于用户管理恢复的处理(详细描述了介质恢复及其处理)
有关RMAN的备份恢复与管理请参考
有关ORACLE体系结构请参考
Oracle RAC 客户端连接负载均衡(Load Balance)
摘自:http://blog.csdn.net/leshami/article/details/8060634
该会员没有填写今日想说内容.
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

回顶部