【IT168报道】4月2日-3日,中国首届2010数据库技术大会在北京召开。在这一面向数据库及商业智能技术专业人群的技术盛会上,各路DBA、数据库开发,商业智能技术高手云集,分享他们在数据库技术领域深入研究的体会和非常好的实践。
在4月3日上午进行的“Oracle实践案例应用专场”演讲中,来自于ITPUB社区的资深版主Kamus发表了题为“Oracle RAC环境中的负载均衡以及失效接管应用实践”的演讲。
图一 ITPUB社区的资深版主Kamus发表演讲
Kamus本名张乐奕,Oracle ACE,现为独立数据库技术咨询师和顾问,他曾经任职于北京甲骨文软件系统有限公司高级顾问,长期关注Oracle技术和其它相关技术,对于Oralce数据库RAC以及高可用解决方案具有丰富的实践经验。长于数据库故障诊断,数据库性能调优。2004年2月,担任主要作者出版了《Oracle数据库DBA专题技术精粹》一书;2005年6月,担任主要作者出版了《Oracle数据库性能优化》一书,深受读者喜爱。
Oracle实践案例应用专场:Kamus演讲会现场
在演讲中,Kamus首先介绍了在Oracle Real Application Cluster(RAC)环境中的Loadbalancing(负载均衡)以及Failover(失效接管)的概念和实现方法,同时介绍在当今的大型企业数据库架构中较为常见的负载均衡以及失效接管架构,并且根据演讲者的工作经验介绍了在Loadbalancing和Failover方面较为常见的错误现象以及处理方法。
他谈到,RAC环境下的负载均衡可以分为客户端负载均衡和服务器端的负载均衡。客户端负载均衡与数据库实例无关,与监听有关 ;与数据库真实负载无关;连接之后不会再次rebalancing。
既然是Client端的负载均衡,那么也就是不需要在数据库服务器端配置任何参数,完全由客户端机器上的tnsnames.ora文件中对于TNS的配置来决定,实际上也就是LOAD_BALANCE参数。
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)
)
)
以上配置等同于:
(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分钟。
设置方法:
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来定期更新,计算公式如下:
Delta = New Delta (Received from PMON update)
在PMON定期更新的间隔,应对于每个新连接的建立,监听会自己更新Lbscore,计算公式是:
对于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:
SQL*Plus: Release 10.2.0.3.0 - Production on Sat May 19 15:34:07 2007
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文件。
重新设置完毕以后,错误解决。
演讲的第二部分谈到了关于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产生的原因及解决办法。
详细的演讲PPT,您可以到:http://www.itpub.net/thread-1287920-1-1.html去下载。