SCAN Listener 与 Local Listener
RAC 里面有 SCAN Listener 与 Local Listener。SCAN Listener 是实现 SCAN 自动负载均衡的原理所在。SCAN Listener 与 Local Listener 协同工作,它们是一种相互依赖的关系。
正常情况下,VIP 被分配在各自对应的节点上,Local Listener 监听在各自节点的物理 IP 与 VIP 上;SCAN VIP 与 SCAN Listener 被随机分配到所有节点服务器上,某个 SCAN Listener 监听在某些 SCAN VIP 上( SCAN Listener 最多三个)。
每个节点的实例在启动的时候会向 Local Listener 和所有的 SCAN Listener 注册。分别由参数 LOCAL_LISTENER 和 REMOTE_LISTENER 控制。实例在向本地监听器和 SCAN 监听器动态注册的时候,会向监听器提供服务名称、当前负载、建议有多少个连接可以直接连接到实例等信息,为 SCAN 能够准确地完成负载均衡提供必要信息,这个过程可以通过监听器的日志看出来。
对于本地监听注册,实例只向本地监听注册,所以,lsnrctl status 可以看到服务名只对应本地实例,而实例向所有 SCAN Listener 注册,所以,lsnrctl status 可以看到服务名对应所有实例。
客户端通过SCAN连接到数据库,首先由DNS服务器解析SCAN名称,DNS服务器返回SCAN对应的3个IP地址的列表,11gR2的客户端会选择使用其中一个SCAN VIP地址作为连接地址(如果不能连接,则自动选择另外一个),SCAN Listener 将连接信息通过负载均衡机制将请求再转发给某个空闲服务器的本地监听器,由本地监听器完成实例与客户端之间的连接。
如果服务器不是11GR2,只能使用传统的RAC连接方法,在服务器是11gr2但客户端版本不是11gR2,这将导致客户端不能完全感受到SCAN的特性,原因在于Oracle客户端不能操作由DNS服务器返回的3个IP地址列表。因此,它只试图连接到返回列表中的第一个地址,将或多或少地忽略其他地址。解决办法是将连接地址修改为三个 SCAN VIP 即可(需要配合 LOAD_BALANCE=ON 和 FAILOVER=ON)。
为什么要有 VIP ?
当一台服务器出现故障,该节点的VIP会自动漂移到其他活动的节点。VIP的优势在于即使服务器停机,VIP发生漂移之后依然是活动的,它能有效减少客户端获得服务器响应的等待时间(物理IP会一直到TCP/IP超时为止,这个等待根据平台的不同有所不同,可能长达数分钟)。如果使用的是VIP,当节点出现故障时,VIP会自动漂移到其他活动的节点,虽然活动的节点服务器的监听并没有在漂移过来的VIP上监听请求,但是当向该VIP地址发送请求时,Clusterware中的FAN机制会迅速通知客户端(客户端是一个FAN Client)该VIP无法处理连接请求,这时客户端的Failover机制会将请求重新发送到客户端ADDRESS列表中的其他VIP地址,直到客户端连接成功为止或列表的地址都连接失败。这个过程对于客户端来说是透明的,它感受不到RAC有节点出现停机,且整个过程能在很短的时间内完成。
为什么要有 SCAN VIP?
SCAN VIP是SCAN监听器监听地址,节点VIP是本地监听器监听地址,其最大的不同在于,11gR2之前只能使用节点VIP连接数据库,当节点发生故障失败之后,该节点的VIP地址会漂移到其他正常节点的公共IP上,但是正常节点的监听器并没有发生变化,也就是说存活的监听并没有在漂移过来的VIP地址上监听请求,从而通过这个VIP地址是无法正常连接到数据库的,只有等故障节点恢复,该VIP漂移回原有的节点,监听器才会重新在该VIP上监听。然而SCAN VIP却有所不同,如果某个节点发生故障,运行在该节点上面的SCAN VIP会漂移到其他正常的节点公共网络设备上,SCAN Listener也会跟随漂移过去继续在相同的SCAN VIP上监听,等到PMON进程下次动态更新实例信息到该SCAN监听器之后,该SCAN Listener又能重新接受客户端的连接了。