内存融合概念
内存融合技术比较复杂,需要先了解基本的相关概念,再来理解内存融合。
1:全局资源目录
GRD(global resource directory): 保存和组织内存融合相关资源的一种方式,是内存融合的基础。每个实例都包含GRD信息
2:PCM 锁
模式(mode): N ,S X
nsx
nyyy
syyn
xynn
3:角色(role ) PCM锁的角色表示对应的数据库被修改的范围,它可以是本地(L)或者全局(G),本地表示对应的块只在本地被修改过,全局表示块在另外一个或者多个远程实例被修改。
4:旧镜像(pass image ,Pi)这部分值为1或者0.如果为1表示存在对应的PI块,如果表示0不存在PI块。角色为L的PCM锁不会存在PI,PI只会对角色G的PCM锁才会存在。
当PI产生时,对应的改变的信息一定要被写入redo log,PI 的存在主要是为了避免RAC过多的访问回滚段避免物理读。
5:节点
资源申请节点、资源持有节点、资源主节点
资源申请过程:
1:资源申请节点发送申请到主节点
2:主节点将请求发给对应的资源持有节点
3:资源持有节点将本地的资源锁信息(PCM)进行改变,之后将资源发送给资源申请
节点
4:资源申请节点获取资源,并通知主节点更新资源的相关锁信息。
6:消息机制
步骤1:资源节点向主节点发送消息,要求持有一个资源,这个消息需要被立刻处理,而且主节点会立刻响应这个消息,之后资源申请节点进入等待状态
步骤2:资源主节点发送消息给资源持有节点。这个消息需要被乐可处理,而且资源持有节会马上回复资源主节点。
步骤3:资源持有节点发送消息给申请节点,并同时将资源也发送给申请节点。
步骤4:申请节点通知资源主节点申请已经结束。
7:内存融合举列说明
以一个4节点的RAC数据库为例,说明各种场景内存融合的原理
7.1节点C要求读取一个数据块(SCN 1000),第一次读取
步骤1:SCN 1000的数据块的主节点被HASH 到 D节点,之后节点C向主节点发送请求,要求以S模式持有改块。这是PCM资源锁的属性是SL0(S 表share ,L表示local ,0表示没有PI )
步骤2:主节点发现这个是第一个请求,没有不兼容的锁存在,把对应的锁赋予C。
步骤3:节点C从数据文件读取对应的数据库块
步骤4:读取完成,节点C获得对应的锁,属性为SL0。
步骤5:节点C获取对应的锁之后,通知主节点。
7.2节点B要求读取改数据块
步骤1:节点B向主几点D申请获取这个数据块的最新版本。
步骤2:主节点发现最新的块保存在C节点,要求C节点发送给B节点
步骤3:节点C将数据块发送给B节点,这时候节点B的锁属性为SL0
步骤4:节点B收到数据库块后,通知主节点更新资源锁信息
7.3实例B要求修改数据块,把SCN改成1009
步骤1:节点B向主节点D申请获取这个数据块更高级别的锁(X)
步骤2:主节点发现数据块在C节点存在S模式的锁,要求C节点释放该锁
步骤3:节点C将数据块上的锁释放,同时将对应的数据库变成一个CR快,因为这个时候数据块的最新版本在节点B上,而且节点C也没有修改过这个快,之后通知节点B锁已经释放
步骤4:节点B收到消息后,修改数据块,并通知主节点更新资源锁信息,这时候数据块最新版本存在B节点上,对应的锁信息为XL0
7.4节点A要求修改数据块把SCN 改成1013
步骤1:节点A向主节点D要求获取这个数据块X模式的锁
步骤2:主节点发现数据块在B节点存在X模式的锁,要求B节点释放锁
步骤3:B节点将数据块上的锁释放,并将修改数据块的操作写入重做日志
同时将对应的数据块变成一个PI块,之后通知节点A该锁已经释放,并将数据块发给节点A,这时候节点B对应的锁信息为NG1
步骤4:节点A收到消息之后,修改数据块并通知主几点更新锁信息。这时候数据库的最新版本在节点A(XGO)
7.5节点C要求读取数据块
步骤1:节点C向主节点要求获取这个数据块的S 锁
步骤2:主节点D发现这个数据块在节点A存在X模式锁,要求A释放X锁
步骤3:节点将数据块上的X锁释放(降级S),并将修改的操作写入重做日志文件中,同时将数据块变成PI块,之后通知C节点锁已经释放,将数据块发送给C节点,这是A节点的锁为SG1
步骤4:节点C收到消息之后,更新本地节点锁信息(SG0),并通知主节点更新锁信息。
7.6节点B要求读取数据块
步骤1:节点B向主节点D要求或者这个块的S锁
步骤2:主节点D发现数据块在C和A节点存在S模式锁,选择C节点发送数据块
步骤3:节点C收到请求后,将最新的数据库发送给B
步骤4:节点C收到消息之后,更新本地节点的锁信息,并通知主节点更新锁信息。这是数据块SG1
7.7节点A要求执行检查点
步骤1:节点A向主节点要求写入数据库块
步骤2:主节点发现数据块在节点A存在最新的版本,通知A节点将数据写入磁盘。
步骤3:节点 A 将数据的最新版本写入数据文件发送I/O请求
步骤4:数据文件被写入,I/O请求完成
步骤5:节点A通知主节点块已经被写入,这是节点A锁为(XL0)
步骤6:主节点通知所有包含数据块PI的节点消除PI,锁属性为(NL0)
网友评论