对磁盘上数据的随机访问比对内存中数据的访问慢很多:

  • 磁盘:几十毫秒
  • 闪存(flash-based storage):20-100 微秒
  • 内存(main-memory):十分之一微秒

TL;DR

扇区是磁盘的最小读写单元,扇区大小通常是 512 字节。

磁盘的 I/O 请求通常由文件系统产生,也可以由数据库系统直接产生。每次请求会以块编号(block number)的形式指定磁盘地址。磁盘块(disk block)是存储分配和读取的逻辑单元,块大小通常在 4-16 K。内存和磁盘之间以块为单位进行数据传输。

NAND 闪存主要用于数据存储。NAND 闪存中的页(page)类似于磁盘的扇区,通常是 4096 字节,读取 NAND 闪存会将整页数据读到内存。SSD 内部是 NAND 闪存,提供和磁盘相同的面向块的接口。

物理存储介质

主要的物理存储介质:

  • 缓存:最快,容量较小,由操作系统管理;
  • 内存(main memory):可供操作的数据和通用机器指令的存储介质,容量在几十 G 到上百 G,通常无法容纳整个大型数据库(容量太小价格太贵),断电后数据丢失(volatile);
  • 闪存(flash memory):断电后数据不丢失(non-volatile),价格比内存低比磁盘高;
    • SSD(solid-state drive)内部使用闪存存储数据,对外提供与磁盘接口相近的接口,支持以块(block,大小通常在 512 字节到 8 KB 之间)为单位存取数据(称为面向块的接口)。
  • 磁盘存储:最主要的长期存储介质,也称作硬盘(hard disk drive,HDD),断电后数据不丢失,容量较大,读写较慢;
    • 要访问磁盘中的数据,操作系统要先把磁盘的数据加载到内存,处理完后再把内存中的数据写回磁盘。
  • 光盘:DVD(digital video disk)是一种光存储介质,用激光光源读写,读取数据比磁盘慢;
  • 磁带(tape storage):通常用于备份、归档数据,可以存储多年,比磁盘便宜但读取慢很多(需要线性地从头读起),容量大。
    • 磁带是顺序存取介质(sequential-access storage),磁盘、SSD 等是直接存取介质(direct-access storage)。

缓存和内存称为主要存储(primary storage),闪存、磁盘称为二级存储或线上存储(secondary storage,online storage),磁带、光盘称为三级存储或离线存储(tertiary storage,offline storage)。

存储接口

磁盘(包括普通磁盘和 SSD)通常支持 SATA(Serial ATA)接口或 SAS(Serial Attached SCSI)接口(通常只用于服务器):

  1. 3 代 SATA 名义上支持 6G/s,数据传输速度可以达到 600M/s;
  2. 3 代 SAS 数据传输速度可以达到 12G/s。

NVMe(Non-Volatile Memory Express)是一个逻辑接口标准,是为了更好地支持 SSD 而开发的,通常与 PCIe 接口一起使用。
PCIe 接口用于计算机系统内部的高速数据传输。

磁盘通常用线缆直接和电脑的接口连接,也可以通过高速网络连接到计算机。

SAN(storage area network)架构中,大量磁盘通过高速网络连接到多台服务器,磁盘通常用 RAID(redundant arrays of independent disks,独立硬盘冗余阵列)技术组织,为服务器提供一个大容量且十分可靠的逻辑磁盘。
SAN 中用到的互连技术包括 iSCSI,Fiber Channel FC,InfiniBand。

NAS(Network attached storage)和 SAN 很类似,不同的是通过网络连接的存储不再表现为一个巨大的磁盘,而是经由网络文件系统协议(如 NFS、CIFS)提供文件系统接口。

云存储(cloud storage)对外提供访问数据的 API,若数据和数据库不在同地,延迟会很高(几十到几百毫秒),因此不适合用作数据库的底层存储。

磁盘

SSD 每个字节的存储费用是普通磁盘的 6-8 倍。

磁盘盘(disk platter)是一个扁圆盘,两面都被磁性材料覆盖,数据就被记录在盘的表面

磁盘工作时,一个驱动马达以恒定速度高速旋转(通常在 5400-15000 转/分钟),一个读写头放置在磁盘盘的表面。

磁盘表面逻辑上按磁道(track,圆环)进行划分,磁道又被划分为扇区(sector,扇形小块)。扇区是磁盘的最小读写单元,扇区大小通常是 512 字节。内部磁道(靠近转轴)比外部磁道长度短,外部磁道包含更多的扇区。

读写头通过逆转扇区上磁性材料的磁化方向的方式在扇区上存储数据。

磁盘的每个磁盘盘的两面都有磁盘头,磁盘头在盘上移动以访问不同磁道。一个磁盘通常有多个磁盘盘,所有磁盘头都安装在一个磁盘臂(disk arm)上,所有磁盘头都一起移动

所有磁盘盘安装在一个转轴上。

当一个磁盘盘的磁头在第 i 个磁道上时,其它所有磁盘盘的磁盘头也在各自的第 i 个磁道上,所有磁盘盘的第 i 个磁道一起称为第 i 个圆柱。

磁盘控制器是操作系统和实际硬盘硬件之间的接口。现代磁盘的控制器已在硬盘内部实现,通过接收高级指令来读写扇区、发起动作(移动磁盘臂到指定磁道)。磁盘控制器会在每个扇区加上校验和,校验和由扇区上存储的数据计算得来。当读取扇区时,磁盘控制器会计算读取到的数据的校验和并和存储的校验和进行比较,若数据已损坏,两个校验和大概率会不一致,出现这种不一致的错误后磁盘控制器会尝试重新读取,若重试多次后校验和仍然不一致,则返回错误信息。

