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

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

这篇解决其中一个节点没有启动时带来的连接失败问题。

灵活实现RAC三节点的负载均衡及TAF配置(一):http://yangtingkun.itpub.net/post/468/482683

灵活实现RAC三节点的负载均衡及TAF配置(二):http://yangtingkun.itpub.net/post/468/482724

 

 

上一篇的配置基本实现了负载均衡配置的需要,但是存在一点问题,当节点3失败的时候,当前连接到节点3上的会话会自动FAILOVER到节点1和节点2上,但是新的会话尝试连接到节点3,就会报错。

SQL> CONN TEST/TEST@SERVICEB
已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac3

下面关闭实例3

$ srvctl stop inst -d testrac -i testrac3

再次检查刚才的实例:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac2

FAILOVER设置生效了,连接到实例3的会话自动切换到实例2上,但是这种配置没有解决新连接的问题,如果这时再次连接实例3,则会报错:

SQL> CONN TEST/TEST@SERVICEB
ERROR:
ORA-12521: TNS:
监听程序无法解析连接描述符中给定的 INSTANCE_NAME


警告: 您不再连接到 ORACLE

其实这个问题不难解决,修改TNSNAMES.ORA中的配置如下:

SERVICEB =
  (DESCRIPTION_LIST =
    (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)
        )
      )
    )
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))
        (ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))
      )
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = TESTRAC)
        (FAILOVER_MODE =
          (TYPE = SELECT)
          (METHOD = BASIC)
          (BACKUP = SERVICEA_BACKUP)
        )
      )
    )
    (LOAD_BALANCE = no)
  )

由于只牵扯到节点3的问题,因此只需要修改SERVICEB的配置,其他两个配置SERVICEASERVICEA_BACKUP的配置不需要修改。

下面重现启动实例3,再次执行刚才的测试:

SQL> CONN TEST/TEST@SERVICEB
已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac3

SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;

INSTANCE_NAME
----------------
testrac3
testrac2
testrac1

现在3个节点都处于启动状态,下面仍然关闭节点3

$ srvctl stop inst -d testrac -i testrac3

再次检查当前连接的实例:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac1

FAILOVER起作用了,连接到节点3上的会话重现连接到节点1上。再次通过SERVICEB服务连接到节点3上:

SQL> CONN TEST/TEST@SERVICEB
已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac2

SQL> CONN TEST/TEST@SERVICEB
已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac1

这次连接节点3没有再次报错,而是在节点1和节点2的实例上以负载均衡的方式实现连接,这样新连接到实例3上的会话,就会实例3上已经建立的会话保持一致了。

 

 

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

转载于:http://blog.itpub.net/4227/viewspace-608878/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值