暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

浅谈Oracle RAC(4)– OHAS组件

1250

编者按:

本文作者系肖遥(花名),现任甲骨文技术支持工程师 ,目前专注于Oracle RAC领域。个人主页:

https://blog.csdn.net/weixin_50510978,经其本人授权发布。

【免责声明】本公众号文章仅代表个人观点,与任何公司无关。

懒惰了一周没有更新博客。这两天天气不好,索性利用今天下午的时间继续写一篇关于OHAS组件的介绍。

之前我们多次提到了OHAS组件是GI的根守护进程。这个组件是在GI 11.2版本中引入的。随着这个组件的引入,集群的启动方式和资源管理方式发生了根本的改变。

我们先来看一下OHASD启动了哪些进程。

从上图中,我们可以看到OLR(Oracle Local Registry)。从英文全称可以知道,这是一个注册表信息。是为OHASD提供集群配置信息和初始化资源的定义信息。OLR 存在于本地磁盘上,我们可以通过 etc/oracle/olr.loc 文件获得 OLR 文件的位置信息。OLR文件是个二进制文件不可读。我们可以通过以下命令来生成一个OLR的转储文件,该文件是可读的。

    [root@node1 ~]# ocrdump -local
    复制

    从转储文件的内容我们可以知道OLR文件配置了诸如GI home,集群版本,HAIP等信息。

    在这里我想介绍一下我比较感兴趣的部分就是集群版本信息的内容。我们先来查看一下OLR关于版本信息的记录。

      [SYSTEM.version.localhost.patchlevel]
      UB4 (10) : 724960844
      SECURITY : {USER_PERMISSION : PROCR_ALL_ACCESS, GROUP_PERMISSION : PROCR_READ, OTHER_PERMISSION : PROCR_READ, USER_NAME : root, GROUP_NAME : root}
      ...
      [SYSTEM.version.activeversion]
      ORATEXT : 19.0.0.0.0
      SECURITY : {USER_PERMISSION : PROCR_ALL_ACCESS, GROUP_PERMISSION : PROCR_READ, OTHER_PERMISSION : PROCR_READ, USER_NAME : root, GROUP_NAME : root}
      复制

      从上面的内容我们可以看到patchlevel的信息和activeversion的信息。

      我们知道在解决节点间patch不一致的问题的时候经常会用到以下命令。

        kfod op=patchlvl
        crsctl query crs releasepatch
        crsctl query crs softwarepatch
        crsctl query crs activeversion
        复制

        我们在我的测试环境中来分别执行以上命令。

          [root@node1 ~]# kfod op=patchlvl
          -------------------
          Current Patch level
          ===================
          724960844


          [root@node1 ~]# crsctl query crs releasepatch
          Oracle Clusterware release patch level is [724960844] and the complete list of patches [29401763 29517242 29517247 29585399 ] have been applied on the local node. The release patch string is [19.3.0.0.0].


          [root@node1 ~]# crsctl query crs softwarepatch
          Oracle Clusterware patch level on node node1 is [724960844].


          [root@node1 ~]# crsctl query crs activeversion
          Oracle Clusterware active version on the cluster is [19.0.0.0.0]
          复制

          当打补丁的时候,首先需要将补丁信息更新到OLR中,在所有节点完成补丁安装后会在最后一个节点将补丁信息更新到OCR中。只有当各个节点的OLR中的补丁版本信息与和OCR中的一致的时候,补丁安装才算成功,集群才会正常启动。一旦出现patchlevel不一致的情况,就需要通过以上命令收集补丁信息,如果能够通过rollback补丁修复的则需要rollback掉所有节点的问题补丁。有一些极端情况可能无法修复时,需要重新安装GI软件。

          关于OLR的备份和恢复的方法,我们这里只给出命令。

            ocrconfig -local -manualbackup
            ocrconfig -local -restore<OLR备份文件>
            复制

            我们从上图可以看到,OHASD分别启动了3个代理进程和1个cssdmonitor资源。

            从cssdagent这个代理进程的名字,我们就能猜测到这个代理进程是用来管理CSS组件的进程。而cssdmonitor这个资源的作用也正如其名字所表示的那样,它是用来监控CSS组件的。我们在以后介绍脑裂的部分会进一步说明cssdagent和cssdmonitor的作用,这里不做展开讨论。

            接下来我们来看一下orarootagent管理的资源有哪些。

            这里面的osysmond和ologgerd进程实际上是ora.crf资源的进程。osysmond收集OS的资源信息,ologgerd则是负责将osysmond收集到的信息写入GIMR中。从12.1开始引入了MGMTDB这个资源,GIMR数据文件则被存储在了MGMTDB中。在解决集群问题时,必不可少的是要收集OS的资源使用信息,所以甲骨文推荐安装使用OSwatcher工具。但有些环境确实没有安装任何监控OS资源信息的工具,这时候我们可以借助ora.crf收集到的信息调查故障。但是这里需要说明的是,ora.crf收集的信息只是对OSwatcher工具的一个补充,其涵盖的信息无法取代OSwatcher收集的信息。比如我们在调查是否是CPU问题导致集群夯的问题时,只是查看ora.crf收集到的信息有时是不够的。因为OS调度CPU时也是存在bug的。比如 vmstat 的 r列 显示了很高的数值,代表排队等待执行的进程数很多,但是 mpstat 却显示很多CPU处于闲置状态,这说明OS并没有正确调度CPU去处理这些待执行的进程。类似这种信息是无法从ora.crf中确认到的。所以甲骨文依然推荐安装使用OSwatcher。

            orarootagent还管理CRS组件,这部分内容我们会找个专题去介绍CRSD,这里不做展开。

            从上图中我们可以看到diskmon和ACFS Drivers的内容。diskmon是与Exadata相关的资源,我们这里不做研究。ACFS Drivers则是与Storage相关的内容,我们以后会专题介绍。

            这里面还有一个CTSS(Cluster Time Synchronize Service)组件。它是负责同步集群节点时间的组件。GI管理的集群作为一个整体对外服务,需要集群内的各个计算机的时间是同步的。因为集群各节点时间无法同步时,可能出现数据库实例可能发生hang或者crash的现象。

            在11.2版本之前,GI是没有自己的时间同步的机制的,那时候甲骨文一直依赖OS的NTP等机制。到了11.2之后,甲骨文开发了自己的时间同步机制CTSS。CTSS兼容了NTP等第三方软件,其工作原理如下:

            1.集群会选择一个节点作为CTSS的参考点。其它节点参考这个节点的时间进行同步。
            2.CTSS在运行时会查看节点中是否有第三方的时间同步机制。如果发现NTP等存在,CTSS则自动变成Observer模式。在这种模式下,CTSS不会修改系统时间。而如果在节点中没有监测到第三方时间同步机制的时候,CTSS会变成Active模式。
            3.在所有节点中,CTSS的模式必须一致。
            4.CTSS在验证NTP时不只是验证NTP是否运行,也会验证NTP的配置文件是否存在。所以如果选择使用CTSS时,请将NTP配置文件也一并清除。

              [root@node1 ~]# crsctl stat res ora.ctssd -t -init
              --------------------------------------------------------------------------------
              Name Target State Server State details
              --------------------------------------------------------------------------------
              Cluster Resources
              --------------------------------------------------------------------------------
              ora.ctssd
              1 ONLINE ONLINE node1 OBSERVER,STABLE
              --------------------------------------------------------------------------------
              复制

              另外上图中并没有标记出来,其实orarootagent还会启动一个非常重要的资源就是HAIP。HAIP提供了私网的高可用和负载均衡。主要负责节点间数据库实例的数据传输,也就是我们所熟知的内存融合。关于HAIP的内容会在以后的私网通信的部分详细说明。

              接下来我们来看oraagent管理的资源。

              gipcd的内容会结合HAIP的内容在以后的博客中比对说明,请各位持续关注。ASM的内容则是集群极为重要的一大块内容,会专门找时间分多个主题介绍。

              接下来我们主要介绍一下关于gpnp(Grid Plug And Play)组件的内容。

              gpnp存在的主要目的是为了将集群的一些基本配置信息保存至本地,从而减轻对OCR的功能依赖。

              gpnp主要有两个部分构成,分别是gpnp wallet 和gpnp profile。他们分别保存在以下路径下。

                {GI_HOME}/gpnp/wallets/peer/cwallet.sso
                {GI_HOME}/gpnp/profiles/peer/profile.xml
                复制

                GPNP的profile文件中配置了以下主要信息:

                1.ClusterUid和ClusterName
                2.网络配置信息
                3.ASM实例的spfile的路径。

                关于GPNP的profile信息,我们可以通过以下命令获得。

                  [root@node1 ~]# gpnptool get -o- | xmllint --format -

                  Success.
                  <?xml version="1.0" encoding="UTF-8"?>
                  <gpnp:GPnP-Profile xmlns="http://www.grid-pnp.org/2005/11/gpnp-profile" xmlns:gpnp="http://www.grid-pnp.org/2005/11/gpnp-profie" xmlns:orcl="http://www.oracle.com/gpnp/2005/11/gpnp-profile" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version=1.0" xsi:schemaLocation="http://www.grid-pnp.org/2005/11/gpnp-profile gpnp-profile.xsd" ProfileSequence="5" ClusterUId="f99ec5bb231ff76ffde27244f2ba4dd" ClusterName="node-cluster" PALocation="">
                  <gpnp:Network-Profile>
                  <gpnp:HostNetwork id="gen" HostName="*">
                  <gpnp:Network id="net1" IP="10.10.3.0" Adapter="enp0s8" Use="public"/>
                  <gpnp:Network id="net2" IP="192.168.3.0" Adapter="enp0s9" Use="asm,cluster_interconnect"/>
                  </gpnp:HostNetwork>
                  </gpnp:Network-Profile>
                  <orcl:CSS-Profile id="css" DiscoveryString="+asm" LeaseDuration="400"/>
                  <orcl:ASM-Profile id="asm" DiscoveryString="/u02/storage/*" SPFile="+DATA/node-cluster/ASMPARAMETERFILE/registry.253.101087503" Mode="remote" Extended="false"/>
                  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                  <ds:SignedInfo>
                  <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                  <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
                  <ds:Reference URI="">
                  <ds:Transforms>
                  <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                  <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                  <InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="gpnp orcl xsi"/>
                  </ds:Transform>
                  </ds:Transforms>
                  <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                  <ds:DigestValue>oVBrQvB4b2NuXOY6pBfE+zeLfTk=</ds:DigestValue>
                  </ds:Reference>
                  </ds:SignedInfo>
                  <ds:SignatureValue>bFF73cqarX+fmHFWeeC5oSXy6m01+m7LuOWj4TO+69fPkVaDu9BblcMoUbb2Mkhhv5iOIjZwaD7Eb9DN3WZajO1NoPq/BYqZJGpw9JPEifQSlEBtOLbPupYAidt4EPecv6jSaXkl2hhNCsMvZ6aWInrSQOp1lWGu1hEu7wYjHE=</ds:SignatureValue>
                  </ds:Signature>
                  </gpnp:GPnP-Profile>
                  复制

                  通过上面的信息我们知道,我的测试环境的ClusterName是"node-cluster"。公网网卡是enp0s8,而私网网卡则是enp0s9。而ASM实例的spfile则保存在+DATA磁盘组上。

                  gpnp的主线程会扫描profile文件,并将内容加载到内存中。

                  gpnp会向所有节点发送信息,并确认最新版本,并将拥有最新版本的配置信息发送到各个节点。

                  关于GI的内容实在太杂太多了,不管谈到哪里都可以继续向下引申很多内容。我时刻告诉自己要适可而止,初衷只是归纳基础知识。接下来打算写一篇关于OCSSD的内容,期待各位继续支持。

                  后续文章更加精彩,欢迎关注本公众号或访问【阅读原文】。


                  ——End——

                  专注于技术不限于技术!

                  用碎片化的时间,一点一滴地提高数据库技术和个人能力。

                  欢迎关注!


                  数据库基础系列(从基础了解数据库):

                  数据库性能问题分析和诊断方法概论

                  一图了解Oracle数据库简史

                  数据库的“黑匣子”--故障诊断日志基础

                  通过寄存服务来“理解”Oracle数据库基本体系结构和动作流程

                  Oracle优化器架构变化和特定行为

                  2020年总结


                  浅谈RAC系列:

                  浅谈Oracle RAC (1)--概要

                  浅谈Oracle RAC (2)--集群管理软件GI基本架构

                  浅谈Oracle RAC(3)--GI的启动

                  文章转载自Oracle数据库技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论