Chinaunix首页 | 论坛 | 博客
  • 博客访问: 54796
  • 博文数量: 56
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-15 09:38
文章分类
文章存档

2011年(8)

2010年(48)

我的朋友

分类: Oracle

2010-10-26 14:18:33

大话 ORACLE RAC 
第一部分
集群理论篇


第四章:
RAC 原理


数据库的基本原理:
如何同时保证"并发"和"数据一致",是数据库系统最核心的内容。
脏读
不可重复读
幻读
事务与隔离级别(SQL 标准提出的)
==============================================================================================
隔离级别 脏读 不可重复读 幻读
----------------------------------------------------------------------------------------------
Read Uncommitted    Y Y Y
----------------------------------------------------------------------------------------------
Read Committed N Y Y
----------------------------------------------------------------------------------------------
Repeatable N N Y
----------------------------------------------------------------------------------------------
Serializable N N N
==============================================================================================
ORACLE 支持的隔离级别:

Read Committed(默认),Serializable,Read Only三种隔离级别。Read Only是ORACLE 特有的。
Repetable这个级别是为了避免丢失修改。
ORACLE 中没有明确的Repetable级别的定义,在ORACLE中可以有两种方法来实现:
1,select .... for update;悲观锁
2,select 的时候不锁定记录,但是要查询出记录所有字段的内容,然后在update时,把所有的字段都作为
where条件,乐观锁。
Serializable   和    Read Only
============================================================================================
Serializable Read Only
---------------------------------------------------------------------------------------------
其他用户可以修改数据,但是这些修改对于本会话是不可见。 |   同Serializable
---------------------------------------------------------------------------------------------
本会话可以修改数据,但是如果修改的数据已经被其他用户    |本会话不能修改数据。
修改,会抛出ORA_08177:can't serialize access for this 
transaction 异常
=============================================================================================
这两个级别都要在会话级别明确声明:
alter session set isolation_level=serializable/read only;
Oracle 单实例的并发控制机制:

Lock  && Latch
Lock:
Resource Structure
Lock Structure
Enqueue
Resource Structure:
Oracle 对于每一个需要进行"并发控制"的资源,都在SGA中用一个数据结构来描述它,这个数据结构图就是
Resource Structure。这个数据结构中有三个与"并发控制"有关的成员:owner,waiter和Converter.
这是三个指针,分别指向三个由Lock Structure组成的链表。
Lock Structure:
每当进程要访问共享资源时,必须先"锁定"该资源。这个动作实际就是从内存中申请一个Lock Structure,
在其中记录"锁模式,进程ID"等重要的信息。然后看是否能够立刻获得资源的访问权,如果不能,则把这个
Lock Structure挂到Resource Structure的Waiter链表中。如果能够获得,则把Lock Structure挂到Resource
Structure的Owner链表中。
上面说的Resource Structure 中的Owner,Waiter,Converter三个成员就是指向Lock Structure组成的链表的指针。
锁模式:
在Lock Structure中有一个很重要的信息是锁模式,锁模式用于表示对资源的保护级别。常见的有三种级别。
锁模式
============================================================================================
锁模式 含义
--------------------------------------------------------------------------------------------
Null |这种模式主要用于数据字典对象
--------------------------------------------------------------------------------------------
Share                      |拥有者本身对资源进行只读访问,允许其他用户并发只读访问
--------------------------------------------------------------------------------------------
Exclusive                  |拥有者本身对资源进行修改访问,不允许其他用户任何并发访问
============================================================================================
      
      
Enqueue:
Lock 使用的是Enqueue算法,可以理解为"先入先出队列"。
Waiter 和 Converter两个都是等待队列,二者的用法有细微的区别:
Coverter队列会优先于Waiter队列被处理。
可以查看V$LOCK视图。
"数据记录"的行级锁:
1,行级锁机制
当一个事务开始时,必须先申请一个TX锁,这种锁保护的资源是回滚段,回滚数据块。
因此这个申请也就意味着:用户进程必须先申请到回滚段资源才能开始一个事务,才能执行
DML语句修改数据。
无论一个事务修改多少个表的多少条记录,该事务真正需要的只是一个TX锁,每个表一个的TM锁,
内存开销非常小。而所谓的"行级锁"其实只是数据块头,数据记录头的一些字段,不会消耗额外
资源。  虽然有锁的功能,但是没有锁的开销。
把对象分成简单对象,复合对象。并使用不同的锁,对性能有很大的提升。
Latch:    
"低级锁"
Oracle采用哈希算法来组织内存。
Hash Buctet
Data Block Address (DBA)
Lock  && Latch

Lock,进程上下文切换,时间长,很消耗资源,排队机制
Latch,原子操作,时间短,"出工不出活" 抢占机制
     
     
深入理解:

Oracle对每个语句都会计算出哈希值,用这个值在Shared Pool中查看是否有对应的执行计划,
如果有,就说明这个语句曾经执行过。
Lock && Latch的使用:

