转载

转自 极客时间 从零开始学大数据 李智慧 文章, 我学完了做了个笔记总结了一下

如果一个文件的大小超过了一张磁盘的大小,你该如何存储?

单机时代,主要的解决方案是RAID;分布式时代,主要解决方案是分布式文件系统

无论是在单机时代还是分布式时代,大规模数据存储都需要解决几个核心问题

1.数据存储容量的问题。既然大数据要解决的是数以PB计的数据计算问题,而一般的服务器磁盘容量通常1~2TB,那么如何存储这么大规模的数据呢?
2.数据读写速度的问题。一般磁盘的连续读写速度为几十MB,以这样的速度,几十PB的数据恐怕要读写到天荒地老。
3.数据可靠性的问题。磁盘大约是计算机设备中最易损坏的硬件了,通常情况一块磁盘使用寿命大概是一年,如果磁盘损坏了,数据怎么办?

RAID技术

在大数据技术出现之前,我们就需要面对这些关于存储的问题,对应的解决方案就是RAID技术。
RAID(独立磁盘冗余阵列)技术是将多块普通磁盘组成一个阵列,共同对外提供服务。主要是为了改善磁盘的存储容量、读写速度,增强磁盘的可用性和容错能力。在RAID之前,要使用大容量、高可用、高速访问的存储系统需要专门的存储设备,这类设备价格要比RAID的几块普通磁盘贵几十倍。RAID刚出来的时候给我们的感觉像是一种黑科技,但其原理却不复杂,下面我慢慢道来。

目前服务器级别的计算机都支持插入多块磁盘(8块或者更多),通过使用RAID技术,实现数据在多块磁盘上的并发读写和数据备份。

RAID 0

首先,我们先假设服务器有N块磁盘,RAID 0是数据在从内存缓冲区写入磁盘时,根据磁盘数量将数据分成N份,这些数据同时并发写入N块磁盘,使得数据整体写入速度是一块磁盘的N倍;读取的时候也一样,因此RAID 0具有极快的数据读写速度。但是RAID 0不做数据备份,N块磁盘中只要有一块损坏,数据完整性就被破坏,其他磁盘的数据也都无法使用了。

RAID 1

RAID 1是数据在写入磁盘时,将一份数据同时写入两块磁盘,这样任何一块磁盘损坏都不会导致数据丢失,插入一块新磁盘就可以通过复制数据的方式自动修复,具有极高的可靠性。

RAID 10

结合RAID 0和RAID 1两种方案构成了RAID 10,它是将所有磁盘N平均分成两份,数据同时在两份磁盘写入,相当于RAID 1;但是平分成两份,在每一份磁盘(也就是N/2块磁盘)里面,利用RAID 0技术并发读写,这样既提高可靠性又改善性能。不过RAID 10的磁盘利用率较低,有一半的磁盘用来写备份数据。
一般情况下,一台服务器上很少出现同时损坏两块磁盘的情况,在只损坏一块磁盘的情况下,如果能利用其他磁盘的数据恢复损坏磁盘的数据,这样在保证可靠性和性能的同时,磁盘利用率也得到大幅提升。

RAID 3

顺着这个思路,RAID 3可以在数据写入磁盘的时候,将数据分成N-1份,并发写入N-1块磁盘,并在第N块磁盘记录校验数据,这样任何一块磁盘损坏(包括校验数据磁盘),都可以利用其他N-1块磁盘的数据修复。
但是在数据修改较多的场景中,任何磁盘数据的修改,都会导致第N块磁盘重写校验数据。频繁写入的后果是第N块磁盘比其他磁盘更容易损坏,需要频繁更换,所以RAID 3很少在实践中使用,因此在上面图中也就没有单独列出。

RAID 5

相比RAID 3,RAID 5是使用更多的方案。RAID 5和RAID 3很相似,但是校验数据不是写入第N块磁盘,而是螺旋式地写入所有磁盘中。这样校验数据的修改也被平均到所有磁盘上,避免RAID 3频繁写坏一块磁盘的情况。
如果数据需要很高的可靠性,在出现同时损坏两块磁盘的情况下(或者运维管理水平比较落后,坏了一块磁盘但是迟迟没有更换,导致又坏了一块磁盘),仍然需要修复数据,这时候可以使用RAID 6。

