ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 灵活实现RAC三节点的负载均衡及TAF配置(二)

灵活实现RAC三节点的负载均衡及TAF配置(二)

原创 Linux操作系统 作者:zhengbao_jun 时间:2009-04-23 16:37:10 0 删除 编辑

这两天配置了一个三节点的RAC环境,想起前一段时间Thomas Zhang给我出的一个题目,配置一个三节点RAC环境的复杂负载均衡以及Transparent Application Failover的服务名。现在有环境了,可以将给出验证后的结果了。

这篇文章给出问题以及问题的实现。

 

 

首先描述一下3RAC服务器,IP地址分别为172.25.198.222172.25.198.223172.25.198.226,对应的VIP分别是172.25.198.224172.25.198.225172.25.198.227数据库版本是10203 for Solaris sparc 64

数据库名为testrac,三个实例分别为testrac1testrac2testrac3

首先看一下Thomas Zhang给出的题目需求:

给你个题目,我上次搞了好一会儿,呵呵

需求:一个RAC,三个节点node1,node2,node3

两台appserverAB

要求:1)正常情况下,server A通过node1node2访问数据库,server B通过node3访问数据。

server A通过node1node2时要load balance

2)当node1异常,server A上的应用通过node2访问ITPUB个人空间%E Bk2@ Q&n4Q
node2异常,server A上的应用通过node1访问ITPUB个人空间9h.t.s]9z _ }o
3
)当node1,node2同时异常,server A上的应用通过node3全部接管

4)当node3异常,server B上的应用通过node1/node2接管并Load Balance.

TNSNAMES中的配置可是是很灵活的,用户可以通过配置服务名,使得用户访问RAC环境中的一个、多个或全部的实例,可以在访问的实例中实现轮巡检查机制或负载均衡机制,还可以配置Transparent Application Failover功能。比如上面这个要求,就非常的灵活,不但要求不同的服务器访问不同的实例,还要求配置负载均衡以及TAF,这就使得TNSNAMES服务的配置比较复杂,不过也正好体现了TNS配置的灵活性。

下面给出根据这个要求的TNSNAMES.ORA的配置:

SERVICEA =ITPUB个人空间X(ee"d [0p^n
  (DESCRIPTION_LIST =
&^!@-]N;iQ]235507    (DESCRIPTION =ITPUB个人空间b:B'Av3l+u?Yx
      (ADDRESS_LIST =
9R(I,D'}B]Y z235507        (ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))
NN f s5]"BMR235507      )ITPUB个人空间%|0A/Q zQR/l?,U
      (CONNECT_DATA =ITPUB个人空间7hL2Yr)`R9So$s
        (SERVER = DEDICATED)ITPUB个人空间qj9[2s&iu? O5l
        (SERVICE_NAME = TESTRAC)ITPUB个人空间'U_+a+f t^ F5Q.N
        (INSTANCE_NAME = TESTRAC1)ITPUB个人空间7t%du9K h!y(q
        (FAILOVER_MODE =ITPUB个人空间V6bbu1W`
          (TYPE = SELECT)ITPUB个人空间EaU1zH2W7s
          (METHOD = BASIC)ITPUB个人空间 F__5a1W!v
          (BACKUP = SERVICEA_BACKUP)ITPUB个人空间)}.UdO0[@b9WK6A
        )ITPUB个人空间k'ZR1S P\{
      )
.e;q @J#rB-z0p!bh235507    )ITPUB个人空间K N f [a3Oxa*O;qC
    (DESCRIPTION =
$O"g ?#|Z6Q235507      (ADDRESS_LIST =
X9X)Gf+~K235507        (ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))ITPUB个人空间V7Y zTo
      )ITPUB个人空间dN9z)Ag+ui
      (CONNECT_DATA =ITPUB个人空间 fl5?C1J
        (SERVER = DEDICATED)
+FA)j"pf6uR5t235507        (SERVICE_NAME = TESTRAC)ITPUB个人空间9c%D#r R1[9`hn&Q
        (INSTANCE_NAME = TESTRAC2)
