ITPub博客

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

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

原创 Linux操作系统 作者:yangtingkun 时间:2009-04-18 23:55:00 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

两台app server AB

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

server A通过node1node2时要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 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/4227/viewspace-590914/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10437731