Oracle RAC 服务器端连接负载均衡(Load Balance)

Oracle RAC服务器端的负载均衡是根据RAC中各节点的连接负荷数情况,将新的连接请求分配到负荷最小的节点上去。当数据库处于运行时,RAC中各节点的PMON进程每3秒会将各自节点的连接负荷数更新到service_register。而对于节点中任意监听器故障或监听器意外失败时,PMON进程会每1秒钟检查当前节点上的监听是否重启,以获得最新的负载信息来及时调整负载均衡。本文主要演示suse 10 + oracle 10g rac下的服务器端的负载均衡。

有关客户端的负载均衡可参考
      Oracle RAC 客户端连接负载均衡(Load Balance)      配置RAC负载均衡与故障转移 
有关Oracle 网络配置相关基础以及概念性的问题请参考:
        配置ORACLE 客户端连接到数据库 
        配置非默认端口的动态服务注册 
       配置sqlnet.ora限制IP访问Oracle       Oracle 监听器日志配置与管理 
       设置 Oracle 监听器密码(LISTENER)       Oracle RAC 监听配置       ORACLE RAC 下非缺省端口监听配置(listener.ora tnsnames.ora)

一、服务器端负载均衡配置

[sql] view plain copy

print?

  1. 1、为tnsnames.ora 添加相应的网络服务名(每个节点配置)
  2. [email protected]:~> more $ORACLE_HOME/network/admin/tnsnames.ora
  3. # tnsnames.ora Network Configuration File: /u01/oracle/db/network/admin/tnsnames.ora
  4. # Generated by Oracle configuration tools.
  5. remote_lsnr_gobo4 =
  6. (ADDRESS_LIST =
  7. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.61)(PORT = 1521))
  8. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.62)(PORT = 1521))
  9. )
  10. local_lsnr_gobo4a =
  11. (ADDRESS_LIST =
  12. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.61)(PORT = 1521))
  13. )
  14. local_lsnr_gobo4b =
  15. (ADDRESS_LIST =
  16. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.62)(PORT = 1521))
  17. )
  18. 2、设置remote_listener参数
  19. alter system set remote_listener=‘<net_service_name>‘ scope=both sid=‘*‘;
  20. SQL> show parameter instance_name
  21. NAME                                 TYPE        VALUE
  22. ------------------------------------ ----------- ------------------------------
  23. instance_name                        string      GOBO4A
  24. SQL> show parameter listener
  25. NAME                                 TYPE        VALUE
  26. ------------------------------------ ----------- ------------------------------
  27. local_listener                       string
  28. remote_listener                      string
  29. SQL> alter system set remote_listener=‘remote_lsnr_gobo4‘ scope=both sid=‘*‘;
  30. System altered.
  31. 3、配置客户端tnsnames.ora
  32. -->客户端为suse 10
  33. SZDB:~ # ifconfig eth1 | grep "inet addr"|cut -d " " -f12|cut -d : -f2  #--客户端主机的ip
  34. 192.168.7.2
  35. SZDB:~ # su - oracle
  36. [email protected]:~> tail -10 $ORACLE_HOME/network/admin/tnsnames.ora
  37. GOBO4 =
  38. (DESCRIPTION =
  39. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.61)(PORT = 1521))
  40. (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.62)(PORT = 1521))
  41. (LOAD_BALANCE = off)   #--由于仅仅测试寄予服务器端的负载均衡,因此关闭客户端负载均衡选项
  42. (CONNECT_DATA =
  43. (SERVER = DEDICATED)
  44. (SERVICE_NAME = GOBO4)
  45. )
  46. )
  47. #Author : Robinson Cheng
  48. #Blog :   http://blog.csdn.net/robinson_0612
  49. 4、检查监听情况
  50. [email protected]:~> lsnrctl status
  51. Listening Endpoints Summary...
  52. (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.61)(PORT=1521)))
  53. (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.51)(PORT=1521)))
  54. Services Summary...
  55. Service "+ASM" has 1 instance(s).
  56. Instance "+ASM1", status BLOCKED, has 1 handler(s) for this service...
  57. Service "GOBO4" has 2 instance(s).
  58. Instance "GOBO4A", status READY, has 2 handler(s) for this service...
  59. Instance "GOBO4B", status READY, has 1 handler(s) for this service..
  60. .......
  61. [email protected]:~> lsnrctl status
  62. Listening Endpoints Summary...
  63. (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.62)(PORT=1521)))
  64. (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.52)(PORT=1521)))
  65. Services Summary...
  66. Service "+ASM" has 1 instance(s).
  67. Instance "+ASM2", status BLOCKED, has 1 handler(s) for this service...
  68. Service "GOBO4" has 2 instance(s).
  69. Instance "GOBO4A", status READY, has 1 handler(s) for this service...
  70. Instance "GOBO4B", status READY, has 2 handler(s) for this service...
  71. ..........
  72. #--如果监听或数据库需要重启异常请考虑重新启动监听器或数据库
  73. #--下面清空监听日志以便于后续统计连接信息
  74. [email protected]:/u01/oracle/db/network/log> cat /dev/null>listener_bo2dbp.log
  75. [email protected]:/u01/oracle/db/network/log> cat /dev/null>listener_bo2dbs.log

