RAC环境中的负载均衡
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在演讲中,Kamus首先介绍了在Oracle Real Application Cluster(RAC)环境中的Loadbalancing(负载均衡)以及Failover(失效接管)的概念和实现方法,同时介绍在当今的大型企业数据库架构中较为常见的负载均衡以及失效接管架构,并且根据演讲者的工作经验介绍了在Loadbalancing和Failover方面较为常见的错误现象以及处理方法。
他谈到,RAC环境下的负载均衡可以分为客户端负载均衡和服务器端的负载均衡。
客户端负载均衡与数据库实例无关,与监听有关 ;与数据库真实负载无关;连接之后不会再次rebalancing。
既然是Client端的负载均衡,那么也就是不需要在数据库服务器端配置任何参数,完全由客户端机器上的tnsnames.ora文件中对于TNS的配置来决定,实际上也就是LOAD_BALANCE参数。
RACDB常见配置:
RACDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = vip1)(PORT =1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = vip2)(PORT =1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = vip3)(PORT =1521))
(LOAD_BALANCE = yes)
)
(CONNECT_DATA =
(SERVICE_NAME = racdb)
)
)
以上配置等同于:
RACDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = vip1)(PORT =1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = vip2)(PORT =1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = vip3)(PORT =1521))
(LOAD_BALANCE = yes)
(FAILOVER = yes)
)
(CONNECT_DATA =
(SERVICE_NAME = racdb)
)
)
如果在TNS配置时使用的是ADDRESS_LIST语法,那么必须显示设置
LOAD_BALANCE = yes,默认值LOAD_BALANCE = no(而默认FAILOVER = yes)。
(LOAD_BALANCE = yes)指示SQLNet随机选择ADDRESS_LIST列表中的任意一个监听,将客户端请求发送到此监听上,通过这种方法来实现负载平衡。
如果 (LOAD_BALANCE = no)那么将会按照ADDRESS_LIST列表中的顺序选择监听,只要这个监听能够正常连接那么就使用该监听。
因此在某些负载平衡的解决方案中会使用(LOAD_BALANCE = no)但是在多个客户端或者应用服务器端配置顺序不同的ADDRESS_LIST,以此来实现人为的负载平衡。
服务器端负载平衡包含Listener (Connection) Balancing (Oracle9i and Higher)和Service Balancing(Only on Oracle10gR2 and Higher )两个方面。
对于Listener Balancing,要实现server side load balance要求监听能够知道在整个RAC环境中的各节点负载情况,节点负载情况是由PMON进程来定期更新的,而要让PMON进程能够通知其它节点自己节点的负载情况则需要设置数据库初始化参数REMOTE_LISTENER。
PMON更新的时间间隔最小是1分钟。
设置方法:
sql>ALTER system SET REMOTE_LISTENER='LISTENERS_RAC' scope=BOTH; TNSNAMES.ORA :
LISTENERS_RAC =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = vip1)(PORT =1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = vip2)(PORT =1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = vip3)(PORT =1521))
)
当某个实例的监听收到客户端连接请求,将会统筹考虑RAC环境中各个节点的负载情况,然后将该连接传递到具有最小负载的节点的最小负载实例上。
1. Instance_A is locally registered with Listener_A and remotely registered with Listener_B. Instance_B is registered locally with Listener_B and remotely with Listener_A.
2. Client connection #1 goes to Listener_A. Based on load information provided by PMON, Listener_A routes the incoming client to the locally registered instance, Instance_A.
Listener_A.log:
13-FEB-2004 11:05:02 *
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=prod)
(CID=(PROGRAM=)(HOST=clienthost)(USER=oracle))) *
(ADDRESS=(PROTOCOL=tcp)(HOST=10.10.10.10)(PORT=20108)) * establish * prod * 0
1. client connection #2 goes to Listener_A. With updated load information provided by PMON, Listener_A routes the client to the remotely registered instance, Instance_B.
Listener_A.log:
13-FEB-2004 11:05:02 *
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=prod)
(CID=(PROGRAM=)(HOST=clienthost)(USER=oracle))) *
(ADDRESS=(PROTOCOL=tcp)(HOST=10.10.10.10)(PORT=20108)) * establish * prod * 0
Listener_B.log:
13-FEB-2004 11:05:02 *
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=prod)
(CID=(PROGRAM=)(HOST=clienthost)(USER=oracle))(INSTANCE_NAME=Instance _B)) *
(ADDRESS=(PROTOCOL=tcp)(HOST=10.10.10.10)(PORT=20110)) * establish * prod * 0
在10gR2版本之后,节点和实例的负载计算通过lbscore来完成.这样可以改善Call Storm场景下负载不均衡的现象。
可以通在sqlnet.ora文件中添加监听的trace(TRACE_LEVEL_LISTENER = 16)来获取lbscore的产生情况。
lbscore由两个动态值决定:”goodness” 和“delta”,这两个值均由PMON来定期更新,计算公式如下:
Lbscore = Goodness (Received from PMON update)
Delta = New Delta (Received from PMON update)
在PMON定期更新的间隔,应对于每个新连接的建立,监听会自己更新Lbscore,计算公式是:
Listener Lbscore = Lbscore(previous) + Listener Delta。
对于Service Balancing,包含Powerful automatic workload management和Runtime load balancing两个方面。
关于Fast Application Notification,Kamus也做了相应的介绍。
早期的数据卫士提供了相对快速的应用程序会话故障转移,在切换和故障转移期间使用了透明应用程序故障转移(Transparent Application Failover,TAF)功能,但Oracle 11g R2现在提供了快速应用程序通知(Fast Application Notification ,FAN)功能, Fast Application notification(FAN)是这样一种特性:它过滤并发布那些被认为是意义重大的特殊目标的高可用性事件。
使得应用程序故障转移更快了。
对负载平衡中可能产生的问题,kamus给出了2个常见的案例:
Case1:
D:\Temp>sqlplus system/oracle@racdb
SQL*Plus: Release 10.2.0.3.0- Production on Sat May 1915:34:072007 Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
ERROR:
ORA-12545: Connect failed because target host or object does not exist Enter user-name:
Workaround:
alter system set
LOCAL_LISTENER="(ADDRESS=(PROTOCOL=TCP)(HOST=<VIP_address>)(PORT=1521 ))" scope=both sid='instance_name';
Or only use Client-side connection balancing:
alter system set remote_listener='' scope=both;
Case2:
在使用客户端连接RAC服务时,间歇性报“ORA-01017: invalid username/password; logon denied”错误。
经检查,如果使用普通数据库用户连接数据库,每次连接都会成功。
但是如果使用sysdba用户,因为客户端连接使用load balance方式,每次连接到VIP1时,可以正常登陆,但是连接到VIP2实例上则会报ORA-01017错误。
判断为节点2上的orapw密码文件与数据库中SYS用户的密码不相符。
解决方法:
在VIP2实例中重新设置SYS用户密码,将会自动更新VIP2主机上的orapw 文件。
SQL>ALTER USER SYS INDETIFIED BY oracle;
重新设置完毕以后,错误解决。
演讲的第二部分谈到了关于Failover(失效接管)的问题,也分别从客户端和服务器端两种情形进行了讲解。
1.Client-side Failover
a) Connect Time Failover
b)Transparent Application Failover (TAF)
2.Serer-side Failover
a)Transparent Application Failover(TAF) with Service
最后,他分析了Failover 中常见的问题ORA-01034 with GLOBAL_DBNAME 产生的原因及解决办法。