最近整理了一下公司内部用到的Oracle数据库,1/3是单节点,1/2是一主一从,1/6是一主多从。单节点的数据是2-3个实例的RAC实现的高可用,一主一从和一主多从是基于Oracle自带的DataGuard+RAC实现的。
作为开发人员,长期习惯了直接使用DBA准备的数据库,对数据库的内部原理却不求甚解。今天偶有空闲,准备看看RAC和DataGuard是怎么个原理。
一、RAC的原理
RAC通过共享存储和锁的方式来提供Oracle数据库的双主特性。

每个实例有下述特点
1)每个实例有自己的SGA
SGA里面的数据都是需要相互传递
SGA的结构:
a)Database buffer cache :缓存了从磁盘上检索的数据块
b)Redo log Buffer:缓存了写到磁盘之前的重做信息
c)Shared Pool:可共享的数据结构
d)Large Pool:缓存大的I/O请求,以支持并行查询、共享服务器模式以及某些备份操作
e)Java pool:保存java虚拟机中特定会话的数据与java代码
f) Keep buffer cache:保存buffer cache中存储的数据,使其时间尽可能长
g)Recyle buffer cache:保存buffer cache 中即将过期的数据
h)nK block size buffer:为与数据库默认数据块大小不同的数据块提供缓存。用来支持表 空间传输
i) Streams pool:由Oracle streams使用
2)每个实例有自己的后台进程
a)LMSn--Lock Monitor Services 管理集群内的数据访问
b)LCK –Lock Process 管理实例间资源请求和跨实例调用操作,主要负责锁管理功能
c)LMD –Lock Monitor Daemon Process 管理对全局队列和资源的访问,并更新队列的状态,处理来自其他实例的请求
d)DIAG 例行健康检查,同时也监控是否挂起或者出现死锁
3)每个实例有自己的redologs
如果一个节点挂掉,其他节点读取failed节点redo中最后一次checkpoint之后的信息。应用这些信息(数据块和回滚块),回滚未提交事务。
4)每个实例有自己的undo表空间
RAC的服务进程
1)CRS-- 集群资源服务
管理集群内高可用操作(数据库、实例、监听、虚拟IP地址、应用进程)的基本程序。
2)CSS – 集群同步服务
管理集群内节点的成员资格(控制哪个节点为集群的成员,节点加入或离开集群时通知集群成员来控制集群的配置信息),此进程发生故障导致集群重启
3)EVMD – 事件管理服务
事件管理守护进程,发布CRS创建事件的后台进程
4)ONS --事件的发布及订阅服务
DataGuard的原理
DataGuard的架构:1个primary数据库及一个或多个(最大9个)standby数据库。
1)Primary数据库可以是单实例也可以是RAC
2)Standby数据库类型
逻辑standby是通过接收primary数据库的redo log并转换成sql语句,然后在standby数据库上执行SQL语句实现同步。
物理standby是通过接收并应用primary数据库的redo log以及介质恢复的方式实现同步,不仅文件的物理结构相同,连块在磁盘上的存储位置都是一模一样。
3)服务
重做传输服务(Redo Transport Services)
控制redo数据库的传输到一个或多个归档目的地。
b.日志应用服务(Log Apply Services)
应用redo数据到standby数据库,以保持与primary数据库的事务一致。redo数据即可从standby数据库的归档文件读取,也可直接应用备用日志文件读取。
c.角色转换服务(Role Transitions)
switchover:转换primary数据库与standby数据库。switchover可以确保不会丢失数据
切换步骤如下图所示:

failover:当primary数据库出现故障并且不能被及时恢复时,会调用failover将一个standby数据库转换为新的primary数据库。在最大保护模式或最高可用性模式下,failover可以保证不会丢失数据。
切换步骤如下图所示:

4)保护模式
a)最大保护
这种模式是默认的数据保护模式,在不影响源数据库性能的条件下提供尽可能高的数据保护等级。在该种模式下,一旦日志数据写到了源数据库的联机日志文件,事务即可提交,不必等待日志写到目标数据库,如果网络带宽充足,该种模式可提供类似于最大可用模式的数据保护等级。
除非REDO在至少一个STANDBY中可用,否则事务不能提交。如果在某个STANDBY中不可用,则主数据库的操作被停止。通常受制约比较多,在生产环境中不是很常用(性价比不好)。
b)最大可用性
这种模式和“最大保护”基本上差不多。正常情况下,主备库之间是同步的。
当网络或者备库出现问题时,不会影响到主库的宕机,主库会自动转换为“最大性能”模式,等待备库可用时,将归档日志传输到备库做恢复。当备库宕机恢复后处于再同步期间,如果发生failover时,可能会丢失部分数据。
c)最大性能
这种模式保证主库性能最大化,主备库之间数据是异步传输的。即主库日志归档以后才会传输到备用库。
随手分享,点个“在看”,为老司机加个油!




