目录

  • 一. 提问:如果一个文件的大小超过了一张磁盘的大小,你该如何存储?
  • 二. 针对大规模数据储存要解决的三个核心问题
  • 三. 关于RAID
    • 1. 概念
    • 2. 目的
    • 3. 常用RAID技术
    • 4. RAID解决关于存储的三个关键问题
    • 5. 思考题
  • 四. 垂直伸缩与水平伸缩
    • 1.垂直伸缩(scaling up)
    • 2. 水平伸缩(scaling out)
  • 五. 关于HDFS
    • 1. 概念
    • 2. 设计目标
    • 3. HDFS架构图
    • 3. HDFS的高可用设计
    • 4. 常用的保证系统可用性的策略
      • a. 冗余备份
      • b. 失效转移
      • c. 降级限流

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

解答:

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

二. 针对大规模数据储存要解决的三个核心问题

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

三. 关于RAID

1. 概念

RAID(独立磁盘冗余阵列)技术是将多块普通磁盘组成一个阵列,共同对外提供服务。

2. 目的

  • 主要是为了改善磁盘的存储容量、读写速度、增强磁盘的可用性和容错能力;
  • 在 RAID 之前,要使用大容量、高可用、高速访问的存储系统需要专门的存储设备,这类设备价格要比 RAID 的几块普通磁盘贵几十倍。
  • 目前服务器级别的计算机都支持插入多块磁盘(8 块或者更多),通过使用 RAID 技术,实现数据在多块磁盘上的并发读写和数据备份。

3. 常用RAID技术


假设服务器有N块磁盘

  1. RAID0:N块磁盘数据分N片存储,并发写入和读取,读取和写入效率高但是不容许磁盘损坏;
  2. RAID1: N块磁盘分N/2片用于存储,而另外一半用于作备份冗余,提升了稳定性,但是写入效率低,浪费N/2片存储空间 ;
  3. RAID10: 结合RAID1和RAID0两种方案,N/2片用于分片存储,另外N/2片用于备份,读写效率中等,具备一定稳定性,浪费N/2片存储空间;
  4. RAID5: 改善RAID10的存储浪费,N-1片采用分片存储,第N片用于存储其他N-1片数据的校验和,任何一片发生损坏,都可以通过其他片进行数据校验恢复 ;
  5. RAID6: 在RAID5的基础上新增多一片用于存储校验和,N-2片用于存储,避免两片同时发生损坏的情况 ;
  6. RAID 3 可以在数据写入磁盘的时候,将数据分成 N-1 份,并发写入 N-1 块磁盘,并在第 N 块磁盘记录校验数据,这样任何一块磁盘损坏(包括校验数据磁盘),都可以利用其他 N-1 块磁盘的数据修复。
    但是在数据修改较多的场景中,任何磁盘数据的修改,都会导致第 N 块磁盘重写校验数据。
    频繁写入的后果是第 N 块磁盘比其他磁盘更容易损坏,需要频繁更换,所以 RAID 3 很少在实践中使用,因此在上面图中也就没有单独列出。
    相比 RAID 3,RAID 5 是使用更多的方案。RAID 5 和 RAID 3 很相似,但是校验数据不是写入第 N 块磁盘,而是螺旋式地写入所有磁盘中。这样校验数据的修改也被平均到所有磁盘上,避免 RAID 3 频繁写坏一块磁盘的情况。

从下面表格中你可以看到在相同磁盘数目(N)的情况下,各种 RAID 技术的比较。

4. RAID解决关于存储的三个关键问题

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

5. 思考题

传统机械磁盘进行数据连续写入的时候,比如磁盘以日志格式连续写入操作,其写入速度远远大于磁盘随机写入的速度,比如关系数据库连续更新若干条数据记录,你知道这是为什么吗?
解答
连续写入:写入只寻址一次,存储位置与逻辑位置相邻,不用多次寻址;
随机写入:每写入一次,便寻址一次,增加了磁盘的寻址时间;

