可能大家会问,oracle和HDFS属于不同场景的存储系统,它们之间为什么会有联系呢?确实,从技术本身来看,他们确实无关联,但利用“整体学习”的思想,跳出技术本身,可以发现Oracle的缓冲区和HDFS的edit logs都是为了解决频繁IO而出现的,可以解决因频繁读写磁盘而导致性能低的问题。如下图所示:

一、Oracle的缓冲区机制

Oracle的缓冲区主要有两种:数据库缓冲区缓存(data buffer cache,后面简称DB chche)和日志缓冲区(redo log)(对oracle实例内存结构感兴趣的同学可自行百度,此处不再过多介绍)。

1.数据库缓冲区缓存(DB Cache)

DB Cache是执行SQL的工作区域,用户会话所有操作数据都是在此缓存中进行,而不是直接操作磁盘。举例来说,当执行select操作时,会先查找DB Cache,如果找到,则直接返回,如果未找到,会再从磁盘加载数据到DB Cache中来,然后再返回。再举个例子,当执行update操作时,其实也只是更新了DB Cache中的数据。如果DB Cache中数据和磁盘中数据不一致,则称此数据为脏数据。

那么DB Cache的脏数据往磁盘中写入的机制是怎样的呢?Oracle中为此专门有一个数据库写入器的后台进程DBWn,会把DB Cache中的数据写入到磁盘中,当出现以下情况之一时,DBWn会执行写入磁盘操作:

1)没有任何可用DB Cache;

2)脏数据过多;

3)到达3秒的超时时间;

4)遇到checkpoint;

可以看到,DBWn这样写入方式是极懒的,目的就是为了减少IO。

2.日志缓冲区

日志缓冲区是一块小的内存区域,用于存储重做日志文件中的变更向量。当数据库出现故障,导致大量脏数据未来得及写入磁盘时,会根据重做日志文件进行恢复(注意:重做redo和撤销undo是有区别的,不要混淆)。与DBWn一样,重做日志缓冲区也有专门的后台进程LGWR,进行磁盘的写入操作,写入的时机有以下几种情况:

1)commit操作(注意此commit,执行的是重做日志的写入磁盘操作,而不是DB Cache的写入磁盘操作);

2)日志缓冲区已用超过1/3;

3)DBWn要写入脏数据(可以想想为什么要这样?原因就在于DBWn可能会将未提交的事务数据写入到磁盘,为了保证这些已写入磁盘的数据可以进行回滚,所以必须也要把对应的重做日志也写入到磁盘中去,其实就是为了事务回滚用的);

综上,这两类缓冲区都是为了最大限度的减少IO而出现的机制。

二、HDFS的edit logs

熟悉HDFS namenode启动过程的同学们应该知道,在HDFS namenode启动时,会把fsimage和edit logs加载到namenode的内存中,当namenode需要重启时,会先把内存中的fsimage与edit logs合并写入磁盘后,再重复执行上面的操作(此处edit logs可以认为是namenode的缓冲区,类似于oracle的缓冲区,只是一般不会轻易写磁盘)。因此就会面临如下的问题:

1)当edit logs文件很大时,则namenode的重启时间会过长;

2)当namenode意外挂掉时,则eidt logs会丢失很多改动;

此时,Secondary namenode就出现了,可以通过定时查询edit logs,然后将edit logs更新到fsimage,再由secondary namenode将更新后的fsimage写入到namenode磁盘,以便下次重启时使用。当然随着Hadoop 2.0以后HA的出现,secondary namenode也被其它HA方案替代了,后面有机会再深入介绍。

综上,oracle的缓冲区与hdfs中的edit logs类似,都是为了防止IO影响性能而出现的,只是写入磁盘的机制不同,但思想可以认为是一致的。