n%xx7\ u6i){235507        (FAILOVER_MODE =ITPUB个人空间,NZ'z6gg!w ?&Z
          (TYPE = SELECT)
'ya&b8fv(m235507          (METHOD = BASIC)
VVLB*\H235507          (BACKUP = SERVICEA_BACKUP)ITPUB个人空间*SV7i.k |!m5~uX2[
        )
3m[(\r1G;yTn(R235507      )
Q]5Pd|Q235507    )ITPUB个人空间SfO&F^._.b{
    (LOAD_BALANCE = yes)
']Xs!l[ j235507  )

SERVICEB =ITPUB个人空间|9R ~9x2\ Z0T"o/Z%`
  (DESCRIPTION =ITPUB个人空间7Y ?7W&F)Sz1k
    (ADDRESS_LIST =
L+}rn_235507      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.227)(PORT = 1521))
#q yHl7\#eP235507    )ITPUB个人空间%h5T"|-Upd
    (CONNECT_DATA =
n!U[[+N#j235507      (SERVER = DEDICATED)
:S&ORW"o$|iE8Q235507      (SERVICE_NAME = TESTRAC)ITPUB个人空间3]$_j Ig.~6S.K!l
      (INSTANCE_NAME = TESTRAC3)
s#@.tX5v+W235507      (FAILOVER_MODE =ITPUB个人空间h[2@ W|d uK
        (TYPE = SELECT)
"?"cZ CX{7Y235507        (METHOD = BASIC)ITPUB个人空间L4Z6q/v:j\
        (BACKUP = SERVICEA)
0Q ][` } ~.y235507      )ITPUB个人空间oT&dzJ-_+d|
    )
M KG [qIA(CS'mFx235507  )

SERVICEA_BACKUP =
)D%G9`)].`O_235507  (DESCRIPTION_LIST =ITPUB个人空间0qL mnC%m%k;Tx
    (DESCRIPTION =
(v6u;p;[y$Y235507      (ADDRESS_LIST =ITPUB个人空间#R7O.m)D0V,^"\P
        (ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))
] [ V\/eV%^235507      )ITPUB个人空间^"Ks0mw
      (CONNECT_DATA =ITPUB个人空间b*{Z#P'R+G
        (SERVER = DEDICATED)
~^ O^0RW8V235507        (SERVICE_NAME = TESTRAC)ITPUB个人空间u6R(l @0KT
        (INSTANCE_NAME = TESTRAC1)ITPUB个人空间1TV7\/W;R[+NL&A
        (FAILOVER_MODE =
*}!~%M5U#SM235507          (TYPE = SELECT)
k A(r*d"x4Q M]235507          (METHOD = BASIC)
'H X7^gJ235507          (BACKUP = SERVICEA_BACKUP)
G?0v*ga7Z t"W F235507        )ITPUB个人空间$Jxnb4yK
      )ITPUB个人空间;eKwkR h$o1k
    )ITPUB个人空间*KI,_ z"_f/j\v
    (DESCRIPTION =ITPUB个人空间S&^[GyM0P!@hg9@%y
      (ADDRESS_LIST =
!|K4bZ7^'oS `235507        (ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))
,|U }q1o$IiA W235507      )ITPUB个人空间D#gX7a'{X
      (CONNECT_DATA =
Af/`FB8[,Te235507        (SERVER = DEDICATED)ITPUB个人空间!H8ye:Q4V%A
        (SERVICE_NAME = TESTRAC)
;z5sd6w @:Tg235507        (INSTANCE_NAME = TESTRAC2)
_q4w.x}E-YP'b235507        (FAILOVER_MODE =
_-X#u#`t-a235507          (TYPE = SELECT)ITPUB个人空间jQ$Ek)J;jT{
          (METHOD = BASIC)ITPUB个人空间*a!l+^ y6St~
          (BACKUP = SERVICEA_BACKUP)
0e,U0~1sB)Y0Ap'r235507        )ITPUB个人空间q&c2V4Id,m w/G
      )
