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

小知识 莫名 来源:InfoQ 7个月前 (05-14) 478次浏览 0个评论 扫描二维码

1.机械磁盘

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

2.固态磁盘

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

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

3.B+

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

解析:场景:数据库存储==数据存储在文件中,文件存储在磁盘上==>传统数据库使用 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:连续的数据结构。

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

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

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

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

6.Linux Inode 文件控制块

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

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

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

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

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

7.RAID 独立硬盘冗余阵列

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

解析:  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

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

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

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

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

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

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

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

           DataNode:数据块。每块 64M。

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

           空间利用率比较低。

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

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

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

文件与磁盘 IO: 如何把磁盘的读写速度提升十万倍?内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系站长核实处理。
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到