二、测试服务器端的负载均衡

[python] view plain copy

print?

  1. 1、从客户端建立连接
  2. [email protected]:~> more load_balance.sh
  3. #!/bin/bash
  4. for i in {1..1000}
  5. do
  6. echo $i
  7. sqlplus -S system/[email protected] <<EOF
  8. select instance_name from v\$instance;
  9. EOF
  10. sleep 1
  11. done
  12. exit 0
  13. [email protected]:~> ./load_balance.sh >srv_load_bal.log
  14. 2、分析监听日志
  15. [email protected]:/u01/oracle/db/network/log> more listener_bo2dbp.log
  16. 12-OCT-2012 12:00:10 * service_update * GOBO4B * 0   #节点bo2dbs上的实例GOBO4B的更新到bo2dbp上监听器的更新信息
  17. 12-OCT-2012 12:00:35 * service_update * GOBO4B * 0
  18. 12-OCT-2012 12:01:04 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=GOBO4)(CID=([email protected])(HOST=SZDB)
  19. (USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.2)(PORT=50322)) * establish * GOBO4 * 0
  20. 12-OCT-2012 12:01:05 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=GOBO4)(CID=([email protected])(HOST=SZDB)
  21. (USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.2)(PORT=50325)) * establish * GOBO4 * 0
  22. 12-OCT-2012 12:01:07 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=GOBO4)(CID=([email protected])(HOST=SZDB)
  23. (USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.2)(PORT=50328)) * establish * GOBO4 * 0
  24. 12-OCT-2012 12:01:08 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=GOBO4)(CID=([email protected])(HOST=SZDB)
  25. (USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.2)(PORT=50330)) * establish * GOBO4 * 0
  26. #上面的日志片断中可以看出全部是客户端发起的到bo2dbp节点上的建立连接的信息
  27. #下面来查看bo2dbs上的监听日志
  28. [email protected]:/u01/oracle/db/network/log> more listener_bo2dbs.log
  29. 12-OCT-2012 12:00:10 * service_update * GOBO4B * 0
  30. 12-OCT-2012 12:00:10 * service_update * GOBO4B * 0
  31. 12-OCT-2012 12:00:14 * (CONNECT_DATA=(CID=(PROGRAM=)(HOST=bo2dbs)(USER=oracle))(COMMAND=status)(ARGUMENTS=64)
  32. (SERVICE=LISTENER_BO2DBS)(VERSION=169870080)) * status * 0
  33. 12-OCT-2012 12:00:35 * service_update * GOBO4B * 0
  34. 12-OCT-2012 12:00:35 * service_update * GOBO4B * 0
  35. 12-OCT-2012 12:01:04 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=GOBO4)(CID=([email protected])(HOST=SZDB)
  36. (USER=oracle))(INSTANCE_NAME=GOBO4B)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.2)(PORT=61862)) * establish * GOBO4 * 0
  37. 12-OCT-2012 12:01:07 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=GOBO4)(CID=([email protected])(HOST=SZDB)
  38. (USER=oracle))(INSTANCE_NAME=GOBO4B)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.2)(PORT=61868)) * establish * GOBO4 * 0
  39. 12-OCT-2012 12:01:09 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=GOBO4)(CID=([email protected])(HOST=SZDB)
  40. (USER=oracle))(INSTANCE_NAME=GOBO4B)) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.7.2)(PORT=61872)) * establish * GOBO4 * 0
  41. #在12-OCT-2012 12:01:04时刻,连接信息中有INSTANCE_NAME=GOBO4B的连接信息,而节点bo2dbp上也有一条类似的信息,因此该条连接
  42. #日志是由节点bo2dbp转发过来而建立的连接请求。
  43. #同样在12-OCT-2012 12:01:07时刻,节点bo2dbp转发过来而建立的连接请求。
  44. #小结一下,
  45. #对于直接连接,监听器日志中将出现establish,且不含有INSTANCE_NAME=GOBO4B 字样
  46. #而对于转发的连接,则转发节点与接收的节点同时存在连接信息,转发节点上存在连接信息的与普通的连接请求一样,
  47. #而接收的节点上存在INSTANCE_NAME=<instance_name> 信息
  48. 3、检查负载均衡结果
  49. [email protected]:~> grep GOBO4A srv_load_bal.log |wc -l
  50. 755
  51. [email protected]:~> grep GOBO4B srv_load_bal.log |wc -l
  52. 245
  53. #从上面的日志文件中可知总共有755个客户端连接到了gobo4a,有245各客户端连接到了gobo4b
  54. #下面查看监听器日志来获得连接信息
  55. #下面的查询中在节点bo2dbp上总共有接受了1000个用户连接
  56. [email protected]:/u01/oracle/db/network/log> grep establish listener_bo2dbp.log |wc -l
  57. 1000
  58. #下面的查询查看是否有从节点bo2dbs转发过来的连接,结果为0,说明没有任何连接请求从bo2dbs转发过来
  59. [email protected]:/u01/oracle/db/network/log> grep INSTANCE_NAME=GOBO4 listener_bo2dbp.log |wc -l
  60. 0
  61. #接下来查看节点bo2dbs的监听日志,可以看出总共接受了245个连接请求
  62. [email protected]:/u01/oracle/db/network/log> grep establish listener_bo2dbs.log |wc -l
  63. 245
  64. #下面的过滤情况也表明在节点bo2dbs上的连接是从bo2dbp上转发的连接,而非客户端直接到bo2dbs的请求连接
  65. [email protected]:/u01/oracle/db/network/log> grep INSTANCE_NAME=GOBO4 listener_bo2dbs.log |wc -l
  66. 245
  67. #从监听器的日志检查可以,测试中的连接全部请求到节点bo2dbp,是由于tnsnames.ora中ADDRESS的第一个IP地址就是bo2dbp的IP
  68. #因此所有的连接都是请求到bo2dbp,而没有客户端发出到bo2dbs的连接请求
  69. #其次是尽管在bo2dbp有1000个连接请求,而真正建立连接的只有755个,有245转发到了节点bo2dbs