四. 垂直伸缩与水平伸缩

1.垂直伸缩(scaling up)

  • 升级计算机,通过升级CPU、内存、磁盘等;
  • 在计算机发展早期,主要依靠垂直伸缩获得更强大的计算能力;
  • RAID是一种垂直伸缩,一台计算机集成更多的磁盘实现数据更大规模、更安全可靠的存储以及更快的访问速度;

2. 水平伸缩(scaling out)

  • 分布式系统,在一个系统中不断添加计算机,从而实现更强大的计算能力;
    以满足不断增长的用户与数据对计算资源的需求;
  • 在互联网大数据时代,大多数依靠水平伸缩获得更强大的计算能力;
  • HDFS是水平伸缩,通过添加更多的服务器实现数据更大、更快、更安全存储与访问;

五. 关于HDFS

1. 概念

  • Google“三驾马车”GFS(Google文件系统)、MapReduce、BigTable;
    Hadoop的第一个产品是HDFS,最早的大数据存储系统,可以说分布式文件存储是分布式计算的基础;
    HDFS也许不是最好的大数据存储技术,但依旧是最重要的大数据存储技术;

2. 设计目标

Hadoop分布式文件系统HDFS的设计目标是管理数以千计的服务器、数以万计的磁盘,将其当作单一的存储系统进行管理;
应用程序提供数以PB计的存储容量,让其像普通文件系统一样存储大规模文件数据。

3. HDFS架构图


HDFS关键组件:
DataNode、NameNode

  • DataNode负责文件数据的存储和读写操作,HDFS将文件数据分割为若干数据块(Block),每个DataNode存储一部分数据块,这样文件就分布存储在整个HDFS服务器集群中;
    应用程序客户端(Client)可以并行对这些数据块进行访问,从而使得 HDFS 可以在服务器集群规模上实现数据并行访问,极大地提高了访问速度。在实践中,HDFS 集群的 DataNode 服务器会有很多台,一般在几百台到几千台这样的规模,每台服务器配有数块磁盘,整个集群的存储容量大概在几 PB 到数百 PB。

  • NameNode 负责整个分布式文件系统的元数据(MetaData)管理,也就是文件路径名、数据块的 ID 以及存储位置等信息,相当于操作系统中文件分配表(FAT)的角色。
    HDFS 为了保证数据的高可用,会将一个数据块复制为多份(缺省情况为 3 份),并将多份相同的数据块存储在不同的服务器上,甚至不同的机架上。这样当有磁盘损坏,或者某个 DataNode 服务器宕机,甚至某个交换机宕机,导致其存储的数据块不能访问的时候,客户端会查找其备份的数据块进行访问。

3. HDFS的高可用设计

从不同层面分析

  • 数据存储故障容错
    磁盘介质在存储过程中受环境或老化影响,其存储的数据可能会出现错乱。
    HDFS对此类情况有以下解决方案:
    对于存储在DataNode上的数据块(block),计算并存储校验和(CheckSum),在读取数据时,重新计算读取出来的校验和并验证,若验证与存储的校验和不一致则抛出异常,应用程序捕获到异常后就回去其他的DataNode上读取备份好的数据;

  • 磁盘故障容错
    若DataNode检测到本机某块磁盘损坏,则将该磁盘上的BlockID报告给NameNode,NameNode会通过BlockID在其他DataNode上寻找备份数据,通知相应的 DataNode 服务器将对应的数据块复制到其他服务器上,以保证数据块的备份数满足要求。

  • NameNode故障容错
    NameNode 是整个 HDFS 的核心,记录着 HDFS 文件分配表信息,所有的文件路径和数据块存储信息都保存在 NameNode,如果 NameNode 故障,整个 HDFS 系统集群都无法使用;如果 NameNode 上记录的数据丢失,整个集群所有 DataNode 存储的数据也就没用了。所以,NameNode 高可用容错能力非常重要。NameNode 采用主从热备的方式提供高可用服务,请看下图。

    集群部署两台 NameNode 服务器,一台作为主服务器提供服务,一台作为从服务器进行热备,两台服务器通过 ZooKeeper 选举,主要是通过争夺 znode 锁资源,决定谁是主服务器。而 DataNode 则会向两个 NameNode 同时发送心跳数据,但是只有主 NameNode 才能向 DataNode 返回控制信息。正常运行期间,主从 NameNode 之间通过一个共享存储系统 shared edits 来同步文件系统的元数据信息。当主 NameNode 服务器宕机,从 NameNode 会通过 ZooKeeper 升级成为主服务器,并保证 HDFS 集群的元数据信息,也就是文件分配表信息完整一致。

