一、RAC体系统结构?
RAC是Oracle公司研发的Real Aplication Cluster,通过CRS来实现。RAC由clusterware集群件和RAC应用程序两部分组成。整个体系结构可分为三层,存储层,集群节点层和客户端层。多个节点通过共享存储访问同一个的RAC数据库,各节点上运行操作系统,clusterware集群件,RAC应用程序和监听器,做为服务端接受来自客户端的访问请求,并能实现负载均衡和透明应用失败切换功能,具有高可靠,高可用,良好的扩展性等众多优点,已被业界广泛使用,成为一种主流数据库。


二、Clusterware集群件的组成部分?
Clusterware集群件由2个集群套件组成,分别是表决磁盘(voting disk)和集群注册服务(OCR)。
1、表决磁盘(voting disk)
voting disk位于共享存储上,各节点均可访问,用于记录各节点的健康情况。

2、集群注册服务(OCR)
OCR同样位于共享存储上,用于记录集群与数据库的配置信息。

3、Clusterware集群件管理
通过CRS可实现成员节点,集群资源,心跳监控等管理功能,常用的命令有crs_stat、crs_start、crs_stop、crsctl


三、RAC共享存储实现方式有哪些?
通常来说有以下几种存储结构:SAN、ISCSI、DAS、NAS,用户可根据业务需求灵活选择。RAC共享存储常见的实现方式有以下几种:RAW、OCFS2、ASM、NFS
RAW  裸设备,即没有文件系统的设备,跳过文件系统层,存储性能更好,缺点是不方便管理
OCFS2 Oracle开发的集群文件系统,支持多种平台,管理方便,缺点是对于有大量写需求的应用性能不佳
ASM  自动存储管理,是Oracle研发的存储管理工具,本质也是裸设备,但增加很多管理功能,使用方便。
NFS  是NAS网络存储的实现方式之一。


四、RAC集群的数据文件是如何分配,大概容量空间是多少?
在RAC集群中各存储如何分配是在集群系统设计规划之初必须要考虑的问题之一,也非常重要,建议的分配方式如下:
crs集群软件                    本地存储(ext3/ext4)    500-800M            
rac安装程序                    本地存储(ext3/ext4)    2-3G                        
voting disk                    共享存储(raw)          20-50M
ocr disk                       共享存储(raw)          100-200M
rac数据库                      共享存储(asm)          5-8G   
flash recovery area            共享存储(asm)          2G


五、RAC是如何实现心跳监控的?
RAC心跳监控有两种实现方式:voting disk和私有以太网监控
各成员节点每隔几秒就会向voting disk写入心跳信息,各节点也会定期查看voting disk上其它节点的情况,在规定的最大时间内若还收不到节点信息,则认为此节点失效,集群应用程序会采取相应的处理措施,如重启或隔离。
在各成员节点单独配置一个私有网段来通过网络监控各节点是否失效。通过voting disk和私有以太网两种心跳监控方式结合极大提高的心跳监控的可靠性,保证的集群的完整性。


六、RAC是如何保证各节点数据一致性?
分二个层面来实现:内存和共享存储
在内存层面,Oracle通过名为Cache Fushion的缓存容合技术定期同步各节点的buffer cache,保证各节点数据的一致性,同时也提高了访问速度。
在共享存储层面要保证数据一致性主要通过GCS与GES这两个服务来实现,这两个服务用于协调对共享数据库和数据库内的共享资源的同时访问。同时,GES和GCS通过使用全局资源目录(Global Resource Directory,GRD)来记录和维护每个数据文件的状态信息,而GRD保存在内存中,内容分布存储在所有实例上。每个实例都管理部分内容。


七、RAC集群的主要服务进程有哪些,各有什么作用?
|--CRSD    集群资源服务,管理集群中所有的资源与服务,数据库,服务,实例,vip,监听器,应用程序等
|--CSSD    集群同步服务,管理与协调节点关系,用于节点通信
|--EVMD    事件管理服务,事件检测后台进程
|--OPROCD    用于节点检测监控
|--LMS    Gobal Cache Service Process 全局缓存服务进程
|--LMD    Global Enqueue Service Daemon 全局查询服务守护进程
|--LMON    Global Enqueue Service Monitor全局查询服务监视进程
|--LCK0    Instance Enqueue Process 实例队列进程


八、RAC集群如何实现负载平衡?
RAC集群实现负载平衡方式有两种:一种是通过客户端实现,另一种是通过服务端实现
通过客户端连接实现时,不需要在服务端做任何配置,只要在发起连接的客户端配置tnsname.ora文件即可,主要是增加地址列表,和开启failover策略,基于客户端连接的负载平衡主要依赖客户端在发起连接时依次在地址列表中选择服务器建立会话连接来实现,缺点比较明显,并不清楚服务器真实的负载情况。
RACDB=
    (DESCRIPTION =
(ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = node-vip2)(PORT = 1521))
       (ADDRESS = (PROTOCOL = TCP)(HOST = node-vip1)(PORT = 1521))
       (LOAD_BALANCE = yes)
      )
     (CONNECT_DATA =
        (SERVER = DEDICATED)
           (SERVICE_NAME = racdb)
         )
    )