首先,前三个阶段目的是产生执行计划,所谓执行计划,其实对应着Shared Pool中一个复杂的
数据结构。为了产生这个数据结构,Oracle要计算SQL语句的哈希值,根据这个值确定要检索的
"桶(Hash Bucket)",然后遍历这个桶中的"链表",看是否有完全相同的SQL语句。如果找不到
则说明书这个语句是第一次执行,就需要进行硬解析。进程要从Shared Pool的空闲空间中申请
一块空间,以存放编译后的执行计划。这就需要检索另一个"空闲链表",从中申请一个大小合适
的空闲块,申请成功后要更新这两个链表。
在这个过程中,至少涉及到两个数据链表的访问,这个访问要求是"排(exclusivve)他"的,不允许
其他进程同时修改乃至访问,这就需要对"链表"加锁,这种锁用的就是Latch机制。
其次,在语句的编译的执行过程中,"引用对象"的结构不能被修改。eg:"select * from a"这条
语句,在编译前,需要把a 表的"元数据"加载到内存,也就是把数据字典中的a的内容加载到内存
中的Library Cache,在随后的编译和执行过程中,这个内容要保持不变,不能被其他进程修改,
也就是不能让其他用户改变这个表的结构。这里使用的就是TM Lock。
最后,在执行阶段,要在Buffer Cache中定位到数据块,同样是要根据数据块地址(DBA)查找
"桶"中的"链表"找到最终数据块。在这个过程中,链表数据结构也不能被修改,同样是使用Latch
保护。访问数据块中的记录时,也需要限制其他进程的访问,使用的是行级锁(Row-level Lock)      
机制进行保护。
RAC下的并发控制:

1,如何在多台计算机的环境下感知并发的存在?
DLM ,分布式锁管理器
可以把DLM想象成一个"仲裁",它记录着哪个节点正在用哪种方式操作哪个数据,并负责协调解决
节点间的竞争。
DLM并不是ORACLE的专利,所有的分布式系统都需要某种DLM。
需要强调的是,DLM负责的是节点间的协调,而节点内的协调不是DLM负责。
2,如何定义资源的粒度?
是在每条数据记录级别,还是在数据文件级别,还是在数据块级别?
ORACLE RAC选择的是以数据块作为粒度单位。
RAC比单实例多的就是分布式锁管理器,DLM的作用就是协调实例间对资源的竞争访问,而
实例内部的竞争RAC和单实例没有任何区别。所以学习RAC就是学习DLM。
ORACLE集群发展历史分为两个阶段:
OPS(Oracle Parallel Server)并行服务器
RAC。
两个阶段中的DLM名称也不同,OPS的叫作PCM,RAC的叫作Cache Fusion.
DLM中资源和锁:
DLM协调集群各节点对资源使用的功能就叫作同步。所有的资源访问都是需要同步。
PCM Resource
Non-PCM Resource
Cache Fusion Resource
Non-Cache Fusion Resource
Cache Fusion Resource 特指数据块这种资源,包括普通数据块,索引数据块,段头块,
Undo数据块。
非数据块资源全部归类为Non-Cache Fusion Resource,包括数据文件,控制文件,数据字典
视图,Library Cache,Row Cache等。
对应两种资源,DLM提供的锁也分为两种,PCM Lock和Non-PCM Lock.
在RAC数据库中共有两大类4种锁。
Global Locks:全局锁,用于集群间并发控制。由ORACLE的后台进程使用的。
PCM Locks  && Non-PCM Lock
Local Locks:本地锁,用于本地进程间的并发控制。由用户进程和后台进程使用的。
Lock  && Latch
Non-Cache Fusion 资源:
典型的Non-Cache Fusion资源包括Share Pool的Row Cache和Library Cache内容。
以Library Cache为例,这个Cache中存放的是所有SQL语句,执行计划,包等对象,以及这些
对象所引用的对象。当一个语句或者包编译时,这个语句引用的所有对象都会加一个Library
Catch Lock;而执行时,所有这些对象都要被加一个Library Cache Pin,以保证在语句执行过程
中,应用对象的结构不会被修改。
特点:
资源数量有限
资源被修改的频率很少。
因为这些资源有这些特点,ORACLE采用了类似于广播的机制,每个节点上的变化都会通知
给所有的节点。这种策略比下面介绍的Cache Fusion资源的实时检查更加高效。
Cache Fusion 资源:
数据块的状态:XCUR,SCUR,CR
PCM锁模式:X,S,NULL
数据块的状态可以从V$BH中查看出来。
V$RESOURCE_LIMIT
Cache Fusion 要解决的首要问题就是:数据块拷贝在集群节点间的状态分布图,这是通过
GRD实现的。
GSD(Global Resource Directory):

