在RAC环境中有一个很重要的场景,即集群中的某些实例的crash recovery。根据前面系列的文章我们知道,实例的移除必定会伴随着缓存融合下的全局资源的重新分配。当一个实例离开集群时,需要将该实例的GRD重新分配给存活的节点。这里有个术语叫remastering,即表示集群中存活的实例试图持有或者作为master管理失败实例之前持有或作为master管理的资源。


为了尽快恢复集群的可用性,Oracle使用一种称为lazy Remastering算法,在集群重新配置期间只重新映射最少数量的资源。全局资源的重新分配我们一般也称为Reconfiguration(重构)。


Oracle使用一种称为lazy Remastering算法简单演示:

初始环境:

• 实例A主资源1、2、3、4

• 实例B主控资源5、6、7、8

• 实例C主资源9、10、11、12

重构后环境:

• 实例A主资源1、2、3、4、5、6

• 实例C主资源7、8、9、10、11、12

• 实例B从集群中删除,只有实例B中的资源在存活节点之间均匀地重新分配(实例A和C上的资源不受影响),这种方式可以有效减少RAC必须执行的工作量。同样,当实例加入集群时,也只有最小数量的资源重新分配到新实例。

需要注意的是Cache Fusion下崩溃恢复可以分为两种类型的恢复:

• 崩溃恢复(Crash Recovery)- 所有实例失败

• 实例恢复(Instance Recovery)- 部分实例失败

在这两种情况下,都需要做的一个事情就是失败实例的日志线程都需要被合并到一起已确保数据的一致性。实例恢复场景下,SMON进程将执行恢复工作,这其实与单实例下的崩溃恢复相类似。

注:

1. REDO:在RAC环境中每个实例都有自己的日志线程,控制文件存储了所有实例的日志线及文件的详细信息。每个实例有一个活动线程,这些线程是并行的时间线,并一起形成一个流。流由记录的所有重做信息的线程组成,流形成对数据库所做更改的时间线。

2. CHECKPOINT:在RAC环境和单实例环境中是相同的,当需要触发检查点时,Oracle将查找具有最低检查点SCN的thread的检查点,这个检查点SCN可以保证之前对所有实例所做的更改的都写入到磁盘中。

GRD Reconfiguration的步骤如下:

1.群集管理器监测到有实例从集群离开。

2.所有GCS资源请求和写入都暂时停止,冻结全局资源目录。

3.所有GES队列信息重新配置并恢复可用。

4.DLM恢复。

5.GCS(PCM锁)重新remaster。

6.第一步恢复动作(其中一个存活的实例成为恢复实例,恢复实例的SMON进程开始第一次读取失败实例的重做线程的重做日志。)

• SMON进程获取实例恢复(IR)锁。

• SMON进程分配内存空间,根据全局资源的锁状态信息准备和构建恢复集。

• SMON进程获取后续处理所需的所有资源和排队。

• SMON进程获取资源完成后,全局资源目录现在已解冻。现在可以访问不在恢复中的任何数据块。

• SMON通过SCN合并重做线程顺序,以确保以有序的方式写入更改。

7.第二步恢复动作。

• 第二步恢复启动,数据库已经处于部分可用。

• 数据块开始恢复可用性。

• SMON进程释放之前申请的IR锁,恢复完成。

• 集群恢复可用。

根据上面的步骤我们还需要注意:

1.第一个过程不执行实际的恢复,而是合并和读取重做线程,以创建需要恢复的块的哈希表,这些块不知道已被写回数据文件。检查点SCN需要作为恢复的起点,所有修改的块都添加到恢复集(一个有组织的哈希表)。如果块的bwr版本大于任何缓冲区缓存中的最新pi,则不会恢复该块。

2.第二个过程SMON从所有需要恢复的线程重新读取合并的重做流(通过SCN),然后将重做日志项与第一个过程中构建的恢复集进行比较,并将所有匹配项应用于内存缓冲区,就像单次过程恢复一样。成功完成后,将刷新缓冲区缓存,并更新每个线程的检查点SCN。

3.资源主节点会异常关闭的实例持有的锁,回收这些锁空间以便存活的实例重新持有它们。

4.SMON发出一条消息,表示它已经获得了执行恢复所需的缓冲区锁,这个时候PCM锁空间任然是无效的不对外提供访问的状态。

5.恢复成本取决于失败节点数,而不是节点总数。

6.存活实例缓存中的不同版本的数据块可以减少恢复需要的磁盘读取负担。

7.SMON进程会根据全局资源的锁状态信息来裁剪需要的数据集。

8.PI最新的版本可以作为数据块的有效恢复起点,这个PI可以是任何存活实例cache中的PI。

注:

BWR:因为内存中的块缓存会不断老化和增量检查点系统会将许多块写入磁盘,当dbwr完成数据块写入操作时,它还会添加一个重做记录,说明块已写入(数据块地址和scn)。DBWN可以以一种懒惰的方式批量写入块写入记录(BWR)。在rac中,当一个实例写入一个由全局资源覆盖的块时,或者当它被告知它所保存的过去映像(pi)缓冲区不再需要时,就会写入bwr。



沃趣科技,让客户用上更好的数据库技术!