在虚拟机环境如果物理主机的公网网线断开的时候,虚拟机内部对应的公网网卡并不知晓物理网线的断开,RAC也不会检测到这种物理网线的断开,VIP等资源也不会做failover。这实际导致rac 的VIP Listener 在公网故障时的 failover 功能失效。
具体环境:
软件环境:Oracle VM 3 + Oracle Linux 6+ Oracle RAC Cluster 11.2.0.4
架构环境:两节点RAC集群,集群节点分别运行在Oracle VM虚拟机上,RAC的private network和public network分别桥接在OVM Server不同的物理网卡上,物理网卡均为OVM的VM Network。
问题:
当断开private network所桥接的物理网卡(拔物理网线),由于心跳丢失,RAC集群可以触发节点重启或者服务切换;<<<<<<<<====这是正常现象
当断开public network所桥接的物理网卡(拔物理网线),由于public network的检测机制仅判断集群节点网卡的状态,但在OVM虚拟化上网卡状态一直处于active状态,因此导致服务无法切换;
<<<<<===这实际是有问题的。
原因分析:
从11.2 开始Oracle 检查公网的策略有所变化,集群默认会通过一些工具检查公网网卡和IP,只有当前面的检查工具失败时才会检查默认网关。
当虚拟机公网桥连的外部网线断开的时候,虚拟机内部并不会有任何的变化,就是说这个时间公网网卡,IP等都是通的,所以集群不会检测到这种错误。
所以不会触发VIP和 SCAN listener VIP的failover。
解决方案:
从12.1.0.2 开始Oracle推出了Ping Target 功能来额外获取公网断开的通知并采取相应的failover动作。
Ping Target  功能是通过预先设定一个远端的IP或者主机名实现的,这样除了常规的本地公网检查之外,集群还将检查这个远端的IP或者主机名。
如果本地或者远端的检查有任何一个失败,集群将触发VIP的failover 等动作。
远端IP或者主机名一般设定为一个有意义的地址比如可以设置为连接application 和 DB 的中央交换机或者公网的网关。
可以通过如下命令设置Ping Target
srvctl modify network -k 1 -pingtarget “<UsefulTargetIP(s)>”
srvctl config network
Example:
Network 1 exists
Subnet IPv4: 10.141.132.0/255.255.254.0/bondeth0, static
Subnet IPv6:
Ping Targets:
Network is enabled
Network is individually enabled on nodes:
Network is individually disabled on nodes:
Network 2 exists
Subnet IPv4: 192.168.8.0/255.255.252.0/bondib0, static
Subnet IPv6:
Ping Targets:
Network is enabled
Network is individually enabled on nodes:
Network is individually disabled on nodes:
注意: 11.2.04 暂时不能实现这个功能,因为目前需要打的Patch 17019319还在开发过程中。
参考:12.1.0.2 Ping Target for Oracle Clusterware VIP (Doc ID 1958241.1)