磁盘读写机制及其在软件框架中的应用
磁盘读写机制以及应用
1. 计算机硬件组成
- 现行计算机结构都是遵循冯诺依曼结构,控制器、计算器、存储器、输入设备、输出设备
- 体现在现实中,主要部件有CPU、内存、硬盘、显卡、主板、电源
PS:
在其他计算机架构中,不一定遵循冯诺依曼的结构,如量子计算机、生物计算机等等。
2.数据存储层级
- 在整个计算机结构中,因为结构原因,数据需要兼顾传输速度和存储容量。
- 而现行结构中,就采用多层存储结构来实现技术和成本的均衡结果。
- 这是多层级计算机数据缓存简图
- 机械硬盘和固态硬盘图示
- 机械硬盘
- sata接口固态硬盘
- NVME接口固态硬盘
3.磁盘硬件结构(机械硬盘)
- 硬件结构简图
2.基本概念 (参考博文https://blog.****.net/weixin_43179522/article/details/107434116?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allfirst_rank_v2~rank_v25-1-107434116.nonecase&utm_term=%E7%A3%81%E7%9B%98%E7%9A%84%E8%BF%BD%E5%8A%A0%E5%86%99%E4%B8%8E%E9%9A%8F%E6%9C%BA%E5%86%99)
- 盘片与盘面 :
一块硬盘一般有多块盘片,盘片分为上下两面,其中有效面称为盘面(一般上下都有效),盘片数一般与磁头数相等.也就是说:磁头数 = 盘面数 = 盘片数*2![]()
- 磁头 :
磁头切换磁道读写数据时通过机械设备实现的,速度较慢;而磁头切换盘面读写数据是通过电子设备实现的,速度较快,因此磁头一般是先读写完柱面后才开始寻道的(不用切换磁道),这样磁盘读写效率更快.![]()
- 磁道 :
磁道就是以中间轴为圆心的圆环,盘面有多个磁道,磁道之间有间隙,磁道也就是磁盘存储数据的介质.磁道上布有一层磁介质,通过磁头可以使磁介质的极性转换为操作系统的数据信号(即磁盘的读,磁盘写刚好相反)![]()
3.柱面 : 磁盘中不同盘面中半径相同的磁道组成的. 也就是说 柱面数 = 某个盘面的磁道数
- 扇区 : 单个磁道就是多个弧形扇区组成的,当然某个盘面上的每个磁道拥有的扇区数量是相等.扇区是硬盘/磁盘的最小存储单元.但不是文件系统的最小存储单元(文件系统的最小存储单元是block,可以人为设定).一般扇区大小为512bytes(最新的硬盘好像可以有4K了)
4.磁盘读写细节
- 硬盘中的最小存储单元不是一个扇区,一个扇区太小,读写数据,太慢了,所以有了block(块)的概念,它是一个块一个块的读取的.block才是文件存取的最小单位.。
一个block块中扇区的个数依文件系统而不同,如一个block有8个扇区,那一个block块的大小为4K. - block的概念类似于软件数据定义中的bit,这是最小单元,但实际使用都是8bit为一个字节Byte,在此基础上进行扩充如KByte,再在此基础上扩充如MByte、GByte等等。而不是直接使用bit这个最小单位
- 磁盘读写时间由以下几个阶段组成
寻道时间 : 表示磁头在不同磁道之间移动的时间
旋转延迟 : 表示在磁道找道时,中轴带动盘面旋转到合适的扇区开头处
传输时间 : 表示盘面继续转动,实际读取数据的时间
- 举例
7200转/min,旋转一周需要8.33ms。寻道约10ms,其实就是磁头不动,盘动的过程
- 磁盘的转速;5400转,7200转,10000转,15000转 每分钟。单位即是rpm 。民用机械硬盘一般都在5400到7200,更高一般用在服务器领域,更高转速意味着更高的读取速度,但同时损坏几率也更高。价格更贵。在固态硬盘还没有发展起来以前,服务器领域为了能够有更高的数据传输和存储速度,发明了这种高转速机械硬盘。
- 从以上内容可知,数据在磁盘中只有顺序写才能保证顺序读。这是毫无疑问的
- 随机IO:
当读取第一个block时,要经历寻道,旋转延迟,传输三个步骤才能读取完这个block的数据.而对于下一个block,如果它在磁盘的某个位置,访问它会同样经历寻道,旋转,延时,传输才能读取完这个block的数据,。这样一来,由于需要做磁道切换,磁头需要经过机械装置做物理位置切换,耗时较大。 - 顺序IO:
但是如果这个block的起始扇区刚好在我刚才访问的block的后面,磁头就能立刻遇到.不需等待,直接传输。这样一来,新写入的数据,磁头不需要经过物理位置变化,可以节约大量时间,直接做数据写入即可。
5.磁盘顺序读写在技术上应用
5.1 文件追加
- 大量应用的log、binlog日志文件。例如mysql数据库之间的数据同步,往往采用binlog的方式而不是传输一个完整的数据库表或者数据库文件。
5.2HDFS中checkpoint日志的追加操作
- 在HDFS中,为了解决namenode的单节点问题,引入了第二namenode。这样一来,如何保证第二namenode中的元数据和第一namenode的元数据一致?
- 主namenode在更新元数据时,会把当前进行的操作以及操作数据的一些信息以日志形式写入到磁盘中。因为日志都是文件追加形式,所以写入速度会很快,比随机读写磁盘快很多,具体数据稍后给出。
- Kafka,主流的消息队列框架,信息加载到内存,为了确保信息可靠性,会把数据也写入到磁盘。为了确保数据读写性能,也是采用顺序读写的方式来。注意,这时候,因为不是一条数据,之后的修改就修改这条数据。而是一条数据,如果有变化,就重新追加方式再写入一条数据。后续再找机会对这些数据做合并或者删除旧数据来保证数据最终一致性。
- zookeeper也是存储数据,内部也对数据做了版本划分。原因之一就是为了保证永久化存储的znode节点数据能够在磁盘读写时有更高性能。至于数据本身,每一次写或者更改时,在对应磁盘文件中做追加即可,不过会给这条数据加一个版本号以示区分。
- HBase ,在存储数据时,也会有版本概念,VERSIONS机制就是保存最近多少个版本的数据,一般3–5个即可。这样一来,数据存储到各个节点服务器上时,直接以追加形式写入磁盘,读写性能可以达到最优。
5.3各类数据存储中的数据版本机制
- HBase
- Zookeeper
- Clickhouse
这就是基于硬件机制从软件层面提升代码效率,学以致用的境界。以往看计算机组成原理只是单纯看,并没有将知识点很好地跟代码实际结合起来,以后还需要继续努力。