编者按:
本文作者系肖遥(花名),原甲骨文技术支持工程师 ,专注于Oracle RAC领域。个人主页:
https://blog.csdn.net/weixin_50510978,经其本人授权发布。
【免责声明】本号文章仅代表个人观点,与任何公司无关。
编辑|SQL和数据库技术(ID:SQLplusDB)
浅谈RAC系列:
浅谈Oracle RAC (1)--概要
浅谈Oracle RAC (2)--集群管理软件GI基本架构
浅谈Oracle RAC(3)--GI的启动
浅谈Oracle RAC(4)– OHAS组件
浅谈Oracle RAC(5)– CSS组件
浅谈Oracle RAC(6) 之实战:节点reboot问题的调查方法
浅谈Oracle RAC(7) -CRS组件
今天我们来专门聊聊OCR和投票盘的一些知识点。
1.OCR功能
OCR是Oracle Cluster Register的缩写。OCR相当于集群软件GI的一个注册表,里面存储了关于集群的各种配置信息。CRSD通过访问OCR来获得集群资源的列表和属性信息,以及私网公网等各种配置信息等。
2.OLR功能
OCR是集群运行过程中为各个节点提供共同的注册表功能的组件,但是在集群启动前所需要的配置信息从何处而来呢?其实GI软件中还有一个OCR的变种叫做OLR。
OLR是Oracle Local Registry的缩写。OLR是OCR的一个补充,只存储与本地节点有关的信息。OLR不与集群中的其它节点共享。OLR存储了集群启动初期ohasd使用的重要环境,如Oracle集群件的版本、配置等。如果OLR丢失或损坏,那么将会导致ohasd进程启动失败。所以,OLR的主要作用就是为ohasd守护进程提供集群的配置信息和初始化资源的定义信息。
3.OCR的位置
我们可以通过下面的文件确定OCR的位置。
代码语言:javascript复制[root@node1 ~]#cat /etc/oracle/ocr.loc
ocrconfig_loc= ASM_DG
local_only=FALSE
此外我们可以通过下面的命令确定OCR的位置。
代码语言:javascript复制[root@node1 ~]# ocrcheck
Status of Oracle Cluster Registry is as follows :
Version : 3
Total space (kbytes) : 262120
Used space (kbytes) : 2832
Available space (kbytes) : 259288
ID : 1045188516
Device/File Name : ASM_DG
Device/File integrity check succeeded
Device/File not configured
Device/File not configured
Device/File not configured
Device/File not configured
Cluster registry integrity check succeeded
Logical corruption check succeeded
ocrcheck命令可以完成对OCR进行逻辑一致性检查。
3.OCR Cache Master
我们说CRSD通过参照OCR存储的信息进行集群各程序管理。但是这里面需要明确的一点是,并不是各节点的CRSD直接与共享存储上的OCR直接发生IO获取信息,而是通过集群中的某个特定的节点中的OCR Cache Master进行IO的。其它节点中的OCR Local Cache则是从OCR Cache Master中获得信息。其逻辑示意图如下:
OCR Cache Master节点是crsd.bin进程最早启动的节点。
4.OCR包含的信息
如果需要查看OCR中的信息,我们可以使用ocrdump命令。
从ocrdump出来的信息,我们可以看到OCR中主要包括以下信息:
1.CSS的定义信息。如集群名,私网公网信息,投票盘信息,脑裂相关信息,版本信息等。
2.CRSD和EVM的配置信息。
3.OCR的备份信息。
5.OCR中资源信息的插入与删除
我们在配置集群时或者向集群添加或者删除某个应用程序时,经常用到的命令是:
代码语言:javascript复制$srvctl remove <RESOURCE_TYPE> <options>
$srvctl add <RESOURCE_TYPE> <options>
这个命令并不是实际的添加或者删除应用程序相关的文件,而是只是将相关程序的信息添加到OCR或者从OCR中删除,而程序本身并不会从OS中消除。
比如我们在安装完一个数据库后,要将这个数据库追加到集群中,由集群进行管理,我们就可以用下面的命令进行操作:
代码语言:javascript复制$srvctl add database -db crm -oraclehome /u01/oracle/product/12c/mydb
通过以上命令,我们就可以将 DB home为/u01/oracle/product/12c/mydb,DB Name为CRM的数据库添加到OCR中了。
6.OCR的备份与恢复
OCR里面包含的信息对于集群来讲至关重要。
比如我们在用非Rolling patch mode给集群打补丁时,经常会遇到patch level不一致而导致节点无法加入集群的问题。其根本原因是由于节点上的software patch level与OCR里面记录的active patch level不一致导致的。要想解决这个问题,我们期待能够将OCR恢复到打补丁之前的状态,使得OCR中的active patch level与OLR中的active patch level一致,使得集群能够顺利重启。
OCR既然是集群的注册表,那么OCR对于RAC来说则是非常重要的。所以甲骨文为OCR提供了备份和恢复机制。
OCR的备份分为自动备份和手动备份两种方式。
OCR的自动备份则是由OCR Cache Master节点上的CRSD进行的。CRSD进程每4小时备份一次OCR,并且将备份保留一个星期。
我们可以通过以下命令来查看OCR的备份信息。
代码语言:javascript复制#ocrconfig -showbackup
手动备份OCR的命令则是:
代码语言:javascript复制#ocrconfig -manualbackup irectory_name (备份到指定目的地)
OCR的恢复命令则是:
代码语言:javascript复制#ocrconfig -restore <path/filename of OCR backup>
另外可以用以下命令移动OCR的位置:
代码语言:javascript复制# ocrconfig -replace <current filename> -replacement <new filename>
7.投票盘
投票盘与OCR是完全两个不同的组件,但是为什么要放在一起来谈呢,主要是因为投票盘是随着OCR备份而备份的。所以我们在谈投票盘和OCR的运维时都是放到一起来谈。
投票盘的主要目的就是当集群发生脑裂时帮助定制脑裂的解决方案。
提到脑裂,我们这里还是有必要再次明确一下脑裂的概念:脑裂是指集群节点间失去网络心跳但是没有失去磁盘心跳的状态。
我们在之前的CSSD博文中讲过磁盘心跳的概念。这里面的磁盘心条就是各节点的CSSD组件每秒向所有投票盘写入本节点的磁盘心跳信息,同时将自己能联系到的集群其它节点信息也写入到投票盘。当发生脑裂时会根据投票盘的信息决定集群会分裂成几个子集群。
8.投票盘设定规则
Oracle规定,当 某节点与过半数([投票盘数/2] 1) 的投票盘无法发生磁盘心跳时,该节点会被踢出集群。为了不造成浪费和产生多余的IO,配置奇数个投票盘更好一些。
指定这样的规则主要目的是为了确保出现需要通过投票盘的信息进行表决时至少有一块投票盘被所有节点访问。
比如,2节点3投票盘的情况下,如果没有【过半数的投票盘无法发生磁盘心跳时,该节点会被踢出集群】的机制,则会发生如下状况:
当节点1和2之间失去网络心跳时,需要投票盘来进行表决。但是节点1只能与投票盘2进行磁盘心跳,而节点2只能与投票盘1和3进行磁盘心跳。此时投票盘2和投票盘1与3的信息不一致,是无法进行投票的。所以甲骨文在设计投票盘机制时,加入了磁盘心跳的规则:当 某节点与过半数([投票盘数/2] 1) 的投票盘无法发生磁盘心跳时,该节点会被踢出集群。
那么上面的例子中节点1无法与3块投票盘中的2块进行磁盘心跳,节点1会被踢出集群。
9.如何判定失去磁盘心跳
判定失去磁盘心跳则是由两个timeout值决定。
分别是正常运行情况下的diskLongTimeout和集群reconfig时的diskShortTimeout。
以上两个值的计算公式分别是:
代码语言:javascript复制diskLongTimeout=disktimeout
diskShortTimeout = misscount - reboottime
disktimeout,misscount,reboottime的值都可以通过以下命令获得:
代码语言:javascript复制#crsctl get css disktimeout|misscount|reboottime
通过以下命令可以更改这些值:
代码语言:javascript复制# crsctl set css disktimeout|misscount|reboottime <value>
※但是这些值在没有特殊问题情况下不要轻易更改。
10.投票盘位置确认
我们可以通过以下命令查看投票盘所在的位置。
代码语言:javascript复制[grid@vmac2 ~]$ crsctl query css votedisk
## STATE File Universal Id File Name Disk group
-- ----- ----------------- --------- ---------
1. ONLINE 5a1fdcad0da24f6ebfb7593ca4e1a2cd (/dev/asm-diskb) [ASM_DG]
2. ONLINE 95555420cbcd4fdbbfea97da131a9832 (/dev/asm-diskc) [ASM_DG]
3. ONLINE 6c3a0a7ef9414fb6bfba790530065b2b (/dev/asm-diskd) [ASM_DG]
11.投票盘删除,添加,移动
投票盘删除命令:
代码语言:javascript复制# crsctl delete css votedisk <VOTEDISK_LOCATION>
投票盘添加命令:
代码语言:javascript复制# crsctl delete css votedisk <VOTEDISK_LOCATION>
投票盘移动命令:
代码语言:javascript复制# crsctl add css votedisk <NEW_LOCATION>
# crsctl delete css votedisk <OLD_LOCATION>
11.投票盘和OCR所在磁盘组所需最小空间估算方法
ASM磁盘组需要进行冗长设定,所以投票盘和OCR所在磁盘组所需要的最小空间与冗长性设定有关。关于ASM相关的知识,我们在以后的ASM部分会详细介绍。
External Redundancy
代码语言:javascript复制1 OCR (1 x 400 MB ) = 0.4 GB
1 voting files ( 1 X 300 MB ) = 0.3 GB
Normal Redundancy
代码语言:javascript复制 2 OCRs (2 x 400 MB) = 0.8 GB
3 voting files (3 x 300 MB) = 0.9 GB
High Redundancy
代码语言:javascript复制3 OCRs (3 x 400 MB) = 1.2 GB
5 voting files (5 x 300 MB) = 1.5 GB
关于OCR和投票盘的基本知识掌握到这种程度其实已经非常够用了。