基于服务器端的负载平衡实现也比较简单,主要有两个步骤:
1、在各节点成员服务器上的tnsname.ora文件中添加如下配置
LISTENERS_RACDB =
 (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = node-vip2)(PORT = 1521))
       (ADDRESS = (PROTOCOL = TCP)(HOST = node-vip1)(PORT = 1521))
)
2、在参数文件中修改remote_listener的值为“LISTENERS_RACDB”
show parameter remote_listener
alter system set remote_listener='LISTENERS_RACDB' sid='node-rac1';
alter system set remote_listener='LISTENERS_RACDB' sid='node-rac2';


九、TAF(透明应用失败切换)是如何实现的?
学习TAF要抓住三点:
1、TAF是客户端的行为,与服务端无关;
2、失败切换是指客户端与原实例节点连接失败后自动切换到新的实例节点上;
3、透明应用是指连接失败后,会话连接自动切换到新实例节点上这个操作对于客户端程序是透明的;
实现TAF,在客户端的配置如下:
RACDB =
(DESCRIPTION =
(ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = node-vip2)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = node-vip1)(PORT = 1521))
     (LOAD_BALANCE = yes)
     )
     (CONNECT_DATA =
       (SERVER = DEDICATED)
       (SERVICE_NAME = racdb)
         (FAILOVER_MODE =
         (TYPE=SELECT)
         (MODE=BASIC)
         (RETRY=3)
         (DEALY=5)
        )
   )
)
参数解释:
TYPE:select,session,none
|--select        失败连接切换时保留正在执行select操作,其它sql操作重新执行;
|--session        失败连接切换时重新执行正在执行sql操作;
|--none        失败连接切换时禁止sql接管功能;

MODE:basic,preconnect
|--basic        建立初始连接时仅与一个节点建立连接;
|--preconnect        建立初始连接时和主备节点同时建立连接;

RETRY        当前节点失败后,切换功能尝试切换次数
DEALY        两次切换尝试之间间隔; 


十、RAC常用的管理命令有哪些?
crs_stat -t        #查看群集资源状态(简单资源名,类型,状态,节点)
crs_stat -l        #查看群集资源详细情况,可更加详细的显示资源名称
crs_stop -p <完整资源名称>        #关闭某个具体的资源
crs_start -p <完整资源名称>        #启动某个具体的资源
crs_start -all                #启动所有资源
crs_stop -all                #关闭所有资源
crsctl  check cluster -node node-rac1        #检测节点状态
crsctl check cssd            #检查cssd服务运行状态
crsctl query crs activeversion        #检查crs运行版本
crsctl lsmodules css            #检查css加载模块
crsctl stop resources            #停止本节点所有资源
crsctl start resources            #启动本节点所有资源
/app/oracrs/product/11.0.6/crs/bin/crsctl stop crs    #停止crs服务,需用root身份执行

voting disk管理
crsctl query css votedisk            #查看voting disk信息
dd if=/dev/raw/raw3 of=/tmp/votedisk.bak    #备份voting disk
dd if=/tmp/votedisk.bak of=/dev/raw/raw3    #恢复voting disk  
crsctl delete css votedisk /dev/raw/raw5 -force    #删除voting disk
crsctl add css votedisk /dev/raw/raw5 -force    #添加voting disk

ocr disk管理
ocrcheck                #检查ocr配置
ocrconfig -showbackup            #检查自动备份ocr文件路径
ocrconfig -restore 备份路径        #恢复ocr
ocrconfig -export /tmp/ocr_bak        #手工导出ocr
ocrconfig -import /tmp/ocr_bak        #手工导入ocr
添加OCR镜像盘步骤:
1、crsctl stop crs            #停止crs服务
2、创建raw设备/dev/raw/raw11    
3、ocrconfig -export /tmp/ocr_bak        #手工导出ocr信息
4、vi /etc/oracle/ocr.loc            #在配置中添加镜像盘
5、ocrconfig -import /tmp/ocr_bak        #将ocr配置手工导入
6、crsctl start crs            #启动crs服务

srvctl status database -d racdb        #查看所有实例状态
srvctl status instance -d racdb -i racdb1    #查看一个实例状态
srvctl status nodeapps -n node-rac2        #查看节点上应用程序状态
srvctl status asm -n node-rac2        #查看节点上asm实例状态
srvctl config database -d racdb        #查看数据库配置文件目录
srvctl config nodeapps -n node-rac2        #查看节点上应用程序配置
srvctl config asm -n node-rac2        #查看节点上asm实例配置

停止一个节点所有服务,启动执行逆操作
1、emctl stop dbconsole
2、srvctl stop instance -d racdb -i racdb1
3、srvctl stop asm -n node-rac1
4、srvctl stop nodeapps -n node-rac1

srvctl stop database -d racdb        #关闭所有节点的实例及服务
srvctl start database -d racdb        #启动所有节点的实例及服务

对服务执行增删改操作
srvctl add service -d racdb -s test -r racdb1 -a racdb2 -P BASIC    #增加一个名为test服务
srvctl start service -d racdb -s test -i racdb1    #节点上启动服务
srvctl status service -d racdb -s test        #查看服务状态
srvctl stop  service  -d racdb -s test -i racdb1    #在节点1上停止服务
srvctl start  service  -d racdb -s test -i racdb2    #在节点2上启动服务
srvctl remove service -d racdb -s test -i racdb2    #在节点2上移除服务