笔者并非测试人员,未实际搭建环境验证过,关于RAC的心跳机制的学习参考了以下内容,若有笔误可指正:
https://www.iteye.com/blog/czmmiao-1577531
http://www.wendangku.net/doc/9d8f7acfda38376baf1faef6-3.html
https://www.cnblogs.com/wenllsz/archive/2012/11/11/2765257.html
http://t.askmaclean.com/thread-3510-1-1.html
腾讯视频:ORACLE RAC系列详解(主要参考此)
另外,笔者一直在找Oracle所出的关于RAC介绍的原版资料,期待分享
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.Oracle RAC
RAC(Real Application Clusters) 是Oracle研发的一种数据库的集群技术。
(1)负载均衡:RAC所有节点均能提供服务,利用活动IP的方式,客户端不会感知到后端节点的变化。
(2)高性能:RAC所有节点能并发提供服务,是一种全活集群,总体上提供了相较于单节点的N倍性能。
(3)高可用
RAC是高可用的集群,当某节点故障无法工作时,集群同步服务会将其驱逐并重启。由于所有节点采用share everything的工作方式,能够有效保障数据的一致性。share everything工作方式主要通过内存融合(Cache Fusion)和共享磁盘的方式实现。
1)内存融合:所有节点实现内存级别的数据一致性。
2)共享磁盘:共享磁盘需被所有节点访问,VD(Voting Disk)也是一种共享磁盘。此处的磁盘是RAC眼中的裸卷,它可以是外部存储提供的LUN也可以是服务器的本地硬盘,RAC通过ASM对这些裸卷进行管理和数据保护策略设置。
(4)高扩展
RAC具备高扩展能力,用户可实现按需扩展集群增加总体性能和容量。
2.Oracle RAC心跳机制
RAC心跳分为3类,分别是网络心跳、磁盘心跳和本地心跳:
(1)网络心跳:所有节点每秒向其他所有节点发送信息确认对方是否“存活”。例如,在11.2版本以后,若某节点1超过30S未接受到某节点2的网络心跳应答,则节点1认为节点2“死亡”,节点1会发起对节点2的驱逐。
(2)磁盘心跳:所有节点每秒与所有的VD通信,读取VD的kill block信息判断自己是否需要重启,写入自己通过网络心跳了解到的集群信息到VD的OCR信息中。RAC 不允许任何节点与超过一半数目的VD失去访问:
1)若节点的网络心跳正常,RAC允许的VD超时时间为200S(LDTO)。若超过200S以后,节点不能访问的VD数目超过了总VD数目的一半,则节点需要被驱逐和重启。
2)若节点的网络心跳失败,RAC要求在27S(SDTO)内完成集群的重配置。
3)RAC对于VD也有相应的配置策略,要求配置N/2+1个VD,建议配置成奇数个。若某个VD长期不能被访问,RAC会将其踢出,使用冗余的VD。
(4)本地心跳:所有节点需要对自己进行监控,若判断自己无法正常工作将进行自我重启,并在重启前通知主控节点,将此集群变更信息广播出去。重启后,若节点判断自己能正常工作,则再向主控节点发送加入集群的请求。(集群任何时候都有一个节点担任主控节点)
3.Oracle RAC集群重配置(Reconfiguration)
当RAC集群的网络心跳断裂时,有可能会出现脑裂的情况。假设集群有5个RAC节点,举例说明重新配置的逻辑:
(1)主控节点向所有节点发出reconfiguration信号,所有节点向主控节点发送他们认为的集群的成员关系。
(2)主控节点进行脑裂检查,若没有产生脑裂,则直接驱逐和重启相应的节点。
1)若产生了脑裂,如下表,5个节点均“活着”,但他们互相之间的网络心跳有问题。经过检查,主控节点发现这5个节点分裂成了两个子群,节点1和2属于第1个子群,节点2、3和4属于第2个子群。此时,RAC优先选择含节点数目多的子群,即选择子群2(节点3、4、5)。
|
节点1 |
节点2 |
节点3 |
节点4 |
节点5 |
节点1 |
\ |
1 |
0 |
0 |
0 |
节点2 |
1 |
\ |
0 |
0 |
0 |
节点3 |
0 |
1 |
\ |
1 |
1 |
节点4 |
0 |
0 |
1 |
\ |
1 |
节点5 |
0 |
0 |
1 |
1 |
\ |
若5个节点分为3个子群,即子群1(节点1),子群2(节点2、3),子群3(节点4、5),RAC会在子群2与子群3中选择拥有最小节点号的子群,即子群2。
(3)随后进行节点驱逐,若节点能直接接受驱逐信息,则直接发送。若不能直接接受驱逐信息,则将驱逐信息写入kill block中。被驱逐节点从VD读取到了这个“有毒”的信息后,将进行自我重启。
(4)最后,更新集群成员的关系信息,完成集群重配置。
4.Oracle RAC与存储双活
RAC的ASM组件负责裸卷的管理,ASM有三种镜像策略,分别是External(依赖外部存储的保护机制,不做镜像)、Normal(两重镜像)、High(三重镜像)。如果ASM组的策略设置成了Normal或者High,则要求在120S(PST)内能访问相应的卷(12c版本前PST是15S,此后改为了120S),若超时则会导致系统重启。
当某个卷对应的硬盘或LUN无法在120S内正常访问时,就会导致集群的重启。若能够提供外部的存储的保护机制,则会减轻RAC集群的压力。双活就是这种方式。双活是卷之间的数据保护,在存储层对挂载给RAC的卷做双活,可有效减轻RAC主机的压力。
业界双活卷的实际切换时间一般为30S至120S,能够提供RAC集群所需要的高可用级别。