数据库节点二VIP异常故障分析(四)

2015-02-03 04:25:33 · 作者: · 浏览: 137
ess:700000384763938 OS pid: 1151516

Sun Apr 29 03:42:00 BEIST 2012

Process OS id : 1151516 alive after kill

Errors in file/oracle/product/10.2.0/admin/xxxxdb/udump/xxxxdb2_ora_110596.trc

Immediate Kill Session#: 1668, Serial#: 2

Immediate Kill Session: sess:700000383763638 OS pid: 693786

Sun Apr 29 03:42:01 BEIST 2012

Process OS id : 693786 alive after kill

Errors in file/oracle/product/10.2.0/admin/xxxxdb/udump/xxxxdb2_ora_110596.trc

Immediate Kill Session#: 1669, Serial#: 2

Immediate Kill Session: sess:70000038275d1f8 OS pid: 1292056

6

― 说明:故障期间,节点二上数据库的Service被OFFLINE,这一点正常。但随后CRS

将连接到节点二上的所有客户端连接都强行Kill掉了。该问题和Oracle Bug 6955040有

关。

五、分析RACGVIP

由于问题原因定位到 VIP资源异常上,而VIP切换到节点一上是正常的,

因此极有可能是由于VIP检查的时候出现异常导致CRS 将VIP OFFLINE。由于

Oracle CRS在进行VIP检测的时候是通过RACGVIP这个 SHELL脚本实现功能

的,因此我们分析和测试了RACGVIP脚本。

我们注意到其中一段脚本,如下:

#Check the status of the interface thro' pinging gateway

if[ -n "$DEFAULTGW" ]

then

_RET=1

#get base IP address of the interface

tmpIP=`$LSATTR -El ${_IF} -a netaddr | $AWK '{print $2}'`

#get RX packets numbers

_O1=`$NETSTAT -n -I $_IF | $AWK "{ if (/^$_IF/) {print \\$5;exit}}"`

x=$CHECK_TIMES

while [ $x -gt 0 ]

do

if [ -n "$tmpIP" ]

then

$PING -S $tmpIP $PING_TIMEOUT $DEFAULTGW > /dev/null 2>&1

else

$PING $PING_TIMEOUT $DEFAULTGW > /dev/null 2>&1

fi

_O2=`$NETSTAT -n -I $_IF | $AWK "{ if (/^$_IF/) {print \\$5;exit}}"`

if [ "$_O1" != "$_O2" ]

then

# RX packets numbers changed

_RET=0

break

fi

$SLEEP 1

x=`$EXPR $x - 1`

done

if [ $_RET -ne 0 ]

then

logx "checkIf: RX packets checked if=$_IF failed"

else

logx "checkIf: RX packets checked if=$_IF OK"

fi

else

logx "checkIf: Default gateway is not defined(host=$HOSTNAME)"

if [ $FAIL_WHEN_DEFAULTGW_NO_FOUND -eq 1 ]

then

_RET=1

else

_RET=0

fi

fi

― 说明:这段脚本说明,CRS在做VIP check的时候机制如下,定期向缺省网关(Default

Gateway)发包,如果发包前后检测到网卡上有包流量(output值前后不一样)则说

明检测网络正常,VIP check通过。发包的操作通过AIX 命令执行,还原所有变量后的

命令如下

― ping ?S xxx.xxx.xxx.2 ?c 1?w 1 xxx.xxx.xxx.254

― 参数含义如下:

-S hostname/IP addr

Uses the IP address as the source addressin outgoing ping packets.

-c Count

Specifies the number of echo requests, asindicated by the Count

variable, to be sent (and received).

-w timeout

This option works only with the -c option.It causes ping to wait

for a maximum of 'timeout' seconds for areply (after sending the

last packet).

― PING_TIMEOUT参数控制了-c 和-w的值,RACGVIP 脚本中设置如下:

# timeout of ping in number of loops

PING_TIMEOUT=" -c 1 -w 1"

― 我们检查了10.2.0.3版本下的设置,发现在10.2.0.3版本下,PING_TIMEOUT参数设置

为如下值:

# timeout of ping in number of loops

PING_TIMEOUT=" -c 1 -w 3"

― 当前PING_TIMEOUT的设置意味着如果在pingdefault gateway 的1秒内没有成功向

外发送出一个包,那么CRS会经过一次SLEEP后再次尝试ping操作,如果还是没有成

功,CRS即宣布网络异常,VIP OFFLINE。

结论

Oracle 10.2.0.5在RACGVIP脚本上的细微改变说明,Oracle认为10.2.0.5版本

下对网络性能及稳定性更高了。但是将PING_TIMEOUT 由1秒更改为3秒,会大

大增加CRS 的敏感度,使得细微的网络异常即会造成CRS 中的 VIP检测失败。

根据上述分析,我们认为节点二故障原因如下:

1、 升级到10.2.0.5后,CRS 对网络延时更加敏感

2、 在4月29 日凌晨3点故障期间,网络出现了及其短暂的延时导致VIP检测

失败,CRS 将VIP以及依赖于VIP的资源OFFLINE。

3、 CRS 在OFFLINE数据库服务的时候命中Bug6955040造成客户端连接被

全部杀光。

故障重现

我方在生产环境模拟了这一段异常情况:

步骤流程

1 打开CRS VIPdebug

2

节点二上找出VIP(xxx.xxx.xxx.4 )使用的网络设备(en10)

以及对应的ServiceIP(xxx.xxx.xxx.2 )

3 交换机上找出对应的端口

4 Block该端口一小段时间

5 观察CRS 和数据库日志

我方我们观察到其中 CRS 日志和数据库日志信息和故障期间完全一致,这

充分证明了前面的判断。

同时,VIP的debug 信息显示如下内容,我们可以从中清晰的看到,由于

网络问题导致发包失败后,CRS 立即将VIP置于 OFFLINE状态:

2012-05-01 20:36:22.560: [ RACG][1] [1291828][1