可以把GRD看作是一个内部数据库,这里记录的是每个数据块在集群间的分布图,它位于
每个实例的SGA中,但每个实例的SGA中都是是部分GRD,所有实例的GRD汇总在一起才是一个
完整的GRD.
RAC会根据每个资源的名称从集群中选择一个节点余作为它的Master Node,而其他节点
叫做Shadow Node.Master Node的GRD中记录了该资源在所有节点上的使用信息,而
Shadow Node的GRD中只需要记录资源在该节点上的使用信息,这些信息实际就是
PCM Lock信息。
PCM Lock:
GRD中记录的是PCM Lock信息,这种锁有三个属性:MODE,ROLE,&& PI.
MODE:
Exclusive(X)
Share(S)
Null
ROLE:
Local && Global
ORACLE在修改数据的时候,要先把数据块读到内存,在内存中修改,但是提交后并不立即
写回磁盘,而是采用延迟写的技术。在被写回磁盘之前,内存数据块和磁盘数据块内容不
一致,这时内存中的这个数据块是"脏数据块"。"脏"只是用来描述数据块的内存版本和
磁盘版本是否一致,和事务没有关系。事务提交时,只会把日志写到联机日志文件中,从
但是数据块不会立即写回磁盘,这是内存中的就是"脏数据块".
PAST IMAGE:
Past Image代表着这个实例的SGA中是否拥有和磁盘不一致的版本,以及版本顺序,
并不是代表这个节点是否曾经修改过个数据块,Past Image主要能够加速Crash 
Revovery 的恢复过程。
Cache Fusion 是跨事务的。
Cache Fusion并发总结:
在Cache Fusion中,每一个数据块都会被告映射成一个Cache Fusion资源,或者说是一个
PCM资源,PCM资源实际上是一个数据结构,资源的名称就是数据块地址(DBA)。每个数据
请求动作是分步完成的。首先把数据块地址X转换成PCM资源名称,然后把这个PCM资源请求
提交给DLM,DLM进行Global Lock的申请,释放活动,只有进程获得了PCM Lock,才能继续
下一步;也就是说第一步"实例要获得数据块的的使用权";
除了获得数据块的使用权,还要考虑数据块的状态。在单实例中,进程要想修改数据块,
必须在数据块的当前版本(Current Copy)上进行修改。在RAC环境下也一样,如果实例要
修改数据块,必须获得这个数据块的当前版本拷贝。这就涉及到一系列的问题:如何获得
数据块拷贝在集群节点间的分布图,如何知道哪个节点拥有的是当前拷贝,如何完成传递
过程。这一系列问题的解决机制就是内存融合技术(Cache Fusion)技术。一旦实例获得
了访问权限,并且也得到了正确的版本。然后进程就能访问资源了,进程间仍然使用传统的
Lock && Latch,这一点和单实例没有区别。
RAC 架构:


SGA的变化:
和传统的单实例相比,RAC Instance的SGA最显著的变化是多了一个GRD部分。
ORACLE 中的数据操作都是在内存SGA区完成的,和传统的单实例不同,RAC是有多个,每个数据
埠可以在任何一个Instance的SGA中都有拷贝,RAC必须知道这些拷贝的分布,版本,状态。
而GRD就是这种信息的内存区。
GRD虽然位于SGA中,但是不像Buffer Cache 或 Log Buffer等SGA组件,有明确的参数对应。
每个节点SGA中都只有部分GRD内容,所有的节点合在一起才构成完整的GRD.
后台进程的变化:
每个RAC的实例和传统的单实例一样,都有DBWR,LGWR,ARCn,CKPT这些后台进程。
此外,RAC还增加了若干RAC特有的进程。
1,LMSn  
这个进程是Cache Fusion的主要进程,负责数据块在实例间的传递,对应的服务叫做
GCS( Global Cache Service),这个进程的名称来源于Lock Manager Service.
这种进程的数量通过参数GCS_SERVER_PROCESSES来控制,默认为2,取值0--9;
2,LMD
这个进程主要负责的是Global Enqueue Service(GES).具体来说,这个进程负责在多个
实例之间协调对数据块的访问顺序,保证数据的一致性访问。它和前面的LMNn进程的GCS
服务还有GRD共同构成RAC最核心的功能Cache Fusion;
3,LCK
这个进程负责Non-Cache Fusion资源的同步访问,每个实例都有一个LCK进程。
4,LMON
各个实例的LMON进程会定期进行通信,以检查集群节点的健康状态,当某个节点出现问题时,
负责集群重构,GRD恢复等等操作,它提供的服务叫做CGS(Cluster Group Service);
主要借助两种心跳机制来完成健康监测。
1,节点间的网络心跳,ping
2,通过控制文件的磁盘心跳,控制文件是共享的,每个节点的CKPT进程每隔三秒更新一次
控制文件。
select inst_id,cphbt from x$kcccp;
5,DIAG
DIAG进程监控实例的健康状态,并在实例出现错误时收集诊断数据记录到ALERT.LOG
日志中。
6,GSD
这个进程负责从客户端工具,比如SRVCTL接收命令,为用户提供管理接口。
文件:
整个Cache Fusion有两个服务组成,GCS && GES,前者专职于数据块在实例间的传递,
而后者负责锁管理。
阅读(786) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-26 18:40:59

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com