4. 常用的保证系统可用性的策略

a. 冗余备份

任何程序、任何数据,都至少要有一个备份,也就是说程序至少要部署到两台服务器,数据至少要备份到另一台服务器上。此外,稍有规模的互联网企业都会建设多个数据中心,数据中心之间互相进行备份,用户请求可能会被分发到任何一个数据中心,即所谓的异地多活,在遭遇地域性的重大故障和自然灾害的时候,依然保证应用的高可用。

b. 失效转移

当要访问的程序或者数据无法访问时,需要将访问请求转移到备份的程序或者数据所在的服务器上,这也就是失效转移。失效转移你应该注意的是失效的鉴定,像 NameNode 这样主从服务器管理同一份数据的场景,如果从服务器错误地以为主服务器宕机而接管集群管理,会出现主从服务器一起对 DataNode 发送指令,进而导致集群混乱,也就是所谓的“脑裂”。这也是这类场景选举主服务器时,引入 ZooKeeper 的原因。

c. 降级限流

当大量的用户请求或者数据处理请求到达的时候,由于计算资源有限,可能无法处理如此大量的请求,进而导致资源耗尽,系统崩溃。这种情况下,可以拒绝部分请求,即进行限流
也可以关闭部分功能,降低资源消耗,即进行降级
限流是互联网应用的常备功能,因为超出负载能力的访问流量在何时会突然到来,你根本无法预料,所以必须提前做好准备,当遇到突发高峰流量时,就可以立即启动限流。而降级通常是为可预知的场景准备的,比如电商的“双十一”促销,为了保障促销活动期间应用的核心功能能够正常运行,比如下单功能,可以对系统进行降级处理,关闭部分非重要功能,比如商品评价功能。

