在Oracle RAC环境下,每个节点都会有多个IP地址,分别为Public/Private/Vip,这三个IP到底有啥区别呢?分别用在那些场合呢?
1. private IP address is used only for internal clustering processing (Cache Fusion)
私有IP用于心跳同步,这个对于用户层面,可以直接忽略,简单理解,这个Ip用来保证两台服务器同步数据用的私网IP。
2. virtual IP is used by database applications to enable fail over when one cluster node fails
虚拟IP用于客户端应用,以支持失效转移,通俗说就是一台挂了,另一台自动接管,客户端没有任何感觉。这也是为什么要使用RAC的原因之一,另一个原因,我认为是负载均衡。
3. public IP adress is the normal IP address typically used by DBA and SA to manage storage, system and database.
公有IP一般用于管理员,用来确保可以操作到正确的机器,我更愿意叫他真实IP。
通过上述解释,不难理解作为一个DBA,在配置tnsnames.ora时,有些场合是要使用的vip,而有些场合又必须使用public IP。
例如,当你在定位一个数据库的死锁时,使用public ip,可以确保连到你想处理的机器,相反此时使用虚拟ip时,会出现不确定性,因为服务器默认是开启负载均衡的,也就是有可能你想连A机,系统却给你分配了B机。
例如:
下面的例子就是使用的VIP
infodb8 =
(DESCRIPTION=
(ADDRESS=(PROTOCOL= TCP)(HOST=138.*.1.81)(PORT= 1521))
(ADDRESS=(PROTOCOL= TCP)(HOST=138.*.1.82)(PORT= 1521))
(LOAD_BALANCE= yes)
(FAILOVER= ON)
(CONNECT_DATA=
(SERVER= DEDICATED)
(SERVICE_NAME= infodb)
(FAILOVER_MODE=
(TYPE=SELECT)
(METHOD= BASIC)
(RETRIES= 30)
(DELAY= 5)
)
))
下面的例子就是使用的Public IP,指定连接1机,注意红色字体infodb1进一步限制连接的实例。
INFODB83 =
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL= TCP)(HOST=138.*.1.83)(PORT= 1521))
)
(CONNECT_DATA=
(SERVICE_NAME= infodb)
(INSTANCE_NAME= infodb1)
)
(HS = OK)
)
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;
Oracle11gR2SCAN
从上面第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个。
VIP 原理
Oracle 的TAF 就是建立在VIP 技术之上的。
IP 和VIP 区别在于:
IP 是利用TCP层超时, VIP 利用的是应用层的立即响应。VIP 它是浮动的IP。 当一个节点出现问题时会自动的转到另一个节点上。
假设有一个2个节点的RAC,正常运行时每个节点上都有一个VIP。 VIP1 和VIP2.
当节点2发生故障,比如异常关系。RAC 会做如下操作:
1). CRS 在检测到rac2节点异常后,会触发Clusterware 重构,最后把rac2节点剔除集群,由节点1组成新的集群。
2). RAC的Failover 机制会把节点2的VIP转移到节点1上,这时节点1的PUBLIC 网卡上就有3个IP 地址: VIP1,VIP2, PUBLIC IP1.
3). 用户对VIP2的连接请求会被IP层路由转到节点1
4). 因为在节点1上有VIP2的地址,所有数据包会顺利通过路由层,网络层,传输层。
5). 但是,节点1上只监听VIP1和public IP1的两个IP地址。并没有监听VIP2,故应用层没有对应的程序接收这个数据包,这个错误立即被捕获。
6). 客户端能够立即接收到这个错误,然后客户端会重新发起向VIP1的连接请求。
转自:http://blog.csdn.net/cneaglelee/article/details/9295773