Monthly Archives: October 2013

Cache Fusion 剖析(一)

本系列文章翻译自网站:DataDisk.co.uk (原文链接) Cache Fusion 是RAC的核心,本系列文章意在帮助大家理解RAC的内部和运作机理,有些名词和概念在新版本的RAC中改变了名称或者很少提及,但是本质保持不变。 译文开始 我之前在GRD那一节提到过Cache Fusion, 这里我会介绍更多实现的细节。我也会给出一些我自己的RAC系统上的具体例子。 Cache Fusion尽可能使用最有效的通信方法以降低私有网络上的通信流量,现在管理RAC环境您已经不需要关心这么底层的细节了,当然了解这些有助于理解RAC的工作原理和调试问题。RAC看起来只有一个大的buffer但事实并非如此,每个节点上的buffer cache依然保持独立,数据块通过分布式锁和消息操作实现共享。RAC通过私有网络把数据块复制到别的实例,因为这比从磁盘读取要有效的多,没错,内存和网络协同工作比磁盘I/O更快。 数据块从一个实例的buffer cache传输到另外一个实例的buffer cache被称之为ping。正如较早前提到的那样,当一个实例需要一个数据块,它会发送请求到锁的master实例要求以希望的锁方式访问此块,这个过程叫做BAST。当实例收到BAST消息之后,它就会尽快的把持有的锁降级,但此时实例或许要将对应的数据块写回磁盘,这个操作叫做Disk ping或者hard ping。在最近的RAC版本中,Disk Ping已经被大大降低,然后总还是有少量的Disk Ping发生,因而更加依赖于实例间的数据块传输。在最新版本的RAC中,当实例收到BAST后,发出数据块或者把锁降级可能被延迟几十毫秒,这点额外的时间使得持有锁的实例可以完成当前活动的事务并妥善标记数据块的头。这样接受的实例就不用在接受/读取数据块之后立刻去检查事务的状态。检查事务状态是一个耗时的操作,因为可能需要访问(或者ping)相应的回滚段头和回滚段数据块。参数_gc_defer_time用来定义实例延迟降级锁的时长。 在GRD那一节我提到了PI(过去映像),简单来说他们就是存在于实例本地buffer cache中的数据块的副本。当一个实例需要发送一个刚刚修改过的数据块给别的实例时,它就会保留那个数据块的一个副本,标记为PI。PI一直被保留直到那个数据块被当前的所有者写回磁盘。当一个数据块被写回磁盘且此数据块有一个全局角色,也就是说此数据块有PI存在于其他实例的buffer cache。GCS就会通知持有这些PI的实例丢弃这些PI。当需要做检查点时,就会通知GCS要做写的动作,GCS负责找到最新的数据块映像并通知持有这些映像的实例执行数据块写操作。GCS然后通知所有全局资源的持有者他们可以释放包含PI副本数据块的缓存,从而允许释放全局资源。可以通过表X$BH查看过去映像的数据块。 select state, count(state) from X$BH group by state; Note: the state column with 8 is the past images. … Continue reading

Posted in 数据库 | Tagged , | Leave a comment