暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle高可用

编程二三事 2019-12-20
251

       最近整理了一下公司内部用到的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数据库类型

  1. 逻辑standby是通过接收primary数据库的redo log并转换成sql语句,然后在standby数据库上执行SQL语句实现同步。

  2. 物理standby是通过接收并应用primary数据库的redo log以及介质恢复的方式实现同步,不仅文件的物理结构相同,连块在磁盘上的存储位置都是一模一样。

3)服务

  1. 重做传输服务(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)最大性能

这种模式保证主库性能最大化,主备库之间数据是异步传输的。即主库日志归档以后才会传输到备用库。


 随手分享,点个“在看”,为老司机加个油!

文章转载自编程二三事,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论