Roby's profileblue_princePhotosBlogListsMore Tools Help

Blog


    November 26

    RAC上收集所有节点AWR报告的脚本

    假如你管理着一个超过十个节点的RAC数据库,而当你查看数据库的AWR报告时,相信你会跟我一样非常头疼,必须一个个节点把各自节点的AWR报告都找出来,然后一个个节点进行查看对比。有没有这么一个脚本,能够将RAC数据库中所有节点的AWR报告整合起来只生成一份,然后我们要诊断RAC数据库的性能时只需要查看这么一份整合好的AWR报告,里面有非常清晰的RAC各节点数据库性能指标的数据排列在一起,可以方便地查看对比各个节点的性能指标差异。Oracle从11g开始提供了$ORACLE_HOME/rdbms/admin/spawrrac.sql这个脚本,就可以满足此需求,而且还可以向下兼容到10g使用,非常方便。
    November 23

    今天看到彭伟国了

          上周到黄龙体育中心看中超浙江绿城的比赛,混入主席台所在的后台就座。当时本来是想看台离教练席近些,看看能不能看到彭伟国。毕竟这是自己最喜欢的国内球员,从94年开始迷上足球之后,国仔就一直是我最喜欢的国内球员,我一直认为他是中国足坛到目前为止脚法最好的球员。当年国仔和他所效力的广州太阳神队都是我所钟爱的,而现在当年太阳神的主教练周穗安和国仔都是浙江绿城执教,因此便想趁机会接近看一眼。
          不想上周比赛后国仔倒是都没碰到,出门后居然碰到阎嵩在身边,当时想和他握个手,不过后面觉得无趣也就离开了。这星期浙江绿城最后一个主场对深圳上清饮,还是照例混入主席台看比赛,比赛本身倒是平平,浙江以2:3负于对手。比赛结束以后混入球员通道所在的大厅,等了好久没看到球员出来。于是准备回家,不想一大帮球迷冲着球队所在的大巴过去。于是我也跟着过去看了一下,后面看到阎嵩他们走了过来,让同事帮着给我和阎嵩拍张照片,同事不会用我的相机,结果合影没拍成。大巴离开后我们便冲着过去,这时候同事说那不是彭伟国吗。于是我紧跟着跑进去,找到彭伟国提出合影的要求,我说我可是你十几年的老球迷了。国仔因为球队输球之后兴致不是很高,不过还是很配合地合影,结果比较晕的就是同事接连按了几下快门后还是没拍成我们的合影,我们看到国仔有些不耐烦也就说拍好了,然后跟着国仔从球员通道离开体育场。后面在外面等着的时候顺便和周穗安以及外援奥托拍了两张合影,他们都很配合。快离开的时候看到国仔开着他的BMW735,车牌很牛X,粵A*6666。
         虽然说合影没拍成有些遗憾,不过还是挺高兴能够和当年的偶像能够如此地接近。想想时间如流水,14年就这样过去了。当年我还是一个啥都不知道的毛孩子,因为我堂哥满屋子的《足球》报而迷上了足球,继而喜欢上巴乔和彭伟国,更想不到的是居然能够14年后在杭州相继看到他们真人。这在以前这都是那么遥远的事情,只能在电视上看到他们拼搏的身影。可惜他们如今都退役了,而我对足球的喜爱也随着年岁渐长而日渐消逝。再见了,我的偶像们……
        
    November 12

    RAC中的跨节点并行

            RAC中,我们可以通过设置跨节点并行,将并行操作分布到RAC中的不同节点同时进行,以便发挥整个RAC环境的最大运算能力。在RAC中设置跨节点并行主要是通过设置parallel_instance_groupinstance_groups这两个参数进行的。

    instance_groups这个参数主要是设置该节点实例是否属于某一个实例组,这个实例组的命名可以根据你的需要随便命名,而没有严格的限制。每个节点可以设置多个不同的实例组名,实例组名用逗号隔开,比如:instance_groups=crm,erp,oltp。这样只要其他节点的instance_groups参数中有设置成一个一样的名字,就表示这个节点也属于这个实例组。比如在一个4节点RAC的环境中,A节点的instance_groups设置为(crm,erp,oltp,B节点设置为(crm,oltp,C节点设置为(crm,erp),D节点设置为(crm,erp,oltp),那么就有ABCD4个节点共同组成crm这个实例组,ACD3个节点组成erp这个实例组,ABD3个节点组成oltp这个实例组。

    parallel_instance_group设置的值为instance_groups里面设置的值,表明这个节点上面进行的并行操作可以跨越哪些实例组。回到上面的例子,假如A节点的parallel_instance_group设置为crm,由于crm这个实例组的成员是ABCD四个节点都有,那么A节点上的并行操作就可以跨越所有的4个节点。如果A节点的parallel_instance_group设置为erp,那么A节点并行操作就可以跨越ACD3个节点。如果一个节点的parallel_instance_group设置的参数在instance_groups中没有设置,那么这个节点的并行操作将只会在本节点进行,假如B节点的parallel_instance_group设置为erp,那么它上面的并行操作将不会跨节点进行。

    默认情况下这两个参数都为空,那么并行操作默认将会是跨节点并行的。当然并不是设置了这两个值就一定会发生跨节点并行,是由优化器和RAC的负载均衡机制共同决定一个并行操作是否跨节点并行,需要跨越实例组中的哪几个节点并行还是实例组的所有节点并行,每个节点分配多少个并行进程工作。由于跨节点并行还有内部互联通信的开销,因此并不一定就会比单节点并行会快多少,只有那些很大的并行操作可能才需要到跨节点并行。这个可以根据测试再进行变更。在我们运行的实际案例中,由于跨节点并行的机制比较复杂,有时候会触发一些BUG,甚至并行度为DEFAULT的表在进行跨节点并行DML时一个并行进程死掉导致整个节点宕机。推荐的做法是系统级别的parallel_instance_group这个参数不要设置,不同的程序在部署之前做好测试工作,看是否需要跨节点并行。由于parallel_instance_group是可以在会话级别设置的,可以修改一些需要跨节点并行的程序在执行之前先执行alter session set parallel_instance_group=……一下,然后只限制这些程序跨节点并行。

    November 05

    RAC的负载均衡

    RAC的负载均衡主要是指新会话连接到RAC数据库时,如何判定这个新的连接要连到哪个节点进行工作。在RAC中,负载均衡分为两种,一种是基于客户端连接的,另外一种是基于服务器端的。
    客户端的负载均衡配置相对简单,只需要在tnsnames.ora中添加LOAD_BALANCE=ON这么一个选项即可。比如下面的TNS:

    RAC =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
    (LOAD_BALANCE = ON)
    (FAILOVER = ON)
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = rac)
    )
    )

    这样当客户端连接RAC数据库时,会随机在TNS里面挑个监听地址进行连接。在Oracle10g以前,假如有节点宕机或者类似事故时,客户端可能还是选择连接到这个节点,这样会发生较长时间的TCP等待超时。而在10g以后,由于VIP和FAN的引入,这样的情况可以得到很大程度的改善。客户端的负载均衡在通常情况下能够较好地工作,但是由于连接是在客户端随机发起的,这样客户端并不知道RAC各节点的负荷及连接数情况,有可能负荷大的节点还会源源不断地增加新的连接,导致RAC节点无法均衡工作。
    从Oracle 10g开始,服务器端的负载均衡可以根据RAC中各节点的负荷及连接数情况,而判定将新的客户端连接分配到负荷最小的节点上去。RAC中各节点的PMON进程每3秒会将各自节点的负荷(包括LOAD、最大LOAD、CPU使用率)及连接数更新到service_register里面,然后假如节点的负荷有发生变化,将会通知到监听程序,由监听程序再决定新的客户端连接分配至哪个节点。假如RAC中一个节点的监听失败了,PMON每一分钟会去检查一次是否已经恢复正常。
    服务器端的监听配置是在各节点的tnsnames.ora里面添加一个连接到各个节点监听的条目,然后再在初始化参数里面设置remote_listeners这个参数。比如:

    LISTENERS_RAC =
    (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
    )

    ALTER SYSTEM SET REMOTE_LISTENER = LISTENERS_RAC;

    这样服务器端的LOAD BALANCE便配置完成。
    但是有时候由于PMON取节点负荷的延迟,导致客户端连接可能还是会连接到负荷较大的节点上,这时候便可以在服务器各节点的listener.ora里面加入PREFER_LEAST_LOADED_NODE=OFF这么一行,这样服务器端的负载均衡将不再根据节点的负荷来进行分配,而是根据节点的连接数进行分配,达到各个节点连接数比较平衡的效果。
    另外一个不得不说的便是并行操作,假如有个会话连接以后要进行并行操作。由于连接时是按负荷或连接数连接,这样可能连接时各个节点连接数和负荷等比较平衡,但是这个并行会话启动多个并行进程以后,那么这个节点的负荷及连接数就会有可能上升得比较快。如果在RAC中开启了节点并行,那么有可能会把并行进程分配到多个节点运行以达到负载均衡的效果。
    从Oracle 10.2开始,Oracle引入了Load Balance Advisor,对负载均衡有了进一步的改进。结合Service,可以对不同的SERVICE设置不同的负载均衡策略。Load Balance Advisor的配置可以通过DBMS_SERVICE包对SERVICE进行更改而完成。在Load Balance Advisor首先必须设置SERVICE负载均衡的目标,目标分为3种:

    GOAL_NONE Disables the load balancing advisory
    GOAL_SERVICE_TIME The LBA calculates a weighted moving average of the total elapsed time for completed work plus the bandwidth that’s available to the service to calculate the service goodness. This goal is ideal for services whose workload may change dramatically over a short period of time, e.g. an application that services a “clicks and mortar” store that provides customer self-service through an internet-based shopping web site.
    GOAL_THROUGHPUT The LBA calculates a weighted moving average of throughput (i.e. the rate at which work is completed) in addition to the bandwidth available to the service to calculate the service goodness. This goal is best suited for long-duration tasks that are typically queued to run serially, e.g. scheduled jobs that handle large batches of transactions.

    另外可以额外设置连接的负载均衡:

    CLB_GOAL_SHORT The Load Balancing Advisory will be used for connection load balancing only if it is enabled (i.e. set to other than GOAL_NONE). If the LBA has been disabled, connection load balancing will utilize abridged advice determined by CPU utilization.
    CLB_GOAL_LONG Connection load balancing will be determined by first tallying the total number of connections per instance, and then by counting the number of sessions per each service. Oracle recommends using this setting for services whose applications tend to connect for long periods of time (e.g. Oracle Forms). The Load Balancing Advisory can be used in conjunction with this setting as long as the connection pool has been sized to accommodate “gravitation “ within the pool without adding or subtracting connections. Oracle recommends this option as the most efficient design.