天天看点

oracle RAC的VIP和scan

我们都知道oracle rac中每个节点都有一个虚拟ip,简称vip,与公网ip在同一个网段。

没有vip时,oracle客户端是靠“tcp/ip协议栈超时”来判断服务器故障。而tcp/ip协议栈是作为os kernel的一部分来实现,不同的os有不同的阀值,用户获悉数据库异常的时间完全取决于os kernel的实现,虽然有些os允许修改这个阀值,但是会对其它程序产生未知影响。因此,oracle rac引入了vip,从而避开对tcp协议栈超时的依赖。

vip和ip最主要的不同之处在于:vip是浮动的,而ip是固定的。在所有节点都正常运行时,每个节点的vip会被分配到public nic上;在linux下ifconfig查看,public网卡上是2个ip地址;如果一个节点宕机,这个节点的vip会被转移到还在运行的节点上。也就是幸存的节点的public nic这个网卡上,会有3个ip地址。

当一个节点宕机,这个节点真实ip就连接不上了,但是这个节点的虚拟ip是可以连接的,他会自动把客户端的连接请求转接给存活的节点。

在tnsname.ora文件里,指定address列表,客户端会随机选择一个节点来连接数据库,而不是顺序选择的。

vip特点:

1 vip是在clusterware安装最后阶段,通过脚本vipca创建的;

2 vip作为一个nodeapps类型的crs resource注册到ocr中,并由crs维护状态;

3 vip会绑定到节点的public 网卡上;那么public网卡就有两个地址了;

4 当某个节点发生故障时,crs会把故障节点的vip转移到其他节点上;

5 每个节点的listener会同时在public网卡的public ip和vip两个地址上监听;

6 客户端的tnsname.ora一般会配置指向节点的vip;

从上面第6条可以引出一个问题。如果增加一个节点,那么客户端的tnsname.ora需要加入新增节点的vip。那么想象一下:多个客户端,增加多个节点,那么维护起来特别麻烦。因此到了oracle11gr2,引入了一个scan的概念。

scan,single client access name。简单客户端连接名,这是一个唯一的名称,在整个公司网络内部唯一,并且在dns中可以解析为三个ip地址,客户端连接的时候只需要知道这个名称,并连接即可, 每个scan vip对应一个scan listener,cluster内部的service在每个scan listener上都有注册,scan listener接受客户端的请求,并foward到不同的local listener中去,还是由local 的listener提供服务给客户端。

注意:scan不一定要resolve到三个ip,一个也够了。只不过为了防止scan单点故障而推荐3个。