关于oracle的缓冲区机制与HDFS中的edit logs的某些关联性的思考的更多相关文章

  1. HDFS中NameNode管理元数据机制

    NameNode职责 响应客户端请求 维护目录树 管理元数据(查询,修改) HDFS元数据存储 内存中有一份完整的元数据(特定数据结构) 磁盘有一个“准完整”的元数据的镜像文件 当客户端对HDFS中的 ...

  2. Oracle Redo Log 机制 小结(转载)

    Oracle 的Redo 机制DB的一个重要机制,理解这个机制对DBA来说也是非常重要,之前的Blog里也林林散散的写了一些,前些日子看老白日记里也有说明,所以结合老白日记里的内容,对oracle 的 ...

  3. 2014年2月5日 Oracle ORACLE的工作机制[转]

      网上看到一篇描写ORACLE工作机制的文章,觉得很不错!特摘录了下来.   ORACLE的工作机制-1 (by xyf_tck) 我们从一个用户请求开始讲,ORACLE的简要的工作机制是怎样的,首 ...

  4. Linux0.11内核--缓冲区机制大致分析

    文件系统的文件太多,而且是照搬的MINIX的文件系统,不想继续分析下去了.缓冲区机制和文件系统密切相关,所以这里就简单分析一下缓冲区机制. buffer.c 程序用于对高速缓冲区(池)进行操作和管理. ...

  5. Android核心分析之二十五Android GDI之共享缓冲区机制

    Androird GDI之共享缓冲区机制 1  native_handle_t对private_handle_t 的包裹     private_handle_t是gralloc.so使用的本地缓冲区 ...

  6. 【Hadoop学习】HDFS中的集中化缓存管理

    Hadoop版本:2.6.0 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4146398.html 概述 ...

  7. oracle的resetlogs机制浅析

    oracle的resetlogs机制浅析 alter database open resetlogs 这个命令我想大家都很熟悉了,那有没有想过这个resetlogs选项为什么要用?什么时候用?它的原理 ...

  8. hadoop学习;大数据集在HDFS中存为单个文件;安装linux下eclipse出错解决;查看.class文件插件

    sudo apt-get install eclipse 安装后打开eclipse,提示出错 An error has occurred. See the log file /home/pengeor ...

  9. 使用sqoop往hdfs中导入数据供hive使用

    sqoop import -fs hdfs://x.x.x.x:8020 -jt local --connect "jdbc:oracle:thin:@x.x.x.x:1521:testdb ...

随机推荐

  1. crontab使用环境变量

    两种方式: 1)直接在crontab中定义变量,如: A=123 * * * * * echo $A > /tmp/a.txt 注意在定义变量时不能使用$引用其它变量,如下面的做法错误: A=1 ...

  2. 1057 Stack 树状数组

    Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...

  3. android-基础编程-ListView

    ListView主要包括view和数据源.其数据适配器列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter. ListView的没有oom原因.经 ...

  4. kepware http接口 Objective-C开发

    读取某变量的值(NSURL #import <Foundation/Foundation.h> NSDictionary *headers = @{ @"Connection&q ...

  5. 8.css内容移出与精灵图

    定位的盒子居中显示 ★:margin:0 auto;  只能让标准流的盒子居中对齐. ★定位的盒子居中:先左右走父元素盒子的一半50%,在向左走子盒子的一半(margin-left:负值.) 标签包含 ...

  6. Android-Could not find method implementation() for arguments

    当AndroidStudio加载工程的时候:报以下错误: 详细错误: Could not find method implementation() for arguments [file collec ...

  7. 微信小游戏canvas操作

    这几天在做项目的时候,想在游戏画面之前,在Canvas上面画上一张背景图,代码如下     let ctx = canvas.getContext('2d')    export default cl ...

  8. WebAPI中发送字节数组

    今天工作中遇到了一个情景: 前端向后台发送一个请求,希望后台返回一组数据,由于后台返回的数据量很大,希望尽可能压缩响应的大小 我的想法:后台将数据(Short的数组)直接转换成Byte[]  然后将b ...

  9. ModelValidator基于元数据的验证

    ModelValidator主要是应用在ModelMetadata元数据的类型上或类型属性上.它是验证的基础类型,所有的ModelValidatorProviders.DataAnnotationVa ...

  10. Android---------------解决bug的关键点

    一.抛出异常,打出异常的的堆信息 System.err.print("ceshi");      e.printStackTrace();     Log.i("cesh ...