负载均衡(LB)详解

二、LB

LoadBalance就是把负载均衡分配到集群的各个节点,从而提高整体的吞吐能力。Oracle 10g
RAC提供了两种手段来实现负载,其一是通过Connection Balancing,按照某种算法把用户分配到不同的节点;其二是通过service,在应用层面上进行分散。

Connection Balancing

Connection Balancing这种负载均衡是在用户连接这个层次上进行的,也就是在用户请求建立连接时,根据每个的负载决定把连接分配到哪个实例上。而一旦建立连接之后,会话的所有操作就都在这个实力上完成,而不会再分配给其他实例。

客户端均衡(Client-Side LB)

客户端均衡(Client-Side LB)是oracle 8i使用的方法,配置方法是在客户端的tnsnames.ora文件中加入LOAD_BALANCE=YES条目。当客户端发起连接时,会从地址列表中随机选取一个,再使用随机算法吧连接请求分散到各个实例。

一个Client-Side LB的TNS配置实例如下:

TAF_SERVER =

(DESCRIPTION =

(ADDRESS= (PROTOCOL = TCP)(HOST = felix1-vip)(PORT = 1521))

(ADDRESS= (PROTOCOL = TCP)(HOST = felix2-vip)(PORT = 1521))

(LOAD_BALANCE= yes)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = taf_server)

(FAILOVER_MODE =

(TYPE = SELECT)

(METHOD = BASIC)

(RETRIES = 180)

(DELAY = 5)

)

)

)

这种方法的缺点很明显,因为在分配连接时没有考虑每个节点的真是负载,最后分配结果不一定是平衡的;并且随机算法需要长时间片,如果在短时间内同时发起多个连接,这些连接有可能都被分配到一个节点上;甚至更坏的情况下,连接可能会被分配到故障节点上。因此Oracle又引入了服务器端(Server-Side LB)方式。

总结:客户端均衡的最大缺点就是不能根据各个实例的真实负载来分散用户连接

服务器端均衡(Server-Side)

服务器端负载均衡的实现依赖于listener(监听)手机的负载信息。在数据库运行过程中,PMON后台进程会手机系统的负载信息,然后登记到Listener中。最少一分钟,最多十分钟PMON就要做一次信息更新,并且如果节点的负载越高,更新频率就越高,以保证Listener能够掌握每个节点准确的负载情况。如果Listener关闭,PMON进程会每隔1妙检查Listener是否重启,除了这个自动的、定时的更新任务外,用户也可以实用altersystem
register命令来手工进行这个过程。这个自动更新动作可以从listener的日志中看到。注意:实例启动时PMON进程进行的第一次登记过程叫做Server-Rgister,而后的更新过程叫做service-update;

TNSLSNR for Linux: Version 10.2.0.5.0 - Productionon 03-JUN-2014 11:51:54

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

System parameter file is/u01/oracle/10.2.0/db_1/network/admin/listener.ora

Log messages written to/u01/oracle/10.2.0/db_1/network/log/listener.log

Trace information written to/u01/oracle/10.2.0/db_1/network/trace/listener.trc

Trace level is currently 0

Started with pid=25371

Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=felix1)(PORT=1521)))

Listener completed notification to CRS on start

TIMESTAMP * CONNECT DATA [* PROTOCOL INFO] * EVENT[* SID] * RETURN CODE

03-JUN-2014 11:51:54 *(CONNECT_DATA=(CID=(PROGRAM=)(HOST=felix1)(USER=oracle))(COMMAND=status)(ARGUMENTS=64)(SERVICE=LISTENER)(VERSION=169870592))* status * 0

03-JUN-2014 11:52:15 * service_register * felix2 *0

03-JUN-2014 11:52:15 * service_register * felix1 *0

03-JUN-2014 11:52:15 * service_update * felix1 * 0

03-JUN-2014 11:52:15 * service_register * +ASM1 *0

Listener日志虽然记录了PMON进程的注册和更新动作,但是注册的内容却没有体现,要想获得这些内容,可以通过各种1025事件来获得,这个时间是跟中PMON活动的。

SQL> alter session set events ‘10257 trace namecontext forever,level 16‘;

Session altered.

SQL>

获取跟踪文件:

CREATE OR REPLACE FUNCTION get_trace  return varchar is

Resultvarchar2(4000);

begin

dbms_output.enable(1000000);

begin

