RAID是“Redundant Array of Independent Disk”的缩写,中文意思是独立冗余磁盘阵列。冗余磁盘阵列技术诞生于1987年,由美国加州大学伯克利分校提出,是单机时代拓展硬盘容量的主流方式;GFS(Google File System)是Google研发的可伸缩、高可用、高可靠的分布式文件系统,是Google三篇分布式计算论文中的“第一辆马车”,2006年基于GFS的分布式存储系统HDFS正式诞生,RAID落幕,HDFS逐渐成长为大数据存储领域事实上的标准和王者。
1.如何存储大量数据
随着计算机行业和互联网行业的发展,数据存储的量级也越发庞大,企业往往需要收集各类用户行为、操作以及日志数据,以达到数据分析、商品推荐和构建用户画像等目的,而这其中就无法避免一个现实的问题:数据量越来越大,如何存储?
从一个典型的现实问题着手:假如现在有1TB的文件需要存储,而一台服务器只有500GB的磁盘空间,那么应该如何存储?
显然,如果不做其他额外的处理的话,1TB文件绝对无法存储在一台只有500GB磁盘空间的服务器,这时候解决的办法有两种办法。
第一种方式是拓展服务器的磁盘容量,我们可以在服务器中多安装一块500GB的磁盘,这样就可以容纳1TB的文件了。
第二种方式是新增多台服务器,利用这些服务器组成一个集群共同来承载这个文件。
这两个思路就是RAID和HDFS诞生的雏形了,实际上RAID的解决方式是垂直拓展,通过对硬件的不断升级来支持更大的存储,而HDFS的解决方式是水平拓展,通过多个服务器共同组成集群来对外提供存储能力,分散存储内容。
无论是RAID还是HDFS,大数据的存储系统都需要解决三个核心的痛点问题,总结如下。
1.数据存储容量的问题:大数据要解决的是数以 PB 计的数据计算问题,而一般的服务器磁盘容量通常 1~2TB,应该如何设计以存储如此大的数据量?
2.数据读写速度的问题:一般磁盘的连续读写速度为几十 MB,以这样的速度读取数PB的数据根本不现实,慢得无法接受啊?
3.数据可靠性的问题:磁盘大约是计算机设备中最易损坏的硬件了,通常情况一块磁盘使用寿命大概是一年,如果磁盘损坏了,数据如何保障不丢失?
2.RAID原理与分类
RAID(独立磁盘冗余阵列)技术是将多块普通磁盘组成一个阵列,共同对外提供服务。主要是为了改善磁盘的存储容量、读写速度,增强磁盘的可用性和容错能力。在 RAID 之前,要使用大容量、高可用、高速访问的存储系统需要专门的存储设备,这类设备价格要比 RAID 的几块普通磁盘贵几十倍。
RAID的基本原理是水平拓展,就像上文说道的,服务器上的磁盘为500GB,要容纳1TB的文件,那么在该服务器的基础上上新增一块500GB的磁盘,使用RAID技术将其构建在一起,形成一个整体的逻辑磁盘,共同对外提供服务,那么就可以解决这个问题。
RAID根据不同的实现方式可以分为许多类,RAID被广泛使用的实现分类有RAID 0、RAID 1、 RAID 10、 RAID 5及RAID 6。首先假设服务器有N块磁盘,现在需要将这N块磁盘构建为RAID系统对外提供存储服务,以下是这几种实现方式的实现原理。
RAID 0的实现方式是数据在从内存缓冲区写入磁盘时将数据分成N份,这些数据同时并行写入N块磁盘,使得数据整体写入速度是一块磁盘的N。读取的时候也一样,并行地从N块磁盘中读取数据。因此RAID 0 具有极快的数据读写速度。
RAID 0的缺点是没有容错机制,假如N块磁盘中有一块磁盘损坏,那么就会导致数据丢失,造成数据完整性的破坏,从而导致RAID系统不可用。
为了避免磁盘损坏而导致的数据丢失问题,RAID 1的实现方式是在数据在从内存缓冲区写入磁盘时将数据同时全量写入两块磁盘中,这样就可以冗余出一块磁盘,当磁盘中的任意一块损坏时,都可以从另一块磁盘中获取到完整的备份数据,极大地提高了可用性。
RAID 1方案的缺点是读写效率较低,并且磁盘使用空间只为50%,会造成较大的存储资源浪费。
RAID 10方案基于RAID 0和RAID 1结合而成,也就是在数据从内存缓冲区写入磁盘时,将数据划分为N/2份,分别写入到N/2块磁盘中,也就是RAID 1的同时写入冗余机制,并且对于自身的那份N/2块磁盘的写入并不是全量写,而是再次划分,分片并行写入这N/2块磁盘,也就是采用了RAID 0的分片并行写入机制。这样就可以同时具备RAID 0分片并行读写的效率以及RAID 1的高可用性。
RAID 10方案的缺点是,仍然有N/2块磁盘冗余,磁盘空间使用率为50%。
RAID 5至少需要三个硬盘,RAID 5不是对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成RAID 5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。
当RAID 5的一个磁盘数据发生损坏后,可以利用剩下N-1块磁盘的数据和相应的奇偶校验信息去恢复被损坏的数据。RAID 5可以理解为是RAID 0和RAID 1的折衷方案。RAID 5可以为系统提供数据安全保障,但保障程度要比冗余备份低而磁盘空间利用率要比冗余备份高。RAID 5具有和RAID 0相近似的数据读取速度,只是因为多了一个奇偶校验信息。
RAID 6和RAID 5多增加了一块磁盘存储校验信息,可以允许两块磁盘失效,并且从其余N-2块磁盘中恢复完整数据。
RAID 5和RAID 6的磁盘空间使用率分为为(N-1)/N和(N-2)/N,其读写效率和RAID 0几乎一样高效,并且较强的数据完整性恢复能力,是目前被广泛使用的RAID方案。
RAID不同方案的实现特性如图所示,从RAID的原理可以看出RAID是如何解决大数据存储的三个问题的:
1.通过多块磁盘的组合和冗余,使得服务器对外提供的存储量更大。
- 通过并行的分片读写来优化读写效率。
3.通过磁盘备份和奇偶校验信息,来保障数据的完整性和可靠性。
3.HDFS原理与容错机制
在计算机发展的早期,拜摩尔定律所赐,每 18 个月计算机的处理能力提升一倍,服务器存储容量小,那么就增加磁盘,以提供更大的容量,这也是RAID诞生的背景。
但是到了互联网时代,这种垂直伸缩的路子走不通了,需要存储的数据量膨胀到了PB量级,即使是世界上最强大的超级计算机也无法满足其对计算资源的需求。
垂直伸缩总有尽头,而水平伸缩理论上来说是无尽的,在一个系统中不断添加服务器,以满足不断增长的用户和数据对计算资源的需求。基于RAID的服务器分片并行读写思想和冗余备份思想,HDFS横空出世。
HDFS全称为Hadoop Distributed File System,即为Hadoop提供的分布式文件系统,Hadoop底层的存储能力都是基于HDFS来提供,所以认为HDFS是整个Hadoop体系的底层核心基石。
HDFS的特点是采用了低成本的硬件设计模式,具备很高的容错性,可以部署在价格低廉的普通服务器上,通过多台服务器组成HDFS集群从而提供分布式存储的能力。
和 RAID 在多个磁盘上进行文件存储及并行读写的思路一样,HDFS 是在一个大规模分布式服务器集群上,对数据分片后进行并行读写及冗余存储。因为 HDFS 可以部署在一个比较大的服务器集群上,集群中所有服务器的磁盘都可供 HDFS 使用,所以整个 HDFS 的存储空间可以达到 PB 级容量。
HDFS的核心架构组件图如下,主要分为Client、NameNode、SecondaryNameNode、DataNode这四个核心组件。
DataNode负责文件数据的存储和读写操作,HDFS将文件数据分割成若干数据块(Block,早期版本为64MB,hadoop 2.0之后为128MB),每个 DataNode 存储一部分数据块,这样文件就分布存储在整个 HDFS 服务器集群中。
应用程序客户端(Client)可以并行对这些数据块进行访问,从而使得 HDFS 可以在服务器集群规模上实现数据并行访问,极大地提高了访问速度。在实践中,HDFS 集群的 DataNode 服务器会有很多台,一般在几百台到几千台这样的规模,每台服务器配有数块磁盘,整个集群的存储容量大概在几 PB 到数百 PB。
NameNode负责整个分布式文件系统的元数据(MetaData)管理,也就是文件路径名、数据块的 ID 以及存储位置等信息,相当于操作系统中文件分配表(FAT)的角色。HDFS 为了保证数据的高可用,会将一个数据块复制为多份(缺省情况为 3 份),并将多份相同的数据块存储在不同的服务器上,甚至不同的机架上。这样当有磁盘损坏,或者某个 DataNode 服务器宕机,甚至某个交换机宕机,导致其存储的数据块不能访问的时候,客户端会查找其备份的数据块进行访问。
借助RAID的思想,HDFS将数据分成若干数据块后存储到不同服务器上,可以实现数据大容量存储,并且不同分片的数据可以分片并行进行读 / 写操作,进而实现数据的高速访问。解决了数据存储量级的读写效率问题后,HDFS通过以下措施来保障集群数据的完整性和容错:
1.磁盘数据完整性校验
磁盘介质在存储过程中受环境或者老化影响,其存储的数据可能会出现错乱。HDFS的应对措施是,对于存储在DataNode上的数据块,计算并存储校验和(CheckSum)。在读取数据的时候,重新计算读取出来的数据的校验和,如果校验不正确就抛出异常,应用程序捕获异常后就到其他DataNode上读取备份数据。
2. 磁盘故障检测校验
DataNode 监测到本机的某块磁盘损坏,就将该块磁盘上存储的所有 BlockID 报告给 NameNode,NameNode 检查这些数据块还在哪些 DataNode 上有备份,通知相应的 DataNode 服务器将对应的数据块复制到其他服务器上,以保证数据块的备份数满足要求。
3.DataNode心跳检验
DataNode会通过心跳和NameNode保持通信,如果DataNode超时未发送心跳,NameNode就会认为这个DataNode已经宕机失效,立即查找这个DataNode存储的数据块有哪些,以及这些数据块还存储在哪些服务器上,随后通知这些服务器再复制一份数据块到其他服务器上,保证HDFS存储的数据块备份数符合用户设置的数目,即使再出现服务器宕机,也不会丢失数据。
4.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.参考
- https://www.cnblogs.com/meet/p/5435979.html
- https://time.geekbang.org/column/article/65366
- http://www.solgle.com/news/340.html
- https://zh.wikipedia.org/wiki/RAID
- https://zh.wikipedia.org/wiki/Apache_Hadoop
- https://blog.csdn.net/shelldon/article/details/54144730
|