作者简介
石云华,Exadata中国用户组联合创始人,ORACLE ACE。毕业后一直从事Oracle数据库第三方运维服务工作,拥有十余年电信运营商、保险、税务、电力行业核心系统数据库运维经验。现就职于北京海天起点技术服务股份有限公司,oracle数据库专家组成员,Exadata部门负责人。个人著作有《Exadata实施运维指南》,《Oracle Exadata性能优化》
案例概要:
最近一个准备上线的数据库项目,客户要求上面运行的OGG实现高可用。我们给出的方案是:底层用ACFS实现共享存储,上层手动地向GI集群添加资源实现高可用,或者上层使用XAG工具,用XAG工具自动完成高可用配置工作。
最终,现场的同事选择用XAG工具完成高可用配置后,进行OGG高可用切换测试时,发现OGG所在的目录无法访问,同时出现乱码的现象。
案例分析:
(1)、让现场的同事将整个故障的现象描述一下,同事整理出来的故障过程如下所示。
这是一个6节点的RAC环境,OGG当前在节点2上运行,期间执行DML操作,OGG都能够正常同步数据,为了模拟高可用性测试,将节点2直接reboot,此时出现的故障现象如下:OGG的管理进程mgr可以正常切换到节点1,也可以正常启动,但是使用info all命令查看进程状态时,此时只能够看到mgr进程的信息,而无法看到抽取进程extya信息。 
同时,查看OGG软件所在的目录,发现dirrpt 和 dirchk 目录存在乱码现象: 
|
(2)、让现场的同事将相关的配置过程给我,我检查了整个高可用的实现过程,中间所涉及的步骤是没有问题的。
先配置了共享ACFS,所有节点都挂载这个文件系统,并注册成集群中的资源,随着GI集群一起启动。
然后利用XAG工具向GI集群中添加了资源,并且可以实现高可用切换工作。
此时,我认为这个故障与XAG应该是无没有关系的,因为XAG工具只是负责集群资源的管理工作,而现在的问题是目录不可访问,同时出现了IO错误。
(3)、搜索MOS文档库,找到如下这篇文章。
AfterOS kernel patching to 3.10.0-957 (RedHat) kernel files are not listing on acfsdirectory (Doc ID 2561145.1)
从这篇文章可以看出,RedHat 3.10.0-957内核版本中包含的补丁更改了ACFS驱动程序使用d_splice_alias接口的预期行为。如果ACFS目录已经存在Dentry,则d_splice_alias接口将返回IO错误。
解决办法是:安装数据库补丁(29963428),或者将Redhat的内核降低到3.10.0-862及以下版本。
(4)、此时,现场的同事反馈,进一步检查发现,当OGG在切换之前就已经出现乱码问题。也即当OGG在节点1上运行时,节点1上的ACFS目录一切正常,OGG也能正常工作,但此时去访问节点2上的OGG所在的ACFS目录,就会出现上述的IO错误和乱码问题。
检查当前环境的操作系统内核:

当前的操作系统内核正好高于3.10.0-862,这些发现也说明了这个故障与XAG工具或者OGG无关。应该就是ACFS自身的问题。
案例解决:
这个问题,官方给出的解决方案是,要么降低操作系统内核,要么打数据库补丁。
但是业务系统在当前这个版本环境下做了大量的测试工作,并且业务系统马上就要上线,如果这时降级操作系统内核,或者安装数据库补丁,前面做的所有测试工作都可能需要全部重头开始,整个业务系统的上线进度就需要全部延后,对于客户而言都是无法接受的,这就需要想想还有没有其他办法。
其实,搭建ACFS也只是为了实现OGG的高可用而已,这个ACFS目录不可访问的问题也仅仅在所有计算节点共享挂载这个ACFS时才会存在。那么,我们可以换一个思路,ACFS文件系统不注册到集群,也即不允许自动挂载,而这个挂载ACFS文件系统的动作由OGG资源切换时完成。也即OGG进行高可用切换时,先停止当前节点的OGG进程,然后卸载当前节点的ACFS文件系统,接着在切换后的节点上挂载ACFS文件系统,最后再启动OGG进程。这样,ACFS文件系统就只会在OGG运行的那个节点上挂载,同样,也就不会出现乱码和IO不可访问的问题了。
这个环境当前使用的XAG工具来实现高可用切换,XAG工具实现上也是需要向GI集群中添加资源,只是所有工作都被XAG工具进行了封装,部署过程变得简单了许多,要实现XAG来挂载ACFS文件系统,就需要修改这个OGG资源所对应的ACTION_SCRIPT脚本,但发现这个脚本是用Perl写的,由于对Perl不熟,所以只能放弃使用XAG工具来管理OGG高可用。
最终使用原始的手动向GI集群添加资源的方式来实现OGG高可用性,OGG资源所对应的ACTION_SCRIPT脚本改用bash,可以从MOS网站下载这个bash脚本,但必须对这个bash脚本进行改造,也即需要添加挂载和卸载文件系统的功能,部分代码如下所示。
fun_mount () { sudo mount -t acfs dev/asm/acfsrzogg-466 /rzogg } fun_umount () { cd / sudo fuser -kc /rzogg sudo umount /rzogg } |
在脚本中的'start')部分,先调用fun_mount,在脚本中的'stop')和'clean')和'abort')部分,最后调用fun_umount。同时,记得为用户配置sudo权限。
脚本改造完成后,再次手动测试OGG高可用,一切正常,每次切换时,只会在一个节点上挂载ACFS文件,也就没有乱码问题。