for x in(SELECT      d.VALUE

||‘/‘

||LOWER (RTRIM (i.INSTANCE, CHR (0)))

||‘_ora_‘

||p.spid

||‘.trc‘

trace_file_name

FROM   (SELECT  p.spid

FROM   v$mystat m, v$session s,v$process p

WHERE   m.statistic# = 1 AND s.SID= m.SID AND p.addr = s.paddr) p,

(SELECT   t.INSTANCE

FROM   v$thread t, v$parameter v

WHERE   v.NAME = ‘thread‘

AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,

(SELECT   VALUE

FROM   v$parameter

WHERE   NAME = ‘user_dump_dest‘)d) loop

Result:= Result || x.trace_file_name;

End loop;

End;

return(substr(Result, 1, 4000));

end get_trace;

select get_trace from dual;

GET_TRACE

--------------------------------------------------------------------------------

/u01/oracle/admin/felix/udump/felix1_ora_27465.trc

PMON进程不仅回想本地的Listener注册,还可以向其他节点的listener注册。但到底要向何处注册,是由remote_listener和local_listener这两个参数决定。Local_Listener不用设置,而remote需要设置,参数值是一个tnsnames项。

SQL> show parameter listener

NAME                                 TYPE        VALUE

------------------------------------ -----------------------------------------

local_listener                       string      LISTENER_FELIX1

remote_listener                      string      LISTENERS_FELIX

SQL>

Tnsnames.ora中对应的LISTENERS_FELIX的内容如下:

LISTENERS_FELIX =

(ADDRESS_LIST=

(ADDRESS= (PROTOCOL = TCP)(HOST = felix1-vip)(PORT = 1521))

(ADDRESS= (PROTOCOL = TCP)(HOST = felix2-vip)(PORT = 1521))

)

有了PMON的自动注册机制后,集群的每个节点的Listener都掌握所有节点的负载状态,当收到客户端的连接请求时,就会把连接转给负载最小的节点,这个节点有可能是自己也可能是其他节点,也就是Listener会转发用户连接的请求listener的节点选择方法根据用户所请求的连接方式会有所不同:

a.       如果用户请求的是Dedicate专有连接,Listener首先选择负载最小的节点,如果多个节点负载相同,则从中选择负载最小的实例;

b.       如果用户请求的是shared server共享连接,除了做节点负载比较和实例负载比较之外,还要在所选实例上,选择最小的Dispatcher进行转发。

两种LB的配置方法:

对于client-Side LB,需要在客户的tnsnames条目中加入LOAD_BALANCE=YES。对于Server-Side LB,需要配置REMOTE_LISTENER这个参数。

在配置LB时有一点需要注意:需要从各个实例的listener文件中却掉缺省的SID_LIST_LISTENER_NAME条目,这样才能保证Listener获得的信息都是动态注册的,而不是从文件中读出的静态信息。

修改前:

[[email protected] admin]$ cat listener.ora

# listener.ora.felix2 Network Configuration File:/u01/oracle/10.2.0/db_1/network/admin/listener.ora.felix2

# Generated by Oracle configuration tools.

LISTENER_FELIX2 =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = felix2-vip)(PORT = 1521)(IP = FIRST))

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.102)(PORT = 1521)(IP =FIRST))

)

)

 

----------------------------------------

SID_LIST_LISTENER_FELIX2 =

(SID_LIST=

(SID_DESC =

(SID_NAME = PLSExtProc)

(ORACLE_HOME = /u01/oracle/10.2.0/db_1)

(PROGRAM = extproc)

)

)

[[email protected] admin]$

修改后配置如下:

[[email protected] admin]$ catlistener.ora

# listener.ora.felix2 Network Configuration File:/u01/oracle/10.2.0/db_1/network/admin/listener.ora.felix2

# Generated by Oracle configuration tools.

LISTENER_FELIX2 =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = felix2-vip)(PORT = 1521)(IP = FIRST))

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.102)(PORT = 1521)(IP =FIRST))

)

)

[[email protected] admin]$

利用service分散负载

Connection Balancing方法的不足之处,Oracle的集群时“共享一切“的架构,所有节点都共享一份磁盘数据。实例间通过cachefusion机制进行数据同步,所以RAC的性能在很大程度上受限于cache fusion的性能。因此,要提高RAC的性能可以从两方面入手,一方面提高cache fusion的能力,这可以通过更好的互联设备,比如G级的Private network,或者使用Infiniband等DRA技术;另一方面,可以尽量减少cache
fusion的流量,减少实例间的相互依赖。而service就是后一种思路基础上发展出来的。