三、总结
      1、服务器端的负载均衡需要配置remote_listener参数,而该参数的值依赖于tnsnames.ora的连接字符串
      2、对于基于服务器端的连接负载均衡,监听器会根据当前节点、实例上的连接负载情况进行转发到空闲的实例
      3、转发的依据仅仅是当前节点监听的连接数量的多少,而非当前实例的过度负载
      4、从上面的测试可以得出,各个节点的连接并不算均衡,是相对的均衡,因此应结合客户端连接负载协同工作
      5、对于当前实例的过度负载的情形,应结合配置service方法来实现负载均衡

转:http://blog.csdn.net/leshami/article/details/8064599

时间: 2024-10-11 02:23:41

Oracle RAC 服务器端连接负载均衡(Load Balance)的相关文章

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

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

&quot;高可用方案工具包&quot; high availability toolkit 1.2 发布了。version 1.2 新增了 负载均衡 load balance 的技术实现

"高可用方案工具包"  high availability toolkit 1.2 发布了.version 1.2 新增了 负载均衡 load balance 的技术实现. 项目地址:     https://github.com/yfwangpeng/HighAvailabilityToolkit 实时微博:     http://weibo.com/58wp58       介平

负载均衡Load Balance学习

目录 1. 负载均衡简介 2. 负载均衡算法 3. Nginx负载均衡调度算法源码调研 1. 负载均衡简介 0x1: 负载均衡是什么 负载均衡是一种技术架构方法,它并不是具体指哪一种技术,也正是因为这样,负载均衡被运用在了很多的领域 严格来说,负载平衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载,以达到最佳化资源使用.最大化吞吐率.最小化响应时间.同时避免过载的目的,使用带有负载平衡的多个服务器组件,取代单