RAID 6

RAID 6和RAID 5类似,但是数据只写入N-2块磁盘,并螺旋式地在两块磁盘中写入校验信息(使用不同算法生成)。

各个RAID技术的比较

RAID技术有硬件实现,比如专用的RAID卡或者主板直接支持;也可以通过软件实现,在操作系统层面将多块磁盘组成RAID,从逻辑上视作一个访问目录。RAID技术在传统关系数据库及文件系统中应用比较广泛,是改善计算机存储特性的重要手段。

RAID是如何解决关于存储的三个关键问题

1.数据存储容量的问题。RAID使用了N块磁盘构成一个存储阵列,如果使用RAID 5,数据就可以存储在N-1块磁盘上,这样将存储空间扩大了N-1倍。
2.数据读写速度的问题。RAID根据可以使用的磁盘数量,将待写入的数据分成多片,并发同时向多块磁盘进行写入,显然写入的速度可以得到明显提高;同理,读取速度也可以得到明显提高。不过,需要注意的是,由于传统机械磁盘的访问延迟主要来自于寻址时间,数据真正进行读写的时间可能只占据整个数据访问时间的一小部分,所以数据分片后对N块磁盘进行并发读写操作并不能将访问速度提高N倍。
3.数据可靠性的问题。使用RAID 10、RAID 5或者RAID 6方案的时候,由于数据有冗余存储,或者存储校验信息,所以当某块磁盘损坏的时候,可以通过其他磁盘上的数据和校验数据将丢失磁盘上的数据还原。

垂直伸缩和水平伸缩

在计算机领域,实现更强的计算能力和更大规模的数据存储有两种思路,一种是升级计算机,一种是用分布式系统。前一种也被称作“垂直伸缩”(scaling up),通过升级CPU、内存、磁盘等将一台计算机变得更强大;后一种是“水平伸缩”(scaling out),添加更多的计算机到系统中,从而实现更强大的计算能力。

在计算机发展的早期,我们获得更强大计算能力的手段主要依靠垂直伸缩。一方面拜摩尔定律所赐,每18个月计算机的处理能力提升一倍;另一方面由于不断研究新的计算机体系结构,小型机、中型机、大型机、超级计算机,不断刷新我们的认知。
但是到了互联网时代,这种垂直伸缩的路子走不通了,一方面是成本问题,互联网公司面对巨大的不确定性市场,无法为一个潜在的需要巨大计算资源的产品一下投入很多钱去购买大型计算机;另一方面,对于Google这样的公司和产品而言,即使是世界上最强大的超级计算机也无法满足其对计算资源的需求。
所以互联网公司走向了一条新的道路:水平伸缩,在一个系统中不断添加计算机,以满足不断增长的用户和数据对计算资源的需求。这就是最近十几年引导技术潮流的分布式与大数据技术。
RAID可以看作是一种垂直伸缩,一台计算机集成更多的磁盘实现数据更大规模、更安全可靠的存储以及更快的访问速度。而HDFS则是水平伸缩,通过添加更多的服务器实现数据更大、更快、更安全存储与访问。
RAID技术只是在单台服务器的多块磁盘上组成阵列,大数据需要更大规模的存储空间和更快的访问速度。将RAID思想原理应用到分布式服务器集群上,就形成了Hadoop分布式文件系统HDFS的架构思想。

