这两天配置了一个三节点的RAC环境,想起前一段时间Thomas Zhang给我出的一个题目,配置一个三节点RAC环境的复杂负载均衡以及Transparent Application Failover的服务名。现在有环境了,可以将给出验证后的结果了。
这篇文章检验给出的实现是否满足需求。
灵活实现RAC三节点的负载均衡及TAF配置(一):http://yangtingkun.itpub.net/post/468/482683
上一篇给出了一个灵活设置负载均衡以及TAF的需求,同时给出了这个需求首先的TNSNAMES配置。这篇来验证一下配置是否正确。
首先在客户端的TNSNAMES.ORA中添加配置,由于篇幅的问题,这里就不重复了,具体配置可以参考第一篇文章。
下面首先验证第一点,通过SERVICEA服务是否实现在实例1和实例2上的负载均衡,通过SERVICEB服务是否可以登陆实例3:
SQL> CONN TEST/TEST@SERVICEA
已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac2
SQL> CONN TEST/TEST@SERVICEA
已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac1
SQL> CONN TEST/TEST@SERVICEA
已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac1
SQL> CONN TEST/TEST@SERVICEA
已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac2
SQL> CONN TEST/TEST@SERVICEA
已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac2
SQL> CONN TEST/TEST@SERVICEA
已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac1
可以看到在目前两个实例的负载都很小的情况下,SERVICEA以一种近似轮巡的方式分别连接到实例TESTRAC1和TESTRAC2上。
SQL> CONN TEST/TEST@SERVICEB
已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac3
SQL> CONN TEST/TEST@SERVICEB
已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac3
SQL> CONN TEST/TEST@SERVICEB
已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac3
SQL> CONN TEST/TEST@SERVICEB
已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac3
而SERVICEB显然只能连接到实例TESTRAC3上。
下面验证第二点需求,分别验证TESTRAC1和TESTRAC2实例失败的情况:
SQL> CONN TEST/TEST@SERVICEA
已连接。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac1
客户端通过SERVICEA连接到TESTRAC1上,下面通过SRVCTL命令关闭TESTRAC1:
bash-3.00$ srvctl status db -d testrac
实例 testrac1 正在节点 racnode1 上运行
实例 testrac2 正在节点 racnode2 上运行
实例 testrac3 正在节点 racnode3 上运行
bash-3.00$ srvctl stop inst -d testrac -i testrac1
下面检查刚才的会话是否已经迁移到TESTRAC2上:
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac2
SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;
INSTANCE_NAME
----------------
testrac2
testrac3
下面启动TESTRAC1实例:
bash-3.00$ srvctl start inst -d testrac -i testrac1
检查目前数据库实例状态:
SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;
INSTANCE_NAME
----------------
testrac2
testrac1
testrac3
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac2
下面关闭实例TESTRAC2:
bash-3.00$ srvctl stop inst -d testrac -i testrac2
检查会话的所在实例:
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac1
SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;
INSTANCE_NAME
----------------
testrac1
testrac3
可以看到这个配置已经满足需求的第二点,当TESTRAC1实例异常,切换到TESTRAC2,如果TESTRAC2实例异常则切换到TESTRAC1,下面验证需求的第三点,如果实例1和实例2都发生异常的情况。
利用srvctl关闭实例1:
bash-3.00$ srvctl stop inst -d testrac -i testrac1
检查会话所在实例:
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac3
SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;
INSTANCE_NAME
----------------
testrac3
现在满足了负载均衡的第三点需求,当两个实例都失败时,切换到第三个实例TESTRAC3上。最后验证最后一个需求。
bash-3.00$ srvctl status db -d testrac
实例 testrac1 没有在 racnode1 节点上运行
实例 testrac2 没有在 racnode2 节点上运行
实例 testrac3 正在节点 racnode3 上运行
bash-3.00$ srvctl start inst -d testrac -i "testrac1,testrac2"
检查实例启动情况:
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac3
SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;
INSTANCE_NAME
----------------
testrac3
testrac2
testrac1
下面关闭实例TESTRAC3:
bash-3.00$ srvctl stop inst -d testrac -i testrac3
检查会话所在实例:
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac2
SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;
INSTANCE_NAME
----------------
testrac2
testrac1
启动实例TESTRAC3:
bash-3.00$ srvctl start inst -d testrac -i testrac3
重新以SERVICEB服务登陆:
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
使用其他客户端,多建立几个连接,连接到TESTRAC2实例,然后再次关闭TESTRAC3实例:
bash-3.00$ srvctl stop inst -d testrac -i testrac3
检查实例所在会话:
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac1
SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;
INSTANCE_NAME
----------------
testrac1
testrac2
这个配置显然也满足了第四点需求,在实例3出现问题的时候在实例TESTRAC1和实例TESTRAC2上实现负载均衡的切换。
至此所有验证工作完成,这个TNSNAMES.ORA的配置满足所有的负载均衡和TAF的需求。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-590957/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-590957/