问题:
用户一套Oracle19c RAC集群,出现一个奇怪的现象,通过SCAN IP访问的连接会话都集中在节点一实例,而且用户并没有做任何的节点服务访问去控制会话的连接节点,比如常见的通过集群的高可用服务去控制应用访问连接集中在同一节点,从而避免gc产生性能消耗问题。
问题分析:
因为应用都是通过scan ip去连接的数据库,所以我们首先先检查了scan监听listener_scan1的服务注册情况,发现监听上面的服务注册存在问题,监听上的每个服务注册实例只有节点一,并没有节点二的实例,这也解释了为什么应用访问RAC集群都集中在节点一的原因,因为节点二实例根本就没有服务注册进scan监听
接下来检查节点二的scan监听实例配置参数remote_listener,确认是否有配置向scan 监听进行注册的地址,可以看到remote_listener有配置scan ip的域名以及端口
检查scan_listener的日志,发现存在一些异常的报错信息,显示出现访问被拒绝的情况,这里的169.254.31.131为节点二的haip
Incoming connection from 169.254.31.131 rejected
TNS-12546: TNS:permission denied
TNS-12560: TNS:protocol adapter error
TNS-00516:Permission denied
怀疑是不是设置了白名单访问导致的问题,检查节点一的sqlnet.ora配置,发现白名单的IP列表有包含整个业务网段(public ip,vip,scan ip所在的网段)xxx.xxx.3.*
通过跟踪数据库注册服务的过程,获取进一步详细的信息,需要注意的事,在12c之后,数据库向监听动态注册服务的后台进行为LREG (ListenerREGistration)进程,不是之前版本的pmon进程,对LREG开启跟踪
--查看lreg进程spid
ps -ef |grep lreg
--进行跟踪
oradebug setospid xxx
oradebug dump sqlnet_server_trace 16
--关闭跟踪
oradebug dump sqlnet_server_trace 0
分析产生的跟踪文件xxx_lreg_xxx.trc,可以看到一开始数据库是向SCAN IP:xxx.xxx.3.20的地址进行注册
但后面解析地址又返回的是scan监听所在节点的haip169.254.7.254,然后遇到了错误TNS-12547,TNS-12560
为什么注册scan监听最后变成是haip的通信,我们从Oracle mos官方上的文章ORA-12514 & Services Fail to Register to SCAN Listeners After HAIP Offline (Doc ID 2500067.1)发现了答案,原来从12c之后,scan监听通过配置参数REMOTE_REGISTRATION_ADDRESS_<listener_name
将haip作为远程注册的地址,从而限制实例的动态服务注册只能通过haip进行
lsnrctl show remote_registration_address listener_scan1查看scan监听的远程注册地址, 可以看到scan监听的远程注册地址为169.254.7.254
这时我们再重新回到之前检查scan监听的日志错误以及白名单的配置,为啥会出现注册节点haip 169.254.31.131被拒绝的情况,就是因为白名单里面只配置了业务网段xxx.xxx.3.*,但没有加入haip网段169.254.*.*,导致节点二通过haip注册节点一的scan 监听时被拒绝
Incoming connection from 169.254.31.131 rejected
TNS-12546: TNS:permission denied
TNS-12560: TNS:protocol adapter error
TNS-00516:Permission denied
问题解决
将haip网段169.254.*.*加入白名单的tcp.invited_nodes配置列表里面,然后重启scan监听恢复正常,节点二的实例也能注册到scan 监听里面