先看一下与service非常相似的Partition技术。如果一个表中的数据量巨大,Oralce会建议采用了Partition Table,把数据按照一定的规律分散到多个物理段(Segment)中,这样访问数据时就限制在某些个局部的Segment上。

把“分散数据“思想机一部提升,在RAC环境中,如果能够把数据按照应用进行分离,考虑下面这个场景:一个ERP应用包括生产、销售、供应链管理多个模块。假设这个数据库采用了2节点的RAC在没有进行“数据分散”之前,两个用户都使用销售模块,那么这两个用户就可能被分配到两个节点上,在操作过程中,销售数据就要在cache fusion的作用下,不断在两个节点间传递,如果有来了另外两个生产模块的用户,这两个用户又被分配到两个节点上,在操作的过程中,生产部分的数据又要在Cache
fusion的协助下在两个实力之间同步。

可见,如果仅有connectionbalance一种机制,表面上看起来用户是被分配到了不同的实例上,似乎负载被分散了。但是这种分散是没有结合每个用户的业务需求进行的,是一种纯技术手段(因此可以把它叫做纯技术手段分散)。

如果换一种解决思想,假如把销售模块的用户都分配到节点1上,生产模块的用户都分配到节点2上,在假设这两个模块之间的数据交叉不多,这是销售模块的数据都集中在节点1上,生产库模块的数据都集中在节点2上,cachefusion的工作量就会急剧减少,这就从根本上解决了性能的问题。

这个思想是借助于service分散负载的基本思想。通过把应用按照功能模块进行划分成Service,进而把每个service固定在某些RAC节点上,从而从根本上提供系统的性能。这种分散负载的方法不是仅靠DBA进行配置就能完成的,需要DBA和开发人员合作,在了解业务数据特点之后才能看到效果。

在RAC环境下,Service并不是必须的,但是如果借助service对应用的划分,相信对整个系统性能的提升是大有裨益的。使用service还有另外一个好处:可以在数据库内部创建Service的TAF参数,如果在客户端通过service连接数据库,客户端tnsnames.ora中就不再需要FAIL-OVER的许多设置。

如果使用service方法,客户端配置需要使用service_name条目,例如下面的红字部分:

TAF_SERVER =

(DESCRIPTION =

(ADDRESS= (PROTOCOL = TCP)(HOST = felix1-vip)(PORT = 1521))

(ADDRESS= (PROTOCOL = TCP)(HOST = felix2-vip)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

  (SERVICE_NAME = taf_server)

)

)

详细探究参考《大话RAC》张晓明  p238~242,讲的特别好!!!!

负载均衡(LB)详解

时间: 2024-11-05 14:46:04

负载均衡(LB)详解的相关文章

Nginx的负载均衡方案详解