uB ~$~)t(a235507    )ITPUB个人空间x5F\R^ NAQ
    (DESCRIPTION =
g }d N(R8K W235507      (ADDRESS_LIST =ITPUB个人空间2@&x(Yt8zS6s F
        (ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.227)(PORT = 1521))
d(|Gxe S } m!qT235507      )ITPUB个人空间 f(v |Kw,o(W _
      (CONNECT_DATA =
,phy-W@9j'd |235507        (SERVER = DEDICATED)
Om nQ {$h235507        (SERVICE_NAME = TESTRAC)
(RO"rD(h$d,m1|L235507        (INSTANCE_NAME = TESTRAC3)
}Z~)mh @235507        (FAILOVER_MODE =ITPUB个人空间.Zxic!K,b
          (TYPE = SELECT)
F$loc;c-k T$M+u-k235507          (METHOD = BASIC)ITPUB个人空间T'of8R{;[H
          (BACKUP = SERVICEA)ITPUB个人空间cmk+}0Jw(v i!c
        )ITPUB个人空间aySu6zd#UhCV
      )
-cm ZV)ZM ?235507    )ITPUB个人空间j\ `,@#[*d_oH
    (LOAD_BALANCE = no)ITPUB个人空间^:i/@xC
  )

简单描述一下配置的思路。将上面3个服务名的配置分别添加到server Aserver BTNSNAMES.ORA文件中。

server A中通过SERVICEA服务名进行访问,在server B中通过SERVICEB服务名进行访问。SERVICEA_BACKUPSERVICEA所需的TAFBACKUP服务。

SERVICEA指定了两个DESCRIPTION,一个指定访问TESTRAC1实例(通过指定INSTANCE_NAME来实现),一个指定访问TESTRAC2实例,且在两个DESCRIPTION之间实现负载均衡(通过指定LOAD_BALANCE=YES来实现)。

SERVICEB很简单,就是配置TESTRAC3实例的连接方式。

这样server A上的程序通过SERVICEA可以负载均衡的访问实例TESTRAC1TESTRAC2,而server B上的程序通过SERVICEB可以访问实例TESTRAC3。这满足了第一点要求。

剩下的3点都是TAF有关,先来看看最简单的最后一条要求,当node3异常,server B上的应用通过node1/node2接管并Load Balance。而SERVICEBTAF配置的BACKUP服务指向的就是SERVICEA,也就是说,如果实例TESTRAC3出现了失败,server B会使用SERVICEA作为切换服务名,很自然的实现了在TESTRAC1TESTRAC2上负载均衡的接管失败会话。

剩下的两点的实现通过SERVICEA_BACKUP来实现。可以看到,SERVICEA中配置了的两个DESCRIPTION,分别对应TESTRAC1实例和TESTRAC2实例。而这两个实例的FAILOVER_MODEBACKUP配置是一样的,都是指向SERVICEA_BACKUP服务,也就是说,无论TESTRAC1实例异常,还是TESTRAC2实例异常,都会使用SERVICEA_BACKUP服务作为切换服务。

下面来看看SERVICEA_BACKUP服务,这个服务顺序配置了TESTRAC1TESTRAC2TESTRAC3三个服务的DESCRIPTION,且这三个服务之间没有采用负载均衡的策略(LOAD_BALANCE=no,这样用户在使用这个配置的时候,会首先尝试第一个DESCRIPTIONTESTRAC1,如果TESTRAC1服务可以连接成功,就使用这个服务,否则会尝试第二个DESCRIPTIONTESTRAC2,同样如果连接成功,就使用TESTRAC2,否则使用最后一个DESCRIPTIONTESTRAC3

当实例TESTRAC1发生异常,通过TAF切换到SERVICEA_BACKUP,首先找到的就是TESTRAC1DESCRIPTION,但是TESTRAC1已经发生故障,因此会继续寻找下一个DESCRIPTION,于是就找到了TESTRAC2服务。

当实例TESTRAC2发生异常,通过TAF切换到SERVICEA_BACKUP,首先找到的是TESTRAC1DESCRIPTION,如果TESTRAC1正常,就会连接到TESTRAC1上。

如果恰好TESTRAC1TESTRAC2实例都发生异常,切换到SERVICEA_BACKUP后,会先后跳过失败TESTRAC1TESTRAC2DESCRIPTION,最终找到TESTRAC3,并连接。从而满足了第二和第三点需求。

上面配置就实现了3个节点间灵活的负载均衡以及透明应用失败切换的配置。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/235507/viewspace-591587/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-08-08

  • 博文量
    209
  • 访问量
    864003