排查分析:
现场排查分析以及结合tcpdump抓包发现重定向数据库服务器10.x.x.x返回主机名suse-db1异常,发现下面与此有关的线索:
1、通过对rac的节点16、17两个服务实例的remote_listener,local_listener参数配置发现16节点没有对local_listener设置值,而17上则配置虚拟IP的访问方式。
由于它们配置不一致,根据rac集群运行方式及访问负载均衡原理,势必在相对创建连接频率高时,会影响到客户端的配置rac模式访问出现间隙无法正常获取到suse-db1的数据库实例。
原因有3点:
1)、由于RAC集群配置方式下,是先通过远程监听,再到本地监听,最后到service运行方式(scan listener 也就是remote listener,而service存在于数据库实例上)。此时因为scan
因rac的scan监听器注册两个节点实例,它能够负载均衡地分发连接请求到节点本地监听器上,也就是连接到其本地节点上实例上。另外就是remote service设置用于scan监听器。
SQL> ALTER SYSTEM SET LOCAL_LISTENER = '(ADDRESS = (PROTOCOL = TCP)(HOST = IP1)(PORT = 1521)) 'SID = 'prodb1';
系统已更改。
现场排查分析以及结合tcpdump抓包发现重定向数据库服务器10.x.x.x返回主机名suse-db1异常,发现下面与此有关的线索:
1、通过对rac的节点16、17两个服务实例的remote_listener,local_listener参数配置发现16节点没有对local_listener设置值,而17上则配置虚拟IP的访问方式。
由于它们配置不一致,根据rac集群运行方式及访问负载均衡原理,势必在相对创建连接频率高时,会影响到客户端的配置rac模式访问出现间隙无法正常获取到suse-db1的数据库实例。
原因有3点:
1)、由于RAC集群配置方式下,是先通过远程监听,再到本地监听,最后到service运行方式(scan listener 也就是remote listener,而service存在于数据库实例上)。此时因为scan
因rac的scan监听器注册两个节点实例,它能够负载均衡地分发连接请求到节点本地监听器上,也就是连接到其本地节点上实例上。另外就是remote service设置用于scan监听器。
2)、在同一个RAC下,两个节点本地local_listener不一致,而local_listener配置host访问方式,决定客户端rac配置jdbc的host访问方式。加上我们原本的jdbc一直沿用的IP地址访问。
3)、对于为什么同一个配置,在A应用和B应用上面没有问题,主要是由于A应用和B应用的连接频率比较少,所以没有体现出来。
这个问题定位因为本地监听参数未配置导致,如截图:
1号节点:
2号节点:
针对这个问题解决方法有3种:
1)、取消remote listener远程注册的功能,每个监听实例只注册自己本地的实例服务
登录每个节点,取消remote_listener远程注册服务的功能
sqlplus / as sysdba
sql> alter system set remote_listener='';
2)、更改1号节点本地监听local_listener参数,并注册服务
SQL>conn / as sysdba;
Connected.SQL> ALTER SYSTEM SET LOCAL_LISTENER = '(ADDRESS = (PROTOCOL = TCP)(HOST = IP1)(PORT = 1521)) 'SID = 'prodb1';
系统已更改。
3)、所有应用主机/etc/hosts里面加入susedb-1,susedb-2的IP地址和主机名绑定
登录所有应用服务器,增加IP地址与主机名绑定指向,操作如下:
vi /etc/hosts
ip1 susedb-1
ip2 susedb-2