如果一个文件的大小超过了一张磁盘的大小,你该如何存储?相关推荐

  1. 查找磁盘占用最大的文件linux,linux查找系统中占用磁盘空间最大的文件

    Q:下午有一客户磁盘空间占用很大,使用df查看磁盘剩余空间很小了,客户想知道是哪些文件占满了文件. Q1:在Linux下如何查看系统占用磁盘空间最大的文件? Q2:在Linux下如何让文件夹下的文件让 ...

  2. Ubuntu双系统扩大/home磁盘空间大小,gparted移动磁盘位置及大小

    前言: 笔者之前试过挂载磁盘的方法,后开觉得不方便,于是决定用U盘启动盘来扩大空间,花了几个小时终于搞清楚了整个流程,其中在gparted移动磁盘位置的地方卡了很长时间,相关的教程也较少,所以汇总了一 ...

  3. PHP上传视频超出大小,你指定要上传的文件或文件大小超过限制解决方法

    今天在给一个VIP学员解决网站的问题,网站是用dedecms织梦做的,问题是:上传图片的时候,提示"你指定要上传的文件或文件大小超过限制"如下图所示: 问题分析: 可能1.自己本身 ...

  4. matlab读取一个文件的图片大小,Matlab读取文件夹中子文件夹中的图片并修改尺寸...

    今天被师兄问到如何利用matlab批处理图片,觉得很简单嘛 就让他去百度 结果只百度到处理文件夹中图片的程序 好吧 这里放上如何处理文件夹中子文件夹的图片 现状:在一个名为casia的文件夹中,里面有 ...

  5. linux dd命令参数及用法详解---用指定大小的块拷贝一个文件

    linux dd命令使用详解 dd 的主要选项: 指定数字的地方若以下列字符结尾乘以相应的数字: b=512, c=1, k=1024, w=2, xm=number m if=file 输入文件名, ...

  6. linux下限制一个文件夹大小的方法

    linux上有时由于一些特殊的用途,我们需要限制一个文件夹的大小.核心方法都是把需要限制的文件夹挂载在一个大小固定的分区上,下面有两种方法可以实现: 使用ramdisk linux可以把一部分内存mo ...

  7. cmd移动文件到另一个文件夹_Java 如何获得一个文件或文件夹的大小

    有时候我们需要知道一个文件的大小. 我们可以使用一些方法,比如说将文件读取成 InputStream,然后再使用 available() 获得长度就可以了. 我们也可以使用 FileUtils 来获得 ...

  8. 如何把一个文件压缩成几个固定大小的文件及解压缩

    简述: 本文简单介绍了WinRAR如何把一个文件压缩成几个固定大小的文件以及如何解压这几个文件. 1.压缩 1 > 鼠标选中待压缩文件-右键-添加到压缩文件. 2 > 在弹出的" ...

  9. fseek( fp, SEEK_SET, SEEK_END );的作用?以及如何获取一个文件的大小?

    目录         一.fseek(fp,SEEK_SET,SEEK_END);的作用? 1.offset表示文件指针的偏移量 2.whence表示偏移量的基准位置 二.如何获取一个文件的大小 一. ...

最新文章

  1. 【Java】数据结构之 顺序表(MyArrayList)
  2. T-SQL的高级查询详解(一)--函数的综合应用
  3. restful API 常用的四种方式
  4. [linux]wait详解
  5. GetLocalTime
  6. 把一个整形数组中重复的数字去掉 - 微软面试题
  7. 音视频编解码:NVIDIA Jetson Linux Multimedia API(总结)
  8. day9http协议
  9. 图片轮播html1001无标题,轮播图采用js、jquery实现无缝滚动和非无缝滚动的四种案例实现,兼容ie低版本浏览器...
  10. C#轻量级日志监控器EasyLogMonitor
  11. java中重载构造方法的例程_Java构造函数使用多种方法重载
  12. 当Eclipse出现“initializing java tooling has encountered a problem”的解决方法
  13. 2021认证杯(小美赛)思路分析
  14. 17 张程序员壁纸(使用频率很高)
  15. 脉冲计数器单片机c语言编程,基于单片机的光电计数器
  16. python urllib.parse_Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)...
  17. docker命令push,pull等设置代理
  18. e站app里站hosts_[装修记 天猫家装e站~大庆站]
  19. 剑指offer 从未到头打印列表
  20. Linux下获取cpu温度

热门文章

  1. “创新实践”项目介绍7:《看护服务机械狗》
  2. 正和岛“亿+计划”层层筛选 云适配6进1“过关斩将”
  3. Visio Studio Code 图标美化
  4. 余情未了用计算机弹,2018年职称计算机考试题库(7)
  5. 电气绕组服务市场现状研究分析-
  6. android设置theme红色主题,Android配置应用主题皮肤
  7. BAT大牛亲授基于ElasticSearch的搜房网实战(第四章环系统架构设计与分层)
  8. 一入侯门“深”似海,深度学习深几许(深度学习入门系列之一)
  9. OpenCV形状颜色识别Java,Android
  10. 百道java基础作业题