8.1 文件与磁盘 IO: 如何把磁盘的读写速度提升十万倍?
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还在哪些服务器上存储,找到数据块后,然后复制数据到其他服务器上。
评论