大规模数据 | RAID | 垂直伸缩水平伸缩 | HDFS相关推荐

  1. SOA和微服务之间的区别(应用和数据的垂直拆分水平拆分)

    目录 引出问题 重要概念 垂直拆分 水平拆分 同步分层架构 异步分层架构 SOA是什么? 微服务是什么? 数据库拆分 写在最后 引出问题 互联网发展迅猛,互联网系统也由原来的单机服务逐步的演化为分布式 ...

  2. 从RAID看垂直伸缩到水平伸缩的演化

    learn from 从0开始学大数据(极客时间) 大规模数据存储问题: 容量问题,数据量超过磁盘容量 读写速度,磁盘读写慢 数据可靠性,磁盘寿命问题 RAID(独立磁盘冗余阵列) 是将多块普通磁盘组 ...

  3. 架构垂直伸缩和水平伸缩区别_简单的可伸缩图神经网络

    架构垂直伸缩和水平伸缩区别 巨型图上的深度学习 (Deep learning on giant graphs) TL;DR: One of the challenges that have so fa ...

  4. k8s HPA(HorizontalPodAutoscaler)-自动水平伸缩

    Horizontal Pod Autoscaling in Kubernetes 写在前面 我们平时部署web服务,当服务压力大撑不住的时候,我们会加机器(加钱):一般没有上容器编排是手动加的,临时加 ...

  5. 数据切分 垂直切分、垂直拆分与水平拆分的优缺点

    数据切分 垂直切分 关于数据库的水平切分和垂直切分的一些概念垂直拆分垂直拆分就是要把表按模块划分到不同数据库表中(当然原则还是不破坏第三范式),这种拆分在大型网站的演变过程中是很常见的.当一个网站还在 ...

  6. k8s Pod的自动水平伸缩(HPA)

    HPA(Horizontal Pod Autoscaler ) pod的自动水平伸缩 有了HPA,我们就不用为上面的问题而烦恼,HPA会帮我们自动完成pod的扩缩容. 当资源需求过高时,会自动创建出p ...

  7. mysql 数据表格切分_MySQL数据库垂直和水平切分

    replication的限制:一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时候,我们还是会面临到扩展瓶颈.数据切分(sharding):通过某种特定的条件,将我们存放在同一个数据库中 ...

  8. HPA 自动水平伸缩 POD

    ​ 前戏 我们知道,初始Pod的数量是可以设置的,同时业务也分流量高峰和低峰,那么怎么即能不过多的占用K8s的资源,又能在服务高峰时自动扩容pod的数量呢,在K8s上的答案是Horizontal Po ...

  9. 使用大规模数据注释和深度学习对具有人类水平性能的组织图像进行全细胞分割

    使用大规模数据注释和深度学习对具有人类水平性能的组织图像进行全细胞分割 摘要 绪论 Mesmer 2.1Mesmer是一种用于精确全细胞分割的深度学习算法 2.2Mesmer实现了人类级的分割性能 2 ...

  10. (python)深度学习 数据扩充 图片的水平、垂直以及水平垂直翻转

    深度学习中经常存在数据量不够的情况,所以需要对数据进行扩充,本文使用三种手段扩充数据,分别是图片的水平.垂直.水平垂直翻转.将图像扩充三倍. import os import cv2 import s ...

最新文章

  1. 荣之联“云桥OneBridge”让IT运维事半功倍
  2. Interview:算法岗位面试—2019秋招校园招聘—算法工程师【机器学习、深度学习(偏图像)】秋招感悟:初期阶段的傲娇→中期阶段的紧张→后期阶段的蜕变
  3. vim 文本一些行注释,替换
  4. 各位程序员兄弟姐妹,新年好!
  5. 46. 全排列/47. 全排列 II
  6. hql查询过滤器及相关聚合函数查询详解
  7. 如何避免大数据分析的失误
  8. C语言—— 符号函数
  9. OO系统分析员之路--用例分析系列(1)--什么是用例
  10. U3D教程多摄像机协同运行
  11. Win10开始菜单打不开怎么办?
  12. c语言报告对老师的致谢,论文对老师的致谢
  13. Python:实现sha1算法(附完整源码)
  14. 护眼灯作用大不大?Led护眼灯的好处都有什么
  15. 设计模式总结篇(为什么要学习设计模式,学习设计模式的好处)
  16. python提取txt关键内容_python爬取关键字所在行并输出到txt
  17. linux命令执行进度显示工具progress
  18. unity 中 c# 与 object-c 交互
  19. php上传图片并修改文件名
  20. 成员变量和局部变量的区别、方法的形参为类的情况及匿名对象、封装(private关键字)、this关键字、构造方法、static关键字

热门文章

  1. c语言1076素数,九度OJ 1076:N的阶乘 题解
  2. 单元测试总结反思_单元考试反思总结
  3. 计算机准备打印却没动静,打印机显示正在打印但是没反应怎么办?
  4. 【全网首发】电脑搜索不到部分WiFi怎么办?亲测有效!
  5. 用幻灯片征服全世界_NET为什么会征服世界NET很显然很像
  6. 【重识云原生】第六章容器基础6.4.10.3节——StatefulSet实操案例-部署WordPress 和 MySQL
  7. 重力加速度传感器角度输出
  8. 基于Qt、FFMpeg的音视频播放器设计二(FFMpeg视频处理)
  9. A.Busiest Computing Nodes
  10. 如何使用Python还原村上春树笔下经典的那句“我爱你像爱春天的小熊”