- 浏览: 203616 次
文章分类
- 全部博客 (224)
- jsp (5)
- jsf (7)
- web (11)
- js (12)
- COBOL (5)
- php (7)
- jconsole (1)
- java (11)
- ajax (1)
- PHP魔法方法 (1)
- 项目管理工具 (3)
- 项目管理 (2)
- svn (8)
- redmine (1)
- mysql (4)
- qrcode,php (1)
- qrcode (1)
- 多进程 (3)
- html (1)
- excel (2)
- seasar2 (1)
- db (1)
- entity (1)
- IOS8 (1)
- SWIFT (1)
- 正则表达式 (1)
- RabbitVCS (1)
- url (1)
- thinkphp (2)
- c++ (5)
- win32 API函数 (1)
- htaccess (1)
- makefile (3)
- C/C++ (12)
- Linux (1)
- miui (2)
- unix (1)
- wechat (1)
- websocket (1)
- SpringMVC (3)
- VSAM (1)
- centos (2)
- wamp (1)
- server (1)
- 优酷视频上传并去除广告 (1)
- owncload (1)
- cloud (1)
- ubuntu (1)
- pdf转换成word (1)
- 微信,weixin (1)
- 行业系统 (3)
- 超级外卖源代码 (0)
- 软件专利 (1)
- 申请 (1)
- vba (1)
- UML (1)
- 程序切片 (1)
- 股票心得 (1)
- 威客建站 (1)
- 微信开发学习路线 (1)
- 远程开机 (1)
- spring mvc (1)
- JEECMS (1)
- Node.js (1)
- ThinkJS (1)
- maven (2)
- MyEclipse+Tomcat+MAVEN+SVN (1)
- Spring+SpringMVC+MyBatis (1)
- wampserver (0)
- RESTful (1)
- hibernate (4)
- Spring+SpringMVC (1)
- 响应式布局 (1)
- 响应式布局模板 (1)
- Aptana (3)
- 遗传算法 (1)
- 进化算法 (1)
- bower (1)
- HTML5 (1)
- Android官方培训课程 (1)
- MySQL锁 (1)
- 扫描枪 (1)
- 微信公众平台 (1)
- 企业号 (1)
- ddns (1)
- java获取外网ip (1)
- DDNS,阿里云,云解析,万网域名,阿里云域名 (1)
- SEO (1)
- Jboss (2)
- wildfly (1)
- WildFly8 (2)
- NT Kernel (1)
- 反向代理 (1)
- Spring嵌套事务 (1)
- apache (3)
- 防止浏览器记住用户名及密码的简单实用方法 (1)
- 时间戳 (1)
- 字体 (1)
- 网络爬虫准 (1)
- 屏蔽后退按钮 (1)
- java web (1)
- JavaMail (1)
- windows服务 (1)
- Freemarker (1)
- TortoiseGit (2)
- oschina (1)
- JSON (1)
- Boost (1)
- MUI (1)
- github (1)
- Python2.7 (1)
- Python3.0 (1)
- Odoo (1)
- java socket (1)
- OpenERP (2)
- werkzeug (1)
- JNA (2)
- proxifier (1)
- WebService (1)
- 企业应用集成 (1)
- vmware (1)
- Navicate (1)
- 三体 (1)
- oracle同步 (1)
- 微信 (3)
- java设计模式 (1)
- 工具 (1)
- JavaScript跨域 (1)
- LB (1)
- 负载均衡 (1)
- AngularJS (1)
- HBuilder (1)
- Echarts (1)
- Json Web Token (1)
- PassportSDK (1)
- ubuntu kylin xterm 乱码 (1)
- ubuntu kylin17 安装字体教程 (1)
- wps (1)
- jetbrains (1)
- MySQL5.7 (1)
- Nginx (1)
- JDK (1)
最新评论
-
cuiyadll:
谢谢楼上的推荐
实战:jQuery Mobile开发HTML5移动应用 -
marty:
使用JQueryMobile,推薦使用這免費開發工具,提供可視 ...
实战:jQuery Mobile开发HTML5移动应用 -
men_clslji:
按照目前的方法只是防止刷新页面时不再执行X(添加),而toke ...
有了上一篇博文,类似地顺便说说表单防重复提交。
二、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获得的信息都是动态注册的,而不是从文件中读出的静态信息。
修改前:
[oracle@felix2 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)
)
)
[oracle@felix2 admin]$
修改后配置如下:
[oracle@felix2 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))
)
)
[oracle@felix2 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,讲的特别好!!!!
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获得的信息都是动态注册的,而不是从文件中读出的静态信息。
修改前:
[oracle@felix2 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)
)
)
[oracle@felix2 admin]$
修改后配置如下:
[oracle@felix2 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))
)
)
[oracle@felix2 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,讲的特别好!!!!
相关推荐
Linux 系统负载均衡处理流程详解 Linux 系统的负载均衡处理流程是通过 init_sched_fair_class() 函数注册一个软中断(vector = SCHED_SOFTIRQ)触发系统的负载均衡。该软中断对应的处理函数是 run_rebalance_...
《负载均衡调度器程序详解》 在分布式系统和网络服务中,负载均衡是至关重要的一个环节,它确保了系统的高效运行和稳定服务。本文将详细解析一个基于多线程实现的负载均衡调度器程序,主要关注其核心组件、工作原理...
JBoss 4.2.3GA 集群配置与Apache负载均衡详解 在IT行业中,高可用性和负载均衡是企业级应用的关键要素。JBoss 4.2.3GA是一个流行的Java应用服务器,通过配置集群可以提高服务的稳定性和性能。而Apache作为Web服务器...
### Windows环境下配置Tomcat集群与负载均衡详解 #### 一、环境搭建与配置说明 本文将详细介绍如何在Windows系统中配置Tomcat集群以及通过Apache实现负载均衡。此配置旨在提高Web应用的服务可用性和性能。 **环境...
**JK负载均衡详解** 在构建高可用性和高性能的Web服务时,负载均衡是一个不可或缺的关键环节。"JK负载均衡"是Apache HTTP服务器与Tomcat应用服务器之间的一种连接器,旨在优化性能,提高系统的可靠性和可扩展性。...
### Apache + Tomcat 负载均衡设置详解 #### 一、引言 在现代Web应用部署场景中,为了提高网站的性能、可用性及扩展性,常常采用Apache与Tomcat结合的方式,通过负载均衡技术分散请求到多个服务器节点上。这种架构...
### Apache+mod_jk+Tomcat负载均衡配置详解 #### 一、背景介绍 随着互联网技术的迅猛发展,单一服务器已经难以满足日益增长的服务需求。负载均衡技术应运而生,成为提高服务可用性和扩展性的关键手段之一。本文将...
nginx一般可以用于七层的负载均衡,这篇文章将介绍一些负载均衡的基本知识以及使用nginx进行负载均衡的简单的例子。 四层负载均衡 vs 七层负载均衡 经常会说七层负载均衡还是四层负载均衡,其实根据ISO的OSI网络模型...
### Keepalived负载均衡安装与配置详解 #### 一、Keepalived与IPVSADM概述 **Keepalived**是一款开源的高可用解决方案,主要用于实现Linux系统的VRRP(Virtual Router Redundancy Protocol)功能,它能通过心跳...
### Apache + Tomcat + JK配置负载均衡及虚拟主机详解 #### 一、概述 在现代Web应用开发中,为了提高服务器资源的利用率和系统的可扩展性,常常需要在一个物理服务器上部署多个不同的Web应用程序,每个应用程序可能...
【Apache + Tomcat 负载均衡配置详解】 在Windows环境下,使用Apache 2.0.55和Tomcat 5.0构建一个负载均衡的Web服务器架构是提高应用程序可用性和性能的有效方法。以下是详细配置步骤: 1. **安装JDK**: 首先,...
本文档介绍了一种在Windows平台上实现Apache与Tomcat集群及负载均衡的方法。首先,需要准备以下软件包: - **Apache**: 版本为2.0.55。 - **Tomcat**: 使用的是5.5.17版本的zip包,数量为2个实例。 - **mod_jk**: ...