在本章,咱们稍微涉及一些硬件和操做系统层面的事情。数据库
计算机是由硬件和软件组成的,而全部软件的惟一目标就是尽量最大化的利用下层硬件可以提供的特性,完成上层的功能。ide
因此才会有人说,硬件是骨头,软件是血肉,骨头决定生物的形态,软件决定生物的神态。不过,依然请放心,咱们不会讨论复杂的东西,做为一个软件工程师,也没有人会要求咱们去写一个磁盘存储器的硬件驱动代码~在这里,咱们只讨论那些为了后面咱们理解软件存储而锁须要掌握的硬件知识。搜索引擎
好了,直入主题,硬盘spa
===硬盘构造介绍===操作系统
所谓的数据存储,就是把一串很普通的由0和1组成的字节流按照他原来的顺序写入到一种介质里面去。那么天然而然,使用电驱动的磁铁小针快速的改变可磁化介质从而记录下这些数据就必然是一种很好的选择。视频
那么,下面就请你们跟我一块儿来看看磁盘的基本构造:blog
磁盘的先祖其实就是磁带机,相信阅读本文的读者应该都使用过录音机的(95后无辜的看着我。。。)索引
从很小的用来听音乐的卡片式磁带机到很大的用来存数据的磁带卷儿,其实样子一直都是这样的(笑)。资源
在使用的过程当中,通常是由一个小电机带着这个磁带向着一个方向转动,而后有一个磁头以很近的距离来读取磁场的微妙变化,从而可以读取到上面记录的数据的。get
这里就出现了磁盘中所须要用到的第一个关键的组件,电机,他的主要做用在于给予带动含磁介质向着一个固定的方向转动,从而能够保证数据可以被“顺序”的读出和读入。
然而,当咱们尝试把这种磁技术应用于计算机的时候,就马上发现了一个很重要的问题须要解决:
在计算机的应用场景中,数据的读取可能不彻底是顺序的,有可能先读一下开始位置的数据,而后又读一下结果位置的数据,最后又须要读中间位置的数据。而且,这种读取的跳跃过程是没法提早预测的。
所以就有一个问题急须要解决,如何可以让磁介质支持随机访问。
让咱们回想一下磁介质写入和读取过程当中须要的关键组件:1.磁介质。2.磁头。3.步进电机。
而随机访问则须要可以让磁头与磁介质的特定区段进行接触,从而才能读取到对应的数据。
那么,一种选择是让介质移动到指定位置,磁头不动。一种是让磁头移动到介质的位置上。
明显的,把存储介质移动起来的控制难度要远远大于让磁头移动。
因此,计算机须要的新的磁存储模型就出现了:
磁盘使用步进电机保持匀速运动,而后让磁头移动来读取或写入数据!
不过,虽然磁头移动已是里面最轻量的玩意儿了,但他仍然须要一个电机带动磁头在磁盘上作寻道操做。
===硬盘块与原子操做===
而后咱们再来看另一个问题,若是你每次写入只写一个bit,那么由于磁盘在高速旋转,有大量的数据传递性工做,致使磁盘须要频繁的等待新的命令,这样会形成磁盘效率很是低下。所以,一次写一批数据就成了合理的选择,因此磁盘通常是按照磁盘块的方式来组织数据的。
经常使用的块大小是512byte。但由于磁盘的磁头一次只能写一个bit,因此依然会面临断电了数据写一半儿怎么办的问题。。
解决的方法也不会超出你们的预期,这也是计算机可以作出的最大保证了:
若是告诉你写成功了,那必定是写成功了。那失败怎么办?好问题,咱们来分析一下:
一台计算机,其实只有三个状态,要么给电机器运转,要么正常关机,要么异常关机。在正常运转状态和正常关机状态的时候,操做系统均可以保证数据的全部操做都是原子的,由于只须要在关机hook上作完该作的事情,同时不容许有新的请求进来就能够了。
只有异常关机的状态略微有点麻烦,首先,由于不管计算机是正常关机仍是异常断点的关机,这台计算机在下次给电启动以前都是不可能服务的,因此就算是有个磁盘块只写了一半儿也没什么问题。因此问题就转化成,可否在下次启动并能提供读写服务以前,先把那些写了一半的数据块删掉?(由于没有给请求方反馈过成功,因此这些未完成的块原本就不该该存在)
那下一步如何作就很容易能够想到了。在每次开机的时候判断一下是不是一次正常的关机,若是不是正常关机,那么将那些未被标记为完整写入的块所有删掉。
嗯,这个模式也是贯穿单机有状态存储保证数据一致性的主要方法,能够复用到单机全部须要原子性操做的地方哦~
===读写iops与读写吞吐量(MBPS)与延迟的关系===
这个概念我估计大部分人都会搞混,包括我在内。
因此我也把目前个人理解给到你们
首先
先来界定什么叫作一次io.简单来讲,一次io就是应用层发起一次写入或查询的请求
那么这个请求对应到磁盘上面来讲呢就是如下几个操做的集合:
1.磁头移动到此次请求所对应的磁道
2.等待硬盘旋转到数据所在的位置
3.读取数据
天然的,若是想增长磁盘的iops数,就须要让磁盘在一秒内尽量多的完成用户的请求,那么最理想状态下应该是:减小磁头的移动,减小硬盘转到数据所在位置的时间,减小一次请求所要读写的数据块个数。
不过这是个理想状态,由于请求没法预测,因此通常来讲也只能是追求尽量减小随机寻道时间(由于这个是几个iops的参数中影响最大的一个)。
这个指标是面向小数据随机或顺序读写应用时候比较看重,好比数据库。
再来看吞吐量(MBpersecond)
这个指标是磁盘相对比较擅长的指标,他衡量的是数据在单位时间内传出+传入这块磁盘的总数量。
因此若是想增长磁盘的吞吐量指标,就须要让磁盘在一秒内尽量多的写入或读出数据,那么最理想的状态下应该是:减小磁头的移动,减小磁盘转到数据所在位置的时间,增长一次请求所须要读写的数据块的个数。
好比,若是用户只有一个请求,而且这个请求是要求顺序的将1T的数据写入到磁盘内。这种状况就能发挥出磁盘吞吐量的极限了。
这个指标对于通常的数据库意义不大,但对于视频、搜索引擎、或大文件存储这类顺序读写的应用则比较看重。
延迟
基本上来讲,延迟和IOPS是个正比例关系。
为何这么说呢?缘由是更大延迟能够容许计算机作这么一件事,批量处理:
就比如100个旅客要从北京坐飞机到杭州,飞机是个稀缺资源,咱们假定北京飞杭州要1个小时。
那么若是一架飞机上只有一个旅客,那么要飞100次才可以把这批旅客运到目的地,运送100个旅客的总时间是100个小时,每小时运送旅客数是100/100=1,而若是要是让先来的旅客等一等,等到100人都作上飞机之后再起飞呢?那么每小时运送的旅客数就是100/乘客的等待时间+1/1约等于100
这样略微增长延迟就能够提高总体的tps量了。不过须要注意的是,这个提高是有上限的,当每架飞机都坐满了人的时候,那么飞机的运力就是最终瓶颈,其余乘客只能等待。
请求数超过伐值后,就只剩下排队了,系统的运力不可能再有提高了。
====小结===
总结一下磁盘的优点和劣势:
优点:
技术比较成熟,所以价格相对较低
顺序读写由于不涉及到大量的机械寻道,因此吞吐量只和磁盘转速正相关。
劣势:
只要操做须要大量寻道,毕竟寻道是个机械操做,那么磁盘的iops和吞吐量会马上降低不少。
读取和写入是按照块来进行的,通常块的大小是512bytes,因此一次操做必须一次性的写入这个数量的数据。
嗯下一篇来介绍磁盘raid与阵列