Connect to Oracle RAC Span FireWall [Use Python Test]

某数据库扩容案例,数据库从原有的REDHAT CS模式改为RAC模式。应用程序原来使用的是单实例,在新环境上线前的调试过程当中遇到了一些问题,记录一下解决过程。

新环境如下:

Connect to Oracle RAC Span FireWall [Use Python Test] - 德哥(DiGoal,Just Do It!) - Not Only DBA
 

最左边的是应用程序,中间是防火墙,右边是RAC节点。

应用程序和RAC节点的连接经过了一道防火墙,防火墙在这里冲当了NAT(映射数据库的两个VIP)的角色。也就是说客户端看到的IP和数据库本身的VIP是不一样的(这是问题的关键)。

服务端的配置如下:

xxxx_a PREF: xxxx1 AVAIL: xxxx2
xxxx_b PREF: xxxx2 AVAIL: xxxx1
当前的实例与服务对应情况如下
Service xxxx_a is running on instance(s) xxxx1
Service xxxx_b is running on instance(s) xxxx2
通过配置客户端的FAILOVER模式连接RAC节点,
配置一的模式:
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=${HOST_1})(PORT=xxxx))(ADDRESS=(PROTOCOL=TCP)(HOST=${HOST_2})(PORT=xxxx)))(LOAD_BALANCE = OFF)(FAILOVER = ON)(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME=xxxx_b)(FAILOVER_MODE =(TYPE = SELECT)(METHOD = BASIC)(RETRIES = 600)(DELAY = 1))))
配置二的模式:
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=${HOST_2})(PORT=xxxx))(ADDRESS=(PROTOCOL=TCP)(HOST=${HOST_1})(PORT=xxxx)))(LOAD_BALANCE = OFF)(FAILOVER = ON)(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME=xxxx_b)(FAILOVER_MODE =(TYPE = SELECT)(METHOD = BASIC)(RETRIES = 600)(DELAY = 1))))
配置一和配置二的不同之处在于,HOST1和HOST2的先后。
准备PYTHON连接数据库的环境:
下载PYTHON连接数据库需要的so文件,32位版本cx_Oracle-5.0.3-10g-py24-1.i386.rpm,64位版本cx_Oracle-5.0.3-10g-py24-1.x86_64.rpm。
1. 连接模式一的测试:
shell> python
import cx_Oracle
dsn1=’模式一拷贝过来’
conn=cx_Oracle.connect(‘user’,'pwd’,dsn1)
cursor = conn.cursor()
cursor.execute(“select * from tbl_test”)
print cursor.fetchall()
执行到conn=cx_Oracle.connect(‘user’,'pwd’,dsn1)时,一直等待连接,最后报连接异常。
cx_Oracle.DatabaseError: ORA-12170: TNS:Connect timeout occurred
2. 连接模式二的测试:
shell> python
import cx_Oracle
dsn1=’模式二拷贝过来’
conn=cx_Oracle.connect(‘user’,'pwd’,dsn1)
cursor = conn.cursor()
cursor.execute(“select * from tbl_test”)
print cursor.fetchall()
连接正常,返回结果正常。
关闭非当前连接节点,重新执行SQL可以正常返回。
3. 修复连接模式一的异常:
把节点一的监听关闭。
重新使用连接模式一连接数据库,连接正常,返回结果正常。
4.在内网测试,(客户端和数据库的连接不过防火墙):
首先把关闭的监听开启,等待SERVICE在注册后,重新测试连接模式一和连接模式二,连接正常。关闭非当前连接节点,重新执行SQL可以正常返回。
总结:
这个测试结合了服务端的TAF特性和客户端的TAF特性。
并且反应了服务端TAF和客户端TAF的不同。
服务端TAF对于应用来说是透明的,最终建立连接的实例一个要看服务的FAILOVER模式,对于本例使用的AVAIL+ACTIVE模式的情况,连接的实例是跑服务的实例。
客户端的TAF配置决定了客户端首先和哪个实例建立联系,所以出现了通过防火墙时有一种情况不通,是因为首先建立联系的监听会返回给客户端REMOTE监听的VIP,而这个IP是内网IP,所以客户端再次与另一个实例建立联系就不可能了。而把其中的一个节点关闭后,客户端不能与第一个IP建立联系,自动向第二个IP(外网)发起请求,当然就可以成功了。
因为内网的话IP都是互通的,所以在内网不管怎么配置都不会有问题。
其实要解决这个问题的话,可以通过DNS解析来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值