【58沈剑架构系列】如何实施异构服务器的负载均衡及过载保护?

零.需求缘起 第一篇文章“一分钟了解负载均衡”和大家share了互联网架构中反向代理层.站点层.服务层.数据层的常用负载均衡方法. 第二篇文章“lvs为何不能完全代替DNS轮询”和大家share了互联网接入层负载均衡需要解决的问题及架构演进. 在这两篇文章中,都强调了“负载均衡是指,将请求/数据[均匀]分摊到多个操作单元上执行,负载均衡的关键在于[均匀]”. 然而,后端的service有可能部署在硬件条件不同的服务器上: 1)如果对标最低配的服务器“均匀”分摊负载,高配的服务器的利用率不足: 2

网站架构(页面静态化,图片服务器分离,负载均衡)方案全解析

网站架构(页面静态化,图片服务器分离,负载均衡)方案全解析 文章分类:综合技术 1.HTML静态化其实大家都知道,效率最高.消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法.但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态

使用varnish的缓存功能实现后端服务器的负载均衡及资源的定向分发

结构拓扑图:使用varnish软件实现后端两台web服务器的负载均衡并实现客户端请求内容的定向分发.准备基础环境: 在三台后端服务器上安装httpd服务,其中一台作为图片服务器提供服务,另两台作为静态文本服务器. yum install -y httpd systemctl start httpd systemctl enable httpd 关闭防火墙 systemctl stop firewalld 设置selinux为disabled 三台服务器做同样设置 在图片服务器的/var/www/

部署Tomcat服务器实现负载均衡

部署tomcat及负载均衡 简介: Tomcat最初是由Sun的软件架构师詹姆斯.邓肯.戴维森开发的,Tomcat服务器是一个免费的开放源代码的web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍应用,是开发和调试jsp程序的首选,Tomcat通常是作为一个Servlet和jsp容器,单独运行在后端.主要是作为使用java程序语言开发的网站部署的web服务器. 下面通过在虚拟机中搭建实验,来说明tomcat的使用并实现tomcat服务器的负载均衡 一.部署to

双节点(nginx+keepalived)为两台apache服务器提供负载均衡

说明:本实验为双节点nginx为两台apache服务器提供负载均衡,本文不是做lvs,所以realserver不是配置在keepalived.conf而是在nginx的配置文件中upstream.此架构需考虑的问题:1)Master没挂,则Master占有vip且nginx运行在Master上2)Master挂了,则backup抢占vip且在backup上运行nginx服务3)如果master服务器上的nginx服务挂了,则vip资源转移到backup服务器上4)检测后端服务器的健康状态Mast

单节点nginx为两台apache服务器提供负载均衡

需求:本实验为单节点nginx为两台apache服务器提供负载均衡,所有配置为最简单 1.初始化3台测试server,该关的关了 [[email protected] ~]# vim /etc/hosts 192.168.1.101 ng-master 192.168.1.161 web1 192.168.1.162 web2 [[email protected] ~]# yum clean all [[email protected] ~]# systemctl stop firewalld.