写点什么

8.1 文件与磁盘 IO: 如何把磁盘的读写速度提升十万倍?

用户头像
张荣召
关注
发布于: 2020 年 11 月 16 日

1.机械磁盘

       连续读写能力强,随机读取能力弱。

2.固态磁盘

       比机械磁盘读写能力高出一个数量级。

       连续读写能力强,随机读取能力弱。

3.B+



解析:场景:数据库存储==数据存储在文件中,文件存储在磁盘上==>传统数据库使用B+树方式存储。

          B+树==>排序树(索引树)==>每个节点存储文件块。 每个磁盘块存储多个数据。多个磁盘块构成B+树。

          如图所示:

          1.(X<17)=====>p1指针

          2. (17<X<35)==>p2指针

          3.(X>35)=====>p3指针           

         查找数据方法:二分查找法==>对应的指针查找数据范围。

         每次读取一个磁盘块==>然后在磁盘块内查找==>找到对应的指针==>再去查找指针对应的磁盘块。

         如果树的深度为4,3次查找就可以找到叶子节点。

优点:连续读写能力强

缺点:随机读写能力弱。如果树的深度为4,需要3次查找找到叶子节点。如果3个磁盘块离散存储,每次读取磁盘块的时候,都需要移动磁臂。

          移动磁臂需要几毫秒时间。然后读取数据,几千万数据中查找数据需要几毫秒时间。======>读性能比较差。

          写,需要先查找,确定数据写入的位置,需要先查询B+树。写的性能比较差。

问题:离散随机读写,导致性能差。

解决方法:尽量避免离散随机读写。尽量顺序连续读写。

4.LSM树=Log Structure Merge

       尽量顺序读写。Log:连续的数据结构。





5.文件控制块(File Control Block)

     文件系统将磁盘空间以块为单位进行划分,每个文件占据若干个块,然后在通过一个文件控制块FCB记录每个文件占据的磁盘数据块。





6.Linux Inode文件控制块

  • inode中记录着文件权限,所有者,修改时间,文件大小等文件属性信息,以及文件数据块磁盘地址索引。

  • inode是固定结构的,能够记录的磁盘地址索引数也是固定的,只有15个索引。

  • 每个inode最多可以存储12+256+256*256+256*256*256个数据块,如果每个数据块的大小为4K,也就是单个文件最大不超过70G。

      缺点:索引越多,访问路径越长,读取数据块的速度越慢。

      问题:如何提高文件的读写速度?

      分析:单个硬盘读写速度比较慢,能不能把多个硬盘同时数据读写?多个硬盘组成一个阵列,共同对操作系统提供服务。

              写入时,可以在多个硬盘上同时写入。写入速度就提高,性能提升。通过磁盘阵列,同时读写,提升性能-RAID-独立磁盘冗余阵列。



7.RAID独立硬盘冗余阵列

解析:  RAID:目的:组成磁盘阵列,同时读写,提高读写性能。

            比如:一个文件分成8份,8份写入8个磁盘,同时写入,写入性能提升8倍。8个磁盘同时读,读性能提升8倍。 8个磁盘组成磁盘阵列-RAID

RAID 0 :多磁盘同时读写。如图 RAID0:三个磁盘,每个磁盘均分3份。一个Data文件分成四份,对三个磁盘同时读写。性能提升2倍。

                ----D/a/t三份同时写入三个磁盘需要一个单位时间,a写入需要一个单位时间。

                ----最后数据a,写入需要一个单位时间。 d/a/t/a四份数据写入三个磁盘,总共需要两个单位时间。

                ----d/a/t/a四份数据顺序写入一个磁盘,需要4个单位时间。

                ==>性能提升比例:4单位时间/2单位时间=2倍。

                优点:提升数据读写性能。

                缺点:数据安全性降低。比如:一个文件四份数据,写入三个磁盘,其中一个磁盘损坏,则四份数据无法完成读取,导致整个文件损坏,整体数据不可用,相当于其他两个磁盘的数据也不可用。数据安全性降低。单个磁盘的使用寿命为1年,RAID0磁盘阵列使用寿命更短。

假设:单块磁盘的损坏概率为1年内50%, 正常使用概率50%,  整体损坏概率=1-三个磁盘正常概率=1-50%*50%*50%=87.5%。磁盘阵列的可用性=12.5%,整个系统的可用性=12.5%. 系统可用性急剧降低。==>数据安全性得不到保证。生产环境很少使用。