磁盘格式化时或写某个扇区时,若磁盘控制器检测到该扇区已损坏,则会将该坏扇区重新映射到其它物理地址(从专用于此用途的额外扇区池中分配出来)。这一重新映射的信息记录在磁盘或其它非易失性存储中。

磁盘的主要参数是容量、访问时间、数据传输速率和可靠性。

访问时间是读/写请求发起到数据传输开始这之间的时间。磁盘臂要移动磁盘头到正确的磁道,然后等待磁盘将扇区转到自己的下方。

磁盘臂的移动消耗的时间称为寻道时间(seek time),寻道时间随着磁盘臂需要移动的距离的增大而增大,通常在 2-20 毫秒(取决于目标磁道和磁盘臂初始位置的距离),平均寻道时间在 4-10 毫秒。
较小的磁盘(2.5 英寸)的寻道时间比较大的磁盘(3.5 英寸)的短(距离短)。

等待磁盘盘旋转的的时间称为旋转延迟时间(rotational latency time)。

访问时间是寻道时间和旋转延迟时间的加和,平均在 5-20 毫秒。

数据传输速率指磁盘的存取速率,通常在 50-200 M/s。由于扇区少,内部磁道的传输速率比传输速率的最大值小很多。

磁盘的 I/O 请求通常由文件系统产生,也可以由数据库系统直接产生。每次请求会以块编号(block number)的形式指定磁盘地址。

磁盘块(disk block)是存储分配和读取的逻辑单元,块大小通常在 4-16 K。内存和磁盘之间以块为单位进行数据传输

一个块会分布在多个扇区(由大小关系推导出,扇区大小通常是 512 字节)。

一组读取磁盘块的请求可以分为连续读取模式和随机读取模式。

连续读取模式下,请求的块位于同一个或相邻磁道,总的寻道时间短,因此传输速率大。

随机读取模式下,多个请求里每个都需要寻道,每次寻道读到的块较少,因此传输速率比连续读取模式慢很多。

平均故障时间(mean time to failure,MTTF)用于衡量磁盘可靠性。

闪存

有两种闪存:NOR 和 NAND。

NAND 闪存主要用于数据存储。NAND 闪存中的(page)类似于磁盘的扇区,通常是 4096 字节,读取 NAND 闪存会将整页数据读到内存。

SSD 内部是 NAND 闪存,提供和磁盘相同的面向块的接口。

SSD 的随机读取比磁盘快得多,读取页的延迟在 20-100 微秒,磁盘是 5-10 毫秒;传输速度也快得多,500M-3G 每秒,磁盘最大是 200M 每秒;能耗低得多。

写闪存通常要 100 微秒。闪存不能直接覆盖去写,要先擦除再重写。擦除操作必须作用在一组页(称为擦除块,erase block,often referred to as just “block” in flash literature)上,耗时 2-5 毫秒。擦除块的大小通常在 256K 到 1M 之间,包含 128-256 个页。一个闪存页的擦除次数有上线,通常在 100000-1000000 次之间。超过上线后,写数据很可能出错。

为了避免擦除块速率慢和擦除次数有限制的影响,闪存把物理页编号映射成逻辑页编号。当一个逻辑页被更新时,它可以被重新映射到一个已擦除的物理页,原先的物理页可以之后在进行擦除。每个物理页有一小块空间用于存储它的逻辑地址,如果逻辑地址被重新映射到新的物理页,原先的物理页会被标记成已删除。逻辑页到物理页的映射关系会被复制到内存中的转换表供快速读取。

包含多个已删除页的块会被定期擦除,擦出之前会先把未删除的页拷贝到不同的块,这些迁移的未删除页的转换关系同时也会被更新。

擦除次数多的页会被分配冷数据,擦除次数少的页会被分配热数据,这一损耗均衡(wear leveling)的机制通常由闪存控制器无感知地进行。若一个物理页损坏,它将不会再被使用,不会影响整个闪存的功能。

以上操作均由闪存转换层来完成,在这一层以上,闪存和磁盘无异,文件系统和数据库存储结构看到的都是相同的底层存储结构的逻辑视图。

和磁盘不同,SSD 支持支持多个并行的随机操作,通常支持 32 个并行。
QD-1 用于标识没有并行机制条件下的速率,QD-32 标识 32 个并行下的速率。

对磁盘块的访问

对于数据库系统发起的磁盘 I/O 请求,查询处理器负责了其中大多数的磁盘 I/O。每个 I/O 请求指定一个磁盘标识符和一个逻辑块编号,若数据库的数据是存储在操作系统的文件中的,则指定文件标识符和文件中的块编号。

底层优化访问磁盘块时间(尤其是随机访问)的技术:

  • 缓存:将读过的磁盘块缓存在内存的缓存中以满足未来再次读取的需要(由操作系统和数据库系统共同完成)。
  • 预读:当某个数据块被访问过时,将与之同一个磁道的连续多个块也预读到内存中缓存起来。
    • 这一技术对于随机访问不太有用。
    • 操作系统也会定时对操作系统文件的连续块做预读。
  • 调度优化:磁盘臂调度算法(如电梯算法)等。
  • 文件组织:若文件通常是顺序访问,则将文件的块线性存储在相邻的圆柱上。
  • 非易失性写缓存:使用非易失性随机访问内存(non-volatile random-acces memory, NVRAM)来加速写磁盘操作。数据库发起写块请求时,磁盘控制器将块写到非遗实行写缓存后马上返回,通知操作系统写操作已完成,控制器接着已最小代价(磁盘臂移动尽量少)将块写到磁盘的目标位置。

要减少随机访问,也可以在更上层由查询处理算法来优化。