Nginx的负载均衡方案详解 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Nginx的负载均衡方案有: 1.轮询 轮询即Round Robin,根据Nginx配置文件中的顺序,依次把客户端的Web请求分发到不同的后端服务器. 配置的例子如下: http{ upstream sampleapp { server <<dns entry or IP Address(optional with port)>>; server <&l

Centos 7基于DR(直接路由)模式的负载均衡配置详解

DR(直接路由)是三种负载均衡模式其中之一,也是使用最多的一种模式,关于该模式的介绍,可以参考博文:LVS负载均衡群集详解. DR的工作模式示意图如下: 该模式的原理已经在上面链接的博文中写了下来.现在直接搭建一个基于DR模式的负载均衡群集. 环境如下: 在上面这个环境中,需要解决的问题有下面几点: 1.所有web节点和调度器都配置上VIP:客户端访问VIP(群集的虚拟IP地址)时,若是 调度器将请求转发给web节点,然后由web节点直接去响应客户端,那么客户端在收到 数据包后,发现收到的数据包

集群之LVS(负载均衡)详解

提高服务器响应能力的方法 scale on  在原有服务器的基础上进行升级或者直接换一台新的性能更高的服务器. scale out  横向扩展,将多台服务器并发向外响应客户端的请求.优点:成本低,扩展架构比较简单. 集群(Cluster),通俗地讲就是按照某种组织方式将几台电脑组织起来完成某种特定任务的这样一种架构. 三种集群类型: LB,Load Balancing 负载均衡:在一定程度上能够实现高可用的目的. HA,High Availability 高可用:实时在线,能够及时响应客户端请求

Tomcat负载均衡原理详解及配置

结构图 使用Tomcat的童鞋们注意了.为了增加tomcat的性能和稳定性,我们一般采用balance和session同步机制. 下图列出了我们常用也是最简单的解决方案. 说明 1 balance 负载均衡我们一般采用Apache proxy和Apache+mod_jk方式 所使用软件:Apache2.2.19 http://httpd.apache.org/download.cgi#apache22; Tomcat7          http://tomcat.apache.org/down

Windows 08 R2_NLB负载均衡(图文详解)

目录 目录 Load Balance 使用NLB来部署Web Farm集群 环境准备 在Win08r2pc1中配置DNS服务 在Win08r2pc1中部署File Service文件服务 在Win08r2pc1中部署IIS Web服务 在win08r2pc2上部署IIS Web服务 配置共享的站点文件夹 win08r2pc1中的web共享配置 win08r2pc2中的web共享配置 创建NLB集群 NLB的高级管理 编辑端口规则 Load Balance Load Balance:负载均衡提供了

apache负载均衡配置详解

准备东西 tomcat Apache server mod_jk-1.2.31-httpd-2.2.3.so 没有可以去网上下载  一搜一大把  这里就不讲怎么下载了 首先安装apache 一. 找到安装目录  modules,把下载的 mod_jk-1.2.31-httpd-2.2.3.so 改名 mod_jk.so 例如:D:\Program Files\apache\modules 然后把mod_jk.so放进modules文件夹里 二. 找到 conf 文件夹 添加文件:workers.

LVS 负载均衡群集详解、地址转换模式(LVS-NAT)案例详解

前言 · Linux Virtual Server (LVS)是针对 Linux 内核开发的一个负载均衡项目,是由我国章文嵩博士在 98 年 5月创建.· LVS 实际上相当于基于 IP 地址的虚拟化应用,为基于 IP 地址和内容请求分发的负载均衡提出了一种搞笑的解决办法.·LVS 现在已称为 Linux 内核的一部分,默认编译为 ip_vs 模块,必要时能够自动调用 群集的类型 1· 负载均衡群集·以提高应用系统的响应能力.尽可能处理更多的访问请求.减少延迟为目标,获得高并发.高负载(LB)的

centos 7部署Tomcat及其负载均衡配置详解

Tomcat服务器是一个免费的开源web应用服务器,属于轻量级应用服务器,在中小型系统和并发用户不是很多的场合中被普遍使用,是开发和测试JSP程序的首选.一般来说,Tomcat虽然和apache或者Nginx这些web服务器一样,具有处理HTML页面的功能,然而由于其处理静态页面的能力远不如apache或者Nginx,所以Tomcat一般是作为一个servlet和JSP容器,单独运行在后端,Tomcat应用场景如下: 用户访问的永远是apache/Nginx服务器,然后由apache/Nginx

LVS负载均衡群集详解

此博文包含以下内容:1. 群集类型2.负载均衡的分层结构3.负载均衡的工作模式4.LVS的负载调度算法5.LVS相关的基础命令6.使用ipvsadm管理工具7.搭建NFS共享存储服务器 根据生产环境的不同,群集所提供的功能也各不相同,采用的技术细节也可能各有千秋.关于群集技术的相关概念如下: 1. 群集类型 无论是哪种群集,都至少包括两台节点服务器,而对外表现为一个整体,只提供一个访问入口(域名或IP地址),相当于一台大型计算机.根据群集所针对的目标差异,可以分为以下三种类型: 负载均衡群集(L

Nginx + Tomcat 负载均衡配置详解

Nginx作为反向代理服务器,实现负载均衡.首先浏览器发起请求,到达Nginx,由Nginx将请求地址转发给相应的tomcat服务器,再由tomcat服务器将结果返回给Nginx,Nginx将结果再转发给浏览器. 在这过程中,对于浏览器来说,并不知道后端的存在, 相对于Tomact来说,当前的客户端是Nginx服务器.这就完成了一个代理的过程. 首先准备三台Linux服务器:IP地址分别为 192.168.1.61  192.168.1.62  192.168.1.63 其中61安装nginx服