RAID 1:目的:解决RAID0数据安全性降低的问题,增强数据安全性。采用备份数据策略。

               数据同时写入两块磁盘,互为完整备份。如果磁盘1损坏,磁盘2数据还在,还可以提供完整数据对外提供服务。

               ==>提升了数据安全性。

               优点:极大提升了数据安全性。

               缺点:性能降低。

               问题:怎么保证数据安全性?又要保证读写性能?

               分析:RAID0优点,读写性能高; RAID1数据安全性高。结合两种方案的优点:RAID 10

RAID 10:磁盘阵列分组,写入时,每个分组数据再做一次备份。

                 比如:8个磁盘组成阵列。每2个磁盘一组,共4组。数据分4片,每片都有自己的备份。====>读写性能提升4倍。

                 每片数据都有自己的备份====>提升了数据可用性

                 优点:高性能,高可用。

                 缺点:磁盘浪费。磁盘空间有效利用率=50%。比如:8T磁盘空间。真实有效数据4T,另外4T备份数据。

                 问题:在高性能,高可用的前提下,如何提高磁盘利用率?

                 分析:数据校验。

RAID 5:  业界使用比较广泛。

                 多个数据计算一个校验位。记录校验位。

                 比如:8块磁盘,数据分成7片,存储在7个不同磁盘上,第8个磁盘不记录数据,记录前7片数据的校验信息。

                 任何一个磁盘损坏,通过校验信息和其他6个磁盘数据信息,可以计算出损坏数据,以便恢复。

                 数据分7片================>提升磁盘利用率

                  7片数据同时读写,性能提升7倍===>高性能。

                 数据通过校验恢复============>高可用。

                 校验算法:异或。 0,1异或。

                 如何得到校验位?====>7片数据"异或"操作等到结果====>校验位。

                 损失数据:校验位,异或,其他6片数据,得到损失数据。

                 实际存储,校验位螺旋存储在所有磁盘上。

                 缺点:如果两块硬盘损坏,不能通过校验恢复。

RAID 6:  目的:如果损坏两块磁盘,仍然可以恢复。

                 方法:记录两个校验信息。

                 比如:8块盘,6块写数据,2块写校验信息。

                 读写速度降低一点,可用性提高一点。



RAID 类型                                           访问速度                                数据可靠性                  磁盘利用率

RAID0                                                很快                                          很低                         100%

RAID1                                                很慢                                          很高                          50%

RAID10                                              很高                                          很高                          50%

RAID5                                                较快                                          较高                         (N-1)/N

RAID6                                                较快                                          较(RAID5)高         (N-2)/N



RAID在单台服务器上,增强磁盘阵列。如果要达到T级别的吞吐能力,单台服务器不能提供这么大的读写能力。

要解决T级别的磁盘吞吐能力,要使用分布式文件系统HDFS。

8.分布式文件系统HDFS

解析: 分布式文件系统核心思路:数据分片存储在多个服务器上。(RAID   VS   HDFS)。

           RAID:以磁盘为单位记录数据分片。

           HDFS:以服务器为单位记录数据分片。

           一个大文件被切分成很多片,这些数据片分布存储在多个服务器上。每个服务器可以并发读写操作。服务器越多,读写性能就越高,整个系统性能提升上百倍千倍。

           NameNode:文件控制块---记录文件信息(文件数据的分片信息)

           原理:Linux的INode文件控制块类似。

           DataNode:数据块。每块64M。

           数据可用性:复制。数据复制三份到不同的服务器上。跨机架复制。

           空间利用率比较低。

           宕机失效检测:DataNode1->心跳检测->NameNode。NameNode长时间没有收到DataNode1的心跳检测,标记失效。

                                   数据备份<3份,可用性降低。丢失的数据重新复制到其他服务器上。保持数据的高可用。 NameNode记录DataNode上所有的数据块ID。然后检查这些数据块ID还在哪些服务器上存储,找到数据块后,然后复制数据到其他服务器上。



用户头像

张荣召

关注

还未添加个人签名 2018.05.02 加入

还未添加个人简介

评论

发布
暂无评论
8.1文件与磁盘IO:如何把磁盘的读写速度提升十万倍?