这两天配置了一个三节点的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。
两台app server A和B
要求:1)正常情况下,server A通过node1和node2访问数据库,server B通过node3访问数据。
server A通过node1和node2时要load balance
2)当node1异常,server A上的应用通过node2访问
当node2异常,server A上的应用通过node1访问
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 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = TESTRAC)
(INSTANCE_NAME = TESTRAC1)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(BACKUP = SERVICEA_BACKUP)
)
)
)
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = TESTRAC)
(INSTANCE_NAME = TESTRAC2)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(BACKUP = SERVICEA_BACKUP)
)
)
)
(LOAD_BALANCE = yes)
)
SERVICEB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.227)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = TESTRAC)
(INSTANCE_NAME = TESTRAC3)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(BACKUP = SERVICEA)
)
)
)
SERVICEA_BACKUP =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = TESTRAC)
(INSTANCE_NAME = TESTRAC1)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(BACKUP = SERVICEA_BACKUP)
)
)
)
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = TESTRAC)
(INSTANCE_NAME = TESTRAC2)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(BACKUP = SERVICEA_BACKUP)
)
)
)
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.227)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = TESTRAC)
(INSTANCE_NAME = TESTRAC3)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(BACKUP = SERVICEA)
)
)
)
(LOAD_BALANCE = no)
)
简单描述一下配置的思路。将上面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博客 ” ,链接:http://blog.itpub.net/4227/viewspace-590914/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-590914/