这两天配置了一个三节点的RAC环境,想起前一段时间Thomas Zhang给我出的一个题目,配置一个三节点RAC环境的复杂负载均衡以及Transparent Application Failover的服务名。现在有环境了,可以将给出验证后的结果了。
这篇文章给出问题以及问题的实现。
首先描述一下3台RAC服务器,IP地址分别为172.25.198.222、172.25.198.223和172.25.198.226,对应的VIP分别是172.25.198.224、172.25.198.225和172.25.198.227。数据库版本是10203 for Solaris sparc 64。
数据库名为testrac,三个实例分别为testrac1、testrac2、testrac3。
首先看一下Thomas Zhang给出的题目需求:
给你个题目,我上次搞了好一会儿,呵呵
需求:一个RAC,三个节点node1,node2,node3。
要求:1)正常情况下,server A通过node1和node2访问数据库,server B通过node3访问数据。
server A通过node1和node2时要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 A和server B的TNSNAMES.ORA文件中。
在server A中通过SERVICEA服务名进行访问,在server B中通过SERVICEB服务名进行访问。SERVICEA_BACKUP是SERVICEA所需的TAF的BACKUP服务。
SERVICEA指定了两个DESCRIPTION,一个指定访问TESTRAC1实例(通过指定INSTANCE_NAME来实现),一个指定访问TESTRAC2实例,且在两个DESCRIPTION之间实现负载均衡(通过指定LOAD_BALANCE=YES来实现)。
SERVICEB很简单,就是配置TESTRAC3实例的连接方式。
这样server A上的程序通过SERVICEA可以负载均衡的访问实例TESTRAC1和TESTRAC2,而server B上的程序通过SERVICEB可以访问实例TESTRAC3。这满足了第一点要求。
剩下的3点都是TAF有关,先来看看最简单的最后一条要求,当node3异常,server B上的应用通过node1/node2接管并Load Balance。而SERVICEB的TAF配置的BACKUP服务指向的就是SERVICEA,也就是说,如果实例TESTRAC3出现了失败,server B会使用SERVICEA作为切换服务名,很自然的实现了在TESTRAC1和TESTRAC2上负载均衡的接管失败会话。
剩下的两点的实现通过SERVICEA_BACKUP来实现。可以看到,SERVICEA中配置了的两个DESCRIPTION,分别对应TESTRAC1实例和TESTRAC2实例。而这两个实例的FAILOVER_MODE的BACKUP配置是一样的,都是指向SERVICEA_BACKUP服务,也就是说,无论TESTRAC1实例异常,还是TESTRAC2实例异常,都会使用SERVICEA_BACKUP服务作为切换服务。
下面来看看SERVICEA_BACKUP服务,这个服务顺序配置了TESTRAC1、TESTRAC2和TESTRAC3三个服务的DESCRIPTION,且这三个服务之间没有采用负载均衡的策略(LOAD_BALANCE=no),这样用户在使用这个配置的时候,会首先尝试第一个DESCRIPTION:TESTRAC1,如果TESTRAC1服务可以连接成功,就使用这个服务,否则会尝试第二个DESCRIPTION:TESTRAC2,同样如果连接成功,就使用TESTRAC2,否则使用最后一个DESCRIPTION:TESTRAC3。
当实例TESTRAC1发生异常,通过TAF切换到SERVICEA_BACKUP,首先找到的就是TESTRAC1的DESCRIPTION,但是TESTRAC1已经发生故障,因此会继续寻找下一个DESCRIPTION,于是就找到了TESTRAC2服务。
当实例TESTRAC2发生异常,通过TAF切换到SERVICEA_BACKUP,首先找到的是TESTRAC1的DESCRIPTION,如果TESTRAC1正常,就会连接到TESTRAC1上。
如果恰好TESTRAC1和TESTRAC2实例都发生异常,切换到SERVICEA_BACKUP后,会先后跳过失败TESTRAC1和TESTRAC2的DESCRIPTION,最终找到TESTRAC3,并连接。从而满足了第二和第三点需求。
上面配置就实现了3个节点间灵活的负载均衡以及透明应用失败切换的配置。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/235507/viewspace-591587/ ,如需转载,请注明出处,否则将追究法律责任。