对于Oracle 11gR2之后的版本,集群中的所有组件统一被资源所替代(OHASD服务除外),其中最重要的两个资源分别为 CSS 和 CRS。CSS (Cluster Synchronization Service)
主要负责构建和维护集群的一致性,其资源以 ocssd.bin 守护进程的形式存在于Oracle集群中,其功能主要包含 NM (Node Management, 节点管理) 和 GM (Group Management, 组管理),通过集群内部节点间的心跳机制和组内部共享资源的共享和隔离来保证集群在运行中资源始终处于一致性的状态。
集群中的另一个重要的资源为 CRS (Cluster Ready Service, 集群就绪服务)
,主要用来管理集群中的资源,以此来实现Oracle集群的高可用性。除此之外,CRS
还负责管理 OCR (Oracle Cluster Register, 集群注册表),包括OCR的更新和备份。
OCR 是一个包含集群内部所有资源的注册表,CRSD启动时会首先读取本地节点上OCR的信息,从中获取集群内部注册的所有资源及属性。集群内部的每个节点都会有一个注册表,但通常只有集群内最先启动节点的OCR注册表进程才能执行更新OCR注册表的写入操作,其他节点的OCR注册表仅可提供读服务,不提供写服务。
CRS
的启动步骤
CRS 的启动需要依赖 CSS 的启动,也就是说,集群中必须等待 CSS 服务完全开启后,集群中的 CRS 服务才能开启。从这一点上不难看出,Oracle集群在启动时会首先启动 OHASD,然后启动 CSS,最后启动 CRS。当集群中的CRS服务就绪后,整个集群可以对外提供服务了。
而整个CRS服务的启动过程相对而言是比较简单的,启动过程大致如下
启动crsd.bin守护进程,守护进程启动后会读取OCR的信息,判断注册到OCR中的资源的属性、状态并尝试启动OCR中的资源
crsd.bin守护进程读取OCR的信息,并启动OCR中的资源
crsd.bin守护进程建立和集群其他节点crsd服务的通信
CRS 在集群资源启动成功后并不会中止服务,Oracle 需要定期对集群注册表进行更新(通常是每4个小时更新一次),另外还需要处理用户的请求。
资源管理
Oracle中提供了两种基于命令行的资源管理工具,分别为 crsctl
和 srcvtl
。通过这些工具,可以很方便的对集群资源进行启动、关闭、配置等。
通过 crsctl
查看集群资源状态 通常集群启动、停止等操作会使用crsctl来完成,对单一资源的操作会使用srvctl来完成
# crsctl status resource -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATADG.dg
ONLINE ONLINE node1
ONLINE ONLINE node2
ora.LISTENER.lsnr
ONLINE ONLINE node1
ONLINE ONLINE node2
ora.OCRVOTE.dg
ONLINE ONLINE node1
ONLINE ONLINE node2
ora.asm
ONLINE ONLINE node1 Started
ONLINE ONLINE node2 Started
ora.gsd
OFFLINE OFFLINE node1
OFFLINE OFFLINE node2
ora.net1.network
ONLINE ONLINE node1
ONLINE ONLINE node2
ora.ons
ONLINE ONLINE node1
ONLINE ONLINE node2
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE node1
ora.node1.vip
1 ONLINE ONLINE node1
ora.node2.vip
1 ONLINE ONLINE node2
ora.cvu
1 ONLINE ONLINE node1
ora.oc4j
1 ONLINE ONLINE node1
ora.rac.db
1 ONLINE ONLINE node1 Open
2 ONLINE ONLINE node2 Open
ora.scan1.vip
1 ONLINE ONLINE node1
从以上输出结果可以看到,通过 crsctl
管理的集群资源主要分为两个部分,Local Resources(本地资源)
和 Cluster Resources(集群资源)
。
11gR2中的本地资源
在Oracle 11g中,本地资源包含 ora.asm、ora.gsd、ora.network、ora.ons、ora.listener等资源。(需要注意的是,Oracle 12
.2及之后的版本中对集群本地资源和集群资源作出了调整,因此集群的资源归类稍有不同),此处仅以11gR2的集群资源属性进行说明。
- ora.asm:asm代理资源
在11g版后,OHASD服务代替CRSD守护进程对集群中ASM资源进行统一管理,CRSD只负责展示ASM实例的状态,另外,CRSD负责管理asm资源的代理进程来设置ASM实例的初始化参数--local_listener。
实际上,在11g版本的集群中,包含两个ASM资源,一个是由OHASD管理的ASM资源,一个是CRSD管理的ASM资源。OHASD管理的ASM资源负责实例节点的ASM实例管理工作,CRSD负责展示ASM实例的健康状态,同时负责将ASM实例注册到实例节点的监听服务中。
- ora.gsd:GSD(Global Service Daemon)资源
GSD资源是为了兼容9i版本的数据库资源,这个资源默认处于离线状态(官方解释)。这也是为什么上面的ora.gsd资源显示为 OFFLINE 状态的原因。仅仅当集群中存在9i版本的数据库软件时,ora.gsd资源才应处于在线状态(ONLINE),其他情况下,都应该保持OFFLINE状态。
- ora.network:network资源
本地资源中的ora.netowrk资源主要用来管理集群的公网,通常集群内部公网资源保存在GPNP Profile中,profile文件中的公网资源以 "<gpnp:Network id="net1" IP="10.xx.xx.xx" Adapter="eth0" Use="public"/>
的形式存在(通过 gpnptool get -o-
查看gpnp资源),profile配置文件中的公网资源在集群中则以 ora.net{n}.network 的形式存在。
CRSD主要通过网络资源中的网卡信息和相应的子网信息对网络资源进行管理,一个集群中通常会有多个资源依赖于集群公网资源存在(例如,VIP资源、SCAN VIP资源、监听程序等),当集群中的公网资源出现网络故障时,依赖于网络资源的其他资源也会被离线掉。
- ora.ons:ONS(Oracle Notification Service)资源
ora.ons资源主要用来管理集群中的ONS(Oracle Notification Service,状态通知服务),当服务端发生某些事件时,服务端会主动通知客户端发生了哪些对应的变化,以便于客户端能够及时了解到服务端的变化,这种状态通知的服务就是依靠ora.ons服务实现的。
对于集群中的ora.ons资源,11g之后不再需要手动进行配置,通常由代理进程(oraagent_grid)完成对配置文件的更新和写入操作。ora.ons资源配置文件存放在实例节点的 <ORACLE_HOME>/opmn/conf/ons.config
文件中。另外,可以通过 onsctl
命令行管理工具查看实例节点上的ons资源状态或进行配置。
- ora.listener:监听程序资源
在11gR2版本的集群中,主要包含两种类型的监听程序资源,分别是节点(实例)监听程序和SCAN监听程序,两种类型的监听程序资源分别对应本地资源和集群资源。
什么是监听程序?
监听程序是Oracle基于服务器端的一种网络服务,存在于数据库服务端,主要用来监听来自数据库客户端通过(SCAN) VIP或公网IP向服务端提出的连接请求,并将连接请求发送给服务端。
存在于实例节点上的ora.listener资源主要负责接收通过节点VIP或集群公网发送给数据库的连接请求。对于集群中的每个实例节点来讲,都有一个或多个活跃在实例上的VIP资源和公网资源,实例上的服务正是通过VIP或公网资源提供的。
11gR2中的集群资源
集群资源包含 ora.LISTENER_SCAN1.lsnr、ora.{node}.vip、ora.rac.db、ora.cvu、ora.oc4j等资源。
- ora.LISTENER_SCAN1.lsnr:SCAN监听程序
在一个集群中,SCAN监听程序往往和VIP资源成对出现,SCAN监听程序主要负责接收通过SCAN VIP发起的数据库的连接请求。也就是说,SCAN VIP 和 对应的SCAN监听程序需要运行在同一个实例节点上,当SCAN VIP切换到集群中的其他节点上时,SCAN监听程序也会发生相应的迁移切换。每个SCAN监听程序仅负责监听对应SCAN VIP的VIP地址,不回监听其他的IP地址。
如上集群资源,ora.scan1.vip
和 ora.LISTENER_SCAN1.lsnr
资源显示为 ONLINE ONLINE node1
,表明两个资源目前均活跃于node1节点,且两个资源位于集群中的同一实例节点上。
- ora.{node}.vip:VIP资源
集群中的每个实例节点上都会存在一个VIP资源,对应实例上的VIP网络。VIP网络的创建可以根据需要进行创建,但是VIP资源必须依赖于集群中的网络资源。因此,VIP资源通常会与实例上的公网IP进行绑定,当某个实例节点的公网资源发生故障后,实例节点上的VIP资源会漂移到集群中的其他实例节点上。
实例上的VIP资源主要负责接收通过VIP或公网IP发起的数据库连接请求。
- ora.rac.db:数据库资源
集群中的数据库资源类似于ASM磁盘组资源,每个实例节点上都会存在一个对应的ASM磁盘组资源和数据库资源,数据库资源在集群中以 ora.xx.db 的形式出现,主要负责管理集群中运行的数据库并对外提供数据库服务。
数据库资源的启动会依赖于实例节点上的ASM磁盘组资源,仅仅当实例节点上的ASM磁盘组资源成功挂载后,本地节点上的数据库资源才能进行启动。
通过CRSD管理的数据库资源,可以通过 crsctl stat res ora.rac.db -p
查看数据库资源的属性列表
# crsctl stat res ora.rac.db -p
NAME=ora.rac.db
TYPE=ora.database.type
...
DATABASE_TYPE=RAC
DB_UNIQUE_NAME=rac
...
SPFILE=+DATADG/rac/spfilerac.ora
如上展示了部分数据库资源的属性,包含数据库名称、数据库类型、启动文件路径等。
- ora.cvu:CVU(Cluster Verify Utility)资源
ora.cvu资源是Oracle 11gR2版本中用来实现集群资源健康性检查的一个服务,一个集群中只会有一个实例节点会启动该服务,通常是集群中最先启动的节点会启动ora.cvu服务,并通过运行 cluvfy
命令对集群的健康性进行检查,默认每6个小时检查一次。
通过 crsctl stat res ora.cvu -p
查看资源的属性信息
# crsctl stat res ora.cvu -p
NAME=ora.cvu
TYPE=ora.cvu.type
...
CARDINALITY=1
CHECK_INTERVAL=21600
...
如上所示,CARDINALITY 表示一个集群中可以运行cvu资源的节点数量,CHECK_INTERVAL 表示每次进行健康性检查的事件间隔,单位为s
- ora.oc4j:oc4j(Oracle Container for JavaEE)
11.2版本的集群中出现的一个组件,主要功能为提供给Oracle数据库高可靠、高性能的服务。在12.2之后版本的集群中,该组件似乎被取消了。
最后
Oracle的集群中提供了很多资源和组件,了解每个组件的功能是有必要的,尽管很多情况下我们并不会使用到这个资源。对于一些集群中的至关重要的资源,例如,网络资源(监听资源)、ASM磁盘组资源、数据库资源等这些资源的掌握是必须的,因为通常数据库或集群发生故障,问题就出现在这些资源上。了解和掌握这些资源对于排查数据库集群的故障往往有很大帮助。