love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

10g rac如何通过votedisk来判断disk心跳?(2)

本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

本文链接地址: 10g rac如何通过votedisk来判断disk心跳?(2)

前不久写了一篇关于votedisk 心跳的文章,后面稍有疑问,那就是votedisk是在什么情况才会被写入的?
从前面的研究我们可以看到,正常情况下,ocssd进程是不会写votedisk的,仅仅是读,通过每秒读1次来
判断disk 心跳是否正常。 这里我来模拟rac 脑裂的情况,通过手工断开rac2节点的心跳网卡,在断开之前
同事跟踪rac1,和rac2节点的ocssd进程,trace 信息如下:

从上面可以看到,在脑裂发生时,会将512 bytes的信息写入到votedisk中,然后其他节点在读取votedisk时就能够知道
该node的状态等信息,进而发出node 驱逐的命令。

通过fd下面的信息,可以可以确认fd 11/12都是votedisk,如下:

然后,事实上,在脑裂发生的时刻,不仅仅是故障节点会讲node信息写入到votedisk中,其实其他节点也会写入信息,如下
是rac2节点出现脑裂时,rac1节点 ocssd进程写votedisk的一个时间段:

统计前面的时间,去掉头尾的数据,你可以发现基本上恰恰是1s。

下面再来看一段rac1节点ocssd进程读写votedisk的信息:

下面来重点描述前面开头的2行信息:

很清晰,从上面的信息可以看出,rac1节点读和写 votedisk的大小都是512 byte,起写的offset 是8704,读的offset是9216.

注意,这个9216的offset信息,其实正是rac2节点写入的信息,换句话讲,也是通过这个来判断整个cluster中哪些node是可以用的,
然后回发出通知进行node驱逐。最后当节点reboot重启后,在ocssd能检测到votedisk后,会重写kill block,你会在ocssd.log中
看到类似如下的信息;

最后,通过分析trace,还发现了其中lseek函数,该函数的解释如下:
position = lseek(handle, offset, direction) ;

各参数定义如下:
u handle:这是一个已经打开的文件句柄,表示所要存取的文件。
u offset:这类似与阵列的索引值。
u direction:direction的值有以下3种情况:
n 0 - 表示从文件起始位置开始移动offset数量
n 1 - 表示从目前文件指针位置移动offset数量
n 2 - 表示从文件末端位置移动offset数量

这里是fd 7,14其实都是跟crs相关的东西, 准确的说是css相关的文件。这里其实也就可以解释一个问题,occsd进程在读写votedisk时,
是如何能够一下就定位到具体的offset呢? 不可能是扫描整个votedisk,知道找到信息为止。 比如rac1节点写的为止是offset 8704.
难道要从votedisk头部从0开始扫描? 通过上面的信息,我们可以发现,显示不是的。

我们可以看到是通过lseek函数来进行移动offset,进行访问,每次启动单位都是512的整数倍。你可以发现rac1写的8704,rac2写的
9126其实都是512的整数倍。 看下面的一段信息你可以发现,在进行pread64/pwrite64到具体的offset位置之前,都会出现lseek函数:

最后可以来个简单性的总结:

1. 正常情况下,ocssd进程仅仅是读取votedisk,读取的大小是512byte,被称为kill block。
2. 在出现脑裂的情况下,每个节点的occsd进程都会将自己节点的信息写入到votedisk中,即写入到kill block中。
3. ocssd进程在读写kill block时,之所以能准确的定位到offset,其实是通过lseek函数来实现的,crs node的信息应该还
存在在如下两个文件中,lseek函数就是通过扫描这2个文件来定位到具体的offset位置:
/home/oracle/app/oracle/product/10.2.0/crs/css/mesg/clssus.msb
/home/oracle/app/oracle/product/10.2.0/crs/has/mesg/clsdus.msb

4. 另外,通过跟踪发现,不仅仅是出现脑裂的情况,正常的crsctl stop crs的情况下,occsd进程也会将node信息写入到votedisk中。

2 Responses to “10g rac如何通过votedisk来判断disk心跳?(2)”

  1. Wisdomone1 Says:

    roger牛牛帅帅啊

  2. 寂寞流年的浅思 Says:

    秋夜,静怡,一盏街灯,寒月清浅 一纸情思,舞醉成诗,藏在我眼里的迷眸 安静的角落,轻触着关于你的回忆 千里之外,抵挡着薄凉 我用文字,铭记着朦胧的感伤 冷街,点点寒星,安安静静的夜,我

Leave a Reply

You must be logged in to post a comment.