RAC
在Grid Infrastructure安装完以后,我们把注意力转移到集群上的Oracle软件的安装上来。我们看到,Grid Infrasctructure提供了运行RAC的框架,包括集群通讯链接、节点分离、节点成员关系等服务。ASM是Oracle存储数据库的首选方式。RAC利用这些概念并扩展了需要的基本服务。
安装选项
成功安装了Grid Infrastructure/Clusterware以后,Oracle Universal Installer检测到集群环境的建立,然后提供安装整个集群上或是用户指定其中几个节点的RAC选项。使用集群检验工具cluvfy来为RDBMS的安装检测是否满足先决条件是良好的做法。和安装集群一样,Oracle Universal Installer将首先在第一个节点上对软件进行拷贝和链接,然后将Oracle主目录push到指定的其他节点中。和Grid Infrastructure不同的是,Oracle RDBMS可以被安装在共享文件系统上(例如OCFS2或ACFS上),在集群中增加新节点被简化,因为不需要在新的节点上重新安装软件,打补丁同样被简化了--只有一个Oracle主目录需要打补丁。但是补丁不能以rolling方式安装,因此停机时间不可避免。
在安装过程中,Oracle Universal Installer将提醒管理员安装或升级数据库,或只安装软件。如果安装的时候有新的版本发布,那么仅仅安装软件,打补丁升级后再创建数据库是比较好的做法。
单实例和RAC数据库
RAC和单实例数据库在很多重要方面都有所不同。
在RAC中,一个数据库在共享存储中为多个服务器上的实例所访问。数据库文件、在线redo文件、控制文件和服务器参数文件(spfile)都必须共享。此外,闪回日志、已归档的redo日志、数据泵转储文件、和dataguard broker配置文件也可以共享,根据你的配置来决定(这是可选的,但还是强烈建议这么做)。在使用ASM的时候,你同样可以在每个RAC的节点中找到一个本地的pfile文件,这个文件指向对应磁盘组中的spfile。另一个存储在本地的文件是Oracle密码文件。集群文件系统中的用户常常把这些文件放在一个共享的位置,通过符号链接指向$ORACLE_HOME/dbs
数据库文件
数据库文件包含数据库中的所有数据,包括表、索引、数据字典和经过编译的PL/SQL代码,不胜枚举。在RAC中,每个数据文件都只有一个拷贝,位于共享存储中,并为所有实例所访问。Oracle默认不为数据文件提供镜像,大部分用户选择在存储层面来做冗余,避免介质故障导致的数据丢失。在存储阵列没有这个功能时,可以使用Oracle ASM来提供冗余。
控制文件
控制文件储存数据库的物理结构的相关信息,包括它们的状态。如果你使用RMAN且没有专门的RMAN catalog数据库,控制文件中也可以储存RMAN备份的信息。在单实例数据库和RAC中,控制文件应该做镜像以防止损坏或存储故障。当同时使用ASM和闪回恢复区时,会自动做多路复用。默认情况下,Oracle在db_create_file_dest和db_recovery_file_dest指定的磁盘组中对控制文件做多路复用。这种情况下,若你使用spfile,control_files参数将自动更新。要知道控制文件会成为RAC中的一个热点,因为它们会被频繁更新。因此不要对控制文件做过多的镜像拷贝,而且应该把它们放置在高速存储上。
REDO和归档
在RAC中,每个实例有它自己的联机日志文件,称为线程(thread)。线程的信息可以在V$LOG和相关的视图中查看。
每个线程中你需要两组redo日志,而且若没有使用ASM和闪回恢复区,你应该考虑手动对组中的成员做多路复用。由spfile负责实例和线程间的映射(通过初始化参数thread)。当添加一个新的实例到集群中时,就需要一个相应的redo线程,这可以使用两种方式来做到:第一种,执行SQL语句alter database add logfile group x thread y; 第二种,在使用策略管理的数据库(policy-managed)中,会自动创建。然后由Oracle来启用。
lgwr后台进程将redo buffer刷新到redo log中。online redo log需要放在高速存储中,否则它可能会成为一个争用的点,特别是在一个高频率提交的系统中。通常对设计不合理的应用的优化是减少commit的频率,并至少将redo log和控制文件移到高速存储中,以减少一些性能瓶颈。在日志切换频繁的系统中,增加每个线程的重做日志组数会有所帮助,它能给归档进程更多的时间来归档redo日志。这种方法在归档进程需要将归档的redo传送到standby数据库中时也能获益,但是,现在的大部分系统采用Log Network Service(LNSn)进程来异步传送redo给standby数据库的Remote File Server(RFS)进程。在Oracle 10.2和11.1中,每个destination有一个LNS进程,到了11.2,LNSn进程被NSSn何NSAn后台进程所代替。NSSn进程被用来同步传送redo,NSAn用来异步传送redo。redo log大小设置的原则是,日志切换不会太频繁(AWR和statspack能够帮助定义一个合适的大小)。Oracle 11.2还允许管理员来选择redo log的块大小,现代存储单元使用4kb扇区大小代替了原先的512b。
当RAC中的一个实例发生故障,所有线程被合并来帮助建立恢复集,由服务器监控进程来执行前滚或回滚操作。
在lgwr进程将一个redo log写满以后,其中一个归档进程会将该文件拷贝到指定的目录中。
闪回恢复区在Oracle 10.1中引入,看是来是归档日志的最佳存放位置。如果你没有使用闪回恢复区,建议将归档日志放在一个共享文件系统中,以便每个节点都可以访问到。与单实例数据库不同,RAC需要所有线程的归档日志。当一个实例执行介质恢复时,你可以从它的alter日志上看到,Oracle使用了每个线程的所有日志文件。
Undo表空间
和redo线程类似,每个集群数据库的实例由它自己的undo表空间。spfile中配置了实例和undo表空间之间的一对一映射关系。但这个映射并不代表该undo表空间就长期绑定在该实例上,所有的其他实例同样可以访问该undo表空间来创建块的读一致前镜像。
当添加一个实例到集群中时,需要添加新的undo表空间并映射到该实例,和redo log一样。在policy-managed数据库中,Oracle可以自己来做这件事。
虽然还是可以使用手动的undo管理,但是强烈建议使用自动undo管理(AUM)。
RAC数据库的存储选项
管理员可以在如下的选项中选择:
ASM 这是Oracle的首选存储选项,而且是RAC标准版中支持的唯一配置
OCFS2
裸设备 不推荐使用,不仅是因为被新版的linux内核弃用,在Oracle 11.2中同样不支持
网络文件系统(NFS)
Red Hat Global File System 只在红帽和Oracle Enterprise Linux中支持,可以用在闪回恢复区和数据库文件上
RAC实例
一个RAC数据库包含2个或更多的实例,一般每个实例都在不同的节点上,由一些共享内存结构和后台进程组成。
每个实例都有自己的SGA,在实例启动的时候分配。Oracle在10g中引入了自动共享内存管理(ASMM),在11g中引入了自动内存管理(AMM)。但是AMM与linux的大页面不兼容,这对大内存的系统来说是个问题。
Oracle需要同步访问本地共享内存和整个集群。所有实例都能访问其他实例的SGA。
在RAC中Oracle内核对共享内存的保护措施和单实例中是一样的,同样使用了闩和锁。闩是一个低级别、轻量级的串行装置。请求闩的进程不会排队,如果进程不能获得闩,它就会进入spin状态。spin的意思是,这个进程会进入一个紧密循环来预防被操作系统的调度程序从CPU中取下。如果一个进程长时间得不到闩,它会进入睡眠,在一个时间间隔后再次尝试申请。闩是实例级别的,没有集群范围的闩。
另一方面,锁在更长的时间请求一次,比闩更为复杂。锁可以是共享或独占的,请求锁的进程以先进先出(FIFO)的机制来等待,由队列来控制锁的访问,这个队列是集群范围内的。
缓存一致性的需求意味着锁和闩在RAC中比单实例要更加复杂。和单实例中一样,对buffer cache中数据库的访问和队列必须在本地实例中管理,但是,远程实例的访问也需要管理。因为这个原因,Oracle使用全局资源目录(GRD)和一些额外的后台进程。
(Oracle将V$视图加上实例标识组合起来形成GV$视图,一个GV$视图包含了集群中所有实例的动态性能视图)