跳转至

大容量存储结构 (Mass-Storage Structure)

本篇文档旨在详细讲解计算机系统中的大容量存储结构,涵盖从传统机械硬盘到现代固态硬盘的工作原理、性能考量、管理策略以及数据冗余技术。我们将深入探讨磁盘调度算法、文件系统如何与底层存储交互,以及 RAID 技术在提升存储可靠性和性能方面的作用。

概述 (Overview) (page 3-4)

磁性磁盘 (Magnetic Disks) (page 3)

磁性磁盘是计算机系统中二次存储(secondary storage)的主要组成部分。

  • 硬盘驱动器 (Hard Disk Drive, HDD):是最常见 / 流行的磁性磁盘类型,部分磁性磁盘也可是可移动的。
  • 连接方式:驱动器通过各种 I/O 总线(如 USB, SCSI, EIDE, SATA 等)连接到计算机。
  • 转速:驱动器通常以每秒 60 250 次的速度旋转,例如 7200 RPM(每分钟转数)相当于 120 RPS(每秒转数
  • 盘片 (Platters):磁性磁盘由一个或多个盘片组成。历史上盘片尺寸从 0.85 英寸到 14 英寸不等,如今常见的尺寸有 3.5 英寸、2.5 英寸和 1.8 英寸。
  • 容量 (Capacity):单个驱动器的容量范围从 30GB 3TB,甚至更大。

首个商用磁盘驱动器 (The First Commercial Disk Drive) (page 4)

历史上首个商用磁盘驱动器是 1956 IBM RAMDAC 计算机的一部分,即 IBM Model 350 磁盘存储系统

  • 容量:存储 5M7 比特)字符。
  • 盘片数量与尺寸:包含 50 24 英寸的巨大盘片。
  • 访问时间:小于 1 秒。

磁盘结构 (Disk Structure) (page 5-9)

移动磁头磁性磁盘结构 (Moving-head Magnetic Disk Structure) (page 6)

磁性磁盘由以下核心组件构成:

  • 主轴 (Spindle):所有盘片安装在主轴上,并由其驱动旋转。
  • 盘片 (Platters):圆形金属盘片,表面涂有磁性材料,用于存储数据。
  • 读写头 (Read-write Head):用于在盘片表面读写数据的微型电磁头。
  • 磁臂 (Arm):读写头固定在磁臂的末端。
  • 磁臂组件 (Arm Assembly):包含所有磁臂,能够同时移动,使得所有读写头始终位于相同编号的磁道上。
  • 磁道 (Track):盘片上的一系列同心圆,数据存储在这些圆环上。
  • 扇区 (Sector):每个磁道被划分为若干个扇区,是磁盘上可寻址的最小物理存储单元。
  • 柱面 (Cylinder):所有盘片上相同编号的磁道集合。例如,所有盘片上最外层磁道的集合构成了第一个柱面。

逻辑块寻址 (Logical Block Addressing, LBA) (page 5)

逻辑块寻址 (Logical Block Addressing, LBA)

磁盘驱动器被操作系统视为一个一维的逻辑块数组。逻辑块是磁盘上的最小传输单元。

  • 映射机制:逻辑块被顺序地映射到磁盘的物理扇区(sectors
    • 扇区 0:是位于最外层柱面(outermost cylinder)的第一个磁道(track)的第一个扇区。
    • 映射顺序
      1. 首先遍历当前磁道 (trace) 上的所有扇区。
      2. 然后遍历当前柱面 (cylinder) 上的其余所有磁道。
      3. 最后从最外层柱面开始,向最内层柱面依次遍历所有柱面。
  • 这种映射使得逻辑地址到物理地址的转换变得相对容易,除了需要处理坏扇区(bad sectors)的情况。

磁盘访问时间与性能 (Disk Access Time and Performance) (page 8-9)

定位时间 (Positioning Time)

定位时间是指将磁盘臂移动到所需扇区所需的时间,它包括寻道时间(Seek Time)和旋转延迟(Rotational Latency。定位时间也称为随机访问时间(Random-Access Time

  • 寻道时间 (Seek Time):将磁盘臂移动到目标柱面所需的时间。
  • 旋转延迟 (Rotational Latency):等待目标扇区旋转到读写头下方所需的时间。
    • 计算公式:1 / RPM * 60 秒(其中 RPM 是每分钟转数
    • 平均旋转延迟通常假设为最大旋转延迟的 \(\frac{1}{2}\)
      • 所以一般 \(RPM * Average\_latency = 60* \frac{1}{2}\) ,其中平均延迟的单位为秒 (s)
传输速率 (Transfer Rate)

传输速率是数据在驱动器与计算机之间流动的速率。理论传输速率可达 6 GB/s,实际有效速率约 1 GB/s

  • 平均访问时间 (Average Access Time)
    • 平均访问时间 = 平均寻道时间 + 平均旋转延迟
    • 例如,对于最快的磁盘:3ms(寻道)+ 2ms(旋转)= 5ms。
    • 对于较慢的磁盘:9ms(寻道)+ 5.56ms(旋转)= 14.56ms。
平均 I/O 时间计算 (Average I/O Time Calculation) (page 9)

平均 I/O 时间是指完成一个 I/O 请求的总时间,包括访问时间和数据传输时间。

平均I/O时间 = 平均访问时间 + (要传输的数据量 / 传输速率) + 控制器开销

示例: 假设要传输一个 4KB 的块,使用 7200 RPM 的磁盘,平均寻道时间为 5ms,传输速率为 1GB/s,控制器开销为 0.1ms。

  1. 计算平均旋转延迟: 7200 RPM 对应的平均延迟约为 4.17ms(根据 page 8 的表格)。
  2. 计算平均访问时间: 平均访问时间 = 5ms (寻道) + 4.17ms (旋转延迟) = 9.17ms。
  3. 计算数据传输时间: 数据传输时间 \(= 4KB / (1 GB/s) = 4 * 1024 bytes / (1 * 1024 * 1024 * 1024 bytes/s) = 4 / 1024 / 1024 s = 4 * 10^{-6} s = 0.004 ms\)
  4. 计算平均 I/O 时间: 平均 I/O 时间 = 5ms + 4.17ms + (4KB / 1GB/s) + 0.1ms = 5ms + 4.17ms + 0.004ms + 0.1ms ≈ 9.274ms。

注意:幻灯片中直接给出 5ms + 4.17ms + 4KB / 1gb/sec + 0.1ms,其中 4.17 再次明确是平均延迟。

磁盘调度 (Disk Scheduling) (page 10-18)

磁盘调度 (Disk Scheduling)

磁盘调度是操作系统为高效利用硬件而选择下一个要服务的挂起磁盘 I/O 请求的过程。其目标是最大化磁盘带宽并最小化访问时间。

目标与挑战 (Goals and Challenges) (page 10)

  • OS 职责:操作系统负责高效利用硬件。
  • 磁盘驱动器目标:实现更快的访问时间和更高的磁盘带宽。
    • 访问时间 (Access Time):寻道时间(大致与寻道距离线性相关)+ 旋转延迟。
    • 旋转延迟的计算难度:操作系统很难精确计算旋转延迟,因为它取决于磁盘的当前旋转状态和读写头的位置。
    • 磁盘带宽 (Disk Bandwidth):数据传输速度,定义为 总传输字节数 / 总时间。这里的总时间是从第一个请求开始到最后一个传输完成之间的时间。

请求队列与责任 (Request Queue and Responsibility) (page 11)

  • 并发 I/O 请求源:包括操作系统本身、系统进程和用户进程。
  • 请求队列:如果磁盘处于空闲状态,可以立即处理请求;否则,操作系统会将请求排队。
  • 请求内容:每个 I/O 请求通常包含 I/O 模式(读 / 、磁盘地址、内存地址和扇区数量。
  • OS 维护:操作系统为每个磁盘或设备维护一个请求队列。
  • 优化:只有当存在请求队列时,优化算法才有意义。
  • 职责演变
    • 过去:操作系统负责队列管理和磁盘驱动器磁头调度。
    • 现在:许多调度算法已内置到存储设备或控制器(固件)中。操作系统只需提供 LBA(逻辑块寻址,控制器负责请求的排序。

磁盘调度算法 (Disk Scheduling Algorithms) (page 12)

磁盘调度通常尝试最小化寻道时间。我们将使用以下请求队列和初始磁头位置作为示例:

  • 请求队列98, 183, 37, 122, 14, 124, 65, 67
  • 柱面范围[0, 199]
  • 初始磁头位置53
FCFS (First-Come, First-Served) (page 13)

原理:最简单的调度算法,按照请求到达的顺序进行服务。

磁头移动路径53 -> 98 -> 183 -> 37 -> 122 -> 14 -> 124 -> 65 -> 67

总磁头移动距离计算|98 - 53| + |183 - 98| + |37 - 183| + |122 - 37| + |14 - 122| + |124 - 14| + |65 - 124| + |67 - 65| = 45 + 85 + 146 + 85 + 108 + 110 + 59 + 2 = 640 个柱面

优点: - 每个请求都有公平的机会。 - 不会出现无限期推迟(indefinite postponement)。

缺点: - 不尝试优化寻道时间。 - 可能无法提供最佳服务。

SSTF (Shortest-Seek-Time-First) (page 14)

原理:选择与当前磁头位置寻道时间最短的请求进行服务。它是 SJF(Shortest Job First)调度的一种形式。

磁头移动路径: 初始位置:53 - 53 最近的是 65 (距离12) 或 67 (距离14)。选择 6553 -> 65 (距离 12) - 当前在 65,未处理请求:98, 183, 37, 122, 14, 124, 67 - 65 最近的是 67 (距离 2)。 65 -> 67 (距离 2) - 当前在 67,未处理请求:98, 183, 37, 122, 14, 124 - 67 最近的是 37 (距离 30)。 67 -> 37 (距离 30) - 当前在 37,未处理请求:98, 183, 122, 14, 124 - 37 最近的是 14 (距离 23)。 37 -> 14 (距离 23) - 当前在 14,未处理请求:98, 183, 122, 124 - 14 最近的是 98 (距离 84)。 14 -> 98 (距离 84) - 当前在 98,未处理请求:183, 122, 124 - 98 最近的是 122 (距离 24)。 98 -> 122 (距离 24) - 当前在 122,未处理请求:183, 124 - 122 最近的是 124 (距离 2)。 122 -> 124 (距离 2) - 当前在 124,未处理请求:183 - 124 最近的是 183 (距离 59)。 124 -> 183 (距离 59)

最终顺序53 -> 65 -> 67 -> 37 -> 14 -> 98 -> 122 -> 124 -> 183

总磁头移动距离计算12 + 2 + 30 + 23 + 84 + 24 + 2 + 59 = 236 个柱面

优点: - 降低平均响应时间。 - 提高吞吐量。

缺点: - 需要提前计算寻道时间,增加开销。 - 可能导致饥饿(Starvation):如果不断有新请求在磁头附近到达,远离磁头的请求可能永远无法被服务。 - 响应时间方差大,因为它倾向于优先处理某些请求。

SCAN (Elevator Algorithm) (page 15)

原理:磁盘臂从磁盘的一端开始移动,沿途服务请求,直到到达另一端。然后,磁头移动方向反转,并继续服务请求。

磁头移动路径(假设磁头最初向 0 方向移动,因为 53 0 199 : 初始位置:53 - 向 0 方向移动,服务 37, 1453 -> 37 -> 14 -> 0 (到达一端) - 然后反向向 199 移动,服务 65, 67, 98, 122, 124, 1830 -> 65 -> 67 -> 98 -> 122 -> 124 -> 183 -> 199 (到达另一端)

总磁头移动距离计算|53 - 14| + |14 - 0| + |0 - 183| + |183 - 199| = 39 + 14 + 183 + 16 = 252 个柱面

优点: - 高吞吐量。 - 响应时间方差低。 - 平均响应时间较好。

缺点: - 磁盘臂刚刚访问过的位置的请求可能需要等待很长时间,因为它必须先移动到另一端再返回。

C-SCAN (Circular-SCAN) (page 16)

原理:循环扫描算法旨在提供更均匀的等待时间。磁头从一端向另一端移动,沿途服务请求。当磁头到达一端时,它立即返回到另一端(例如,从 199 返回到 0,但在返回途中不服务任何请求。它本质上将柱面视为一个循环列表。

磁头移动路径(假设磁头最初向 199 方向移动: 初始位置:53 - 向 199 方向移动,服务 65, 67, 98, 122, 124, 18353 -> 65 -> 67 -> 98 -> 122 -> 124 -> 183 -> 199 (到达一端) - 然后立即返回 0,不服务任何请求: 199 -> 0 (返回起始端) - 再从 0 开始向 199 方向移动,服务 14, 370 -> 14 -> 37 (如果还有请求在当前方向,会继续服务)

总磁头移动距离计算|199 - 53| + |199 - 0| + |37 - 0| = 146 + 199 + 37 = 382 个柱面

优点: - 相比 SCAN 提供更均匀的等待时间。

LOOK / C-LOOK (page 17)

原理SCAN C-SCAN 算法的改进版本。在实际实现中,磁头只移动到当前方向上最远的请求,而不是一直移动到磁盘的物理末端。

  • LOOK SCAN 的一个版本,它在当前方向上没有更多请求时反转方向。
  • C-LOOK C-SCAN 的一个版本,它在当前方向上没有更多请求时直接返回到另一端最远的请求位置,而不是物理末端。

磁头移动路径(C-LOOK,假设向 199 方向移动: 初始位置:53 - 向 199 方向移动,服务 65, 67, 98, 122, 124, 18353 -> 65 -> 67 -> 98 -> 122 -> 124 -> 183 (到达当前方向最远请求) - 然后立即返回到 14(当前方向上最靠近 0 的请求),不服务任何请求: 183 -> 14 (返回到另一端的最远请求) - 再从 14 开始向 183 方向移动,服务 3714 -> 37

总磁头移动距离计算|183 - 53| + |183 - 14| + |37 - 14| = 130 + 169 + 23 = 322 个柱面

优点: - 避免了不必要的磁头移动到磁盘末端,从而减少了额外延迟。

磁盘调度算法选择 (Selecting Disk-Scheduling Algorithm) (page 18)

  • 性能影响因素:磁盘调度性能取决于请求的数量和类型。
  • 模块化设计:磁盘调度功能应作为独立的、可替换的模块编写。
  • 常见选择
    • SSTF:通常是默认算法的合理选择。
    • LOOK C-LOOK:在 I/O 负载较重的系统上表现更好。
  • 文件系统影响:文件分配和元数据布局也会影响磁盘性能。
    • 空间局部性 (Spatial Locality):文件系统会投入大量精力来增加空间局部性,以便将相关数据存储在磁盘上彼此靠近的位置,从而减少寻道时间。

非易失性存储设备 (Nonvolatile Memory Devices) (page 19-22)

除了传统的磁性磁盘,非易失性存储设备在现代计算机系统中扮演着越来越重要的角色。

固态硬盘 (Solid-State Disks, SSDs) (page 19-21)

固态硬盘 (Solid-State Drive, SSD)

固态硬盘是一种使用固态 NAND 闪存或 DRAM 芯片作为永久性数据存储器的存储设备,与传统 HDD 相比,它没有可移动部件。

  • 形式
    • 类似磁盘驱动器。
    • 其他形式包括 USB 驱动器(U 盘、闪存盘DRAM 磁盘替代品、以及主板上表面贴装的芯片。
  • 优点
    • HDD 更可靠(无机械部件
    • 速度更快(显著降低访问延迟
    • 由于没有寻道时间和旋转延迟,因此 FCFS(先进先出)调度算法对其性能表现良好。
  • 缺点 / 挑战
    • MB 成本更高。
    • 可能寿命较短,需要仔细管理。
    • 容量相对较小。
    • 现有总线(如 SATA)可能成为性能瓶颈,因此一些高性能 SSD 直接连接到 PCI Express (PCIe) 总线。
SSD 的写入特性与挑战 (SSD Write Characteristics and Challenges) (page 20)

SSD NAND 闪存具有独特的操作特性,带来了一些管理挑战:

  • 页面 (Page) 写入:数据以“页面”为单位进行读取和写入(类似于 HDD 的扇区,通常为 4KB
  • 无法原地覆盖 (Cannot Overwrite in Place):与 HDD 不同,SSD 不能直接覆盖已存在数据的页面。
  • (Block) 擦除:要写入一个已包含数据的页面,必须先擦除该页面所属的整个“块”(block。块通常由多个页面组成,例如 64KB 的块可能包含 16 4KB 的页面。擦除操作发生在块级别,而非页面级别。
  • 擦除次数限制 (Limited Erase Cycles):每个闪存块只能被擦除有限次数(例如约 100,000 次)就会磨损。
  • 驱动器写入每日次数 (Drive Writes Per Day, DWPD)SSD 的寿命通常用 DWPD 来衡量。例如,一个 1TB NAND 驱动器,如果其 DWPD 评级为 5,则意味着在保修期内,它每天可以写入 5TB 的数据而不会出现故障。
NAND 闪存控制器算法 (NAND Flash Controller Algorithms) (page 21)

为了应对 SSD 的写入特性和寿命限制,NAND 闪存控制器内置了复杂的算法:

  • 闪存转换层 (Flash Translation Layer, FTL):由于页面不能原地覆盖,有效页面和无效页面会混合存在于闪存块中。FTL 维护一个逻辑块到物理块的映射表,以跟踪哪些逻辑块是有效的。
  • 垃圾回收 (Garbage Collection, GC):为了释放无效页面空间,控制器会执行垃圾回收。当一个块中大部分页面变为无效后,控制器会将其中的所有有效页面复制到预留的“过量配置(over-provisioning)”区域,然后擦除整个块,使其可用于后续写入。
  • 过量配置 (Over-provisioning):控制器会分配一部分闪存容量作为工作空间,用于垃圾回收和磨损均衡等操作。
  • 磨损均衡 (Wear Leveling):为了延长 SSD 的寿命,控制器需要确保数据均匀地写入到所有闪存单元中,避免某些块被过度擦写而提前磨损。

磁带 (Magnetic Tape) (page 22)

  • 早期存储:磁带是早期的一种二次存储设备,现在主要用于备份(backup)和归档。
  • 大容量:容量通常较大,从 200GB 1.5TB 甚至更高。
  • 访问速度慢:尤其是随机访问时速度非常慢,寻道时间远高于磁盘。随机访问需要磁带的卷绕和倒带操作。
  • 传输速率:一旦数据位于磁头下方,传输速率可与磁盘媲美(例如 140 MB/s
  • 数据持久性:存储在磁带上的数据相对永久。

磁盘管理 (Disk Management) (page 23-27)

物理格式化 (Physical Formatting) (page 23)

物理格式化 (Physical Formatting) / 低级格式化 (Low-level Formatting)

物理格式化是将磁盘划分为控制器可读写的扇区的过程。

  • 每个扇区包含:
    • 扇区头信息 (Header information):用于识别扇区。
    • 数据区 (Data):通常为 512 字节,但也可能是可选择的其他大小。
    • 错误纠正码 (Error Correction Code, ECC):用于检测和纠正数据传输中的错误。

逻辑格式化 (Logical Formatting) (page 23)

逻辑格式化 (Logical Formatting) / 高级格式化 (High-level Formatting)

逻辑格式化是操作系统在磁盘上建立自己的数据结构的过程,通常包括创建文件系统(file system

  • 分区 (Partition):磁盘可以被划分为若干个柱面组,每个柱面组被视为一个逻辑磁盘。
  • 文件系统 (File System):在逻辑分区上创建文件系统。
    • 某些文件系统会预留备用扇区来处理坏块(bad blocks
    • 文件系统可以进一步将块(blocks)组合成簇(clusters)以提高性能。
      • 磁盘 I/O 通常以块为单位进行。
      • 文件 I/O 通常以簇为单位进行。
  • 引导扇区 (Boot Sector):如果分区包含操作系统镜像,则需要初始化引导扇区,其中包含启动操作系统的代码。

设备名称 (Device Names) (page 24)

Linux 系统中,磁盘设备通常遵循一定的命名约定:

  • IDE (Integrated Drive Electronics) 驱动器
    • 通常命名为 /dev/hda/dev/hdd
    • 例如,/dev/hda 是第一个硬盘驱动器。
    • /dev/hdc 是第三个硬盘驱动器。
  • SCSI (Small Computer System Interface) 驱动器
    • 遵循类似的模式,但使用 sd 而非 hd
    • 例如,/dev/sda 是第一个 SCSI 驱动器。
    • 分区命名:分区从 1 开始编号,例如 /dev/sda1/dev/hda1
    • 因此,第二个 SCSI 驱动器的第一个分区将是 /dev/sdb1

磁盘分区 (Disk Partition) (page 25)

  • 主分区 (Primary Partitions):一个磁盘最多可以有 4 个主分区。
  • 逻辑分区 (Logical Partitions):如果需要超过 4 个分区,则必须使用逻辑分区。逻辑分区的编号通常从 5 开始。
    • 逻辑分区存在于一个扩展分区(Extended Partition)中,扩展分区本身是一个主分区。

引导过程与管理 (Booting Process and Management) (page 26-27)

  • 根分区 (Root Partition):包含操作系统(OS。其他分区可以存放其他操作系统、其他文件系统或作为原始(raw)分区使用。
    • 根分区在启动时被挂载(Mounted
    • 其他分区可以自动或手动挂载。
    • 挂载时,文件系统会检查一致性。
      • 如果元数据不正确,会尝试修复。
      • 如果正确,则添加到挂载表并允许访问。
  • 引导块 (Boot Block)
    • 引导块指向引导卷(boot volume)或包含足够代码来从文件系统加载内核的引导加载程序(boot loader)块集。
    • 也可以指向用于多操作系统引导的引导管理程序。
  • 系统初始化:引导块初始化系统。
    • 引导程序 (Bootstrap):存储在 ROM(只读存储器)固件中。
    • 引导加载程序 (Bootstrap loader):一个程序,存储在引导分区的引导块中。
  • 主引导记录 (Master Boot Record, MBR) (page 27):
    • 位于磁盘的第一个扇区。
    • 包含引导代码(boot code)和分区表(partition table
    • 引导代码负责查找活动分区,并加载其引导加载程序。
  • 原始磁盘访问 (Raw Disk Access)
    • 某些应用程序(如数据库)可能希望自己管理块,从而绕过操作系统的块管理。
  • 扇区备用 (Sector Sparing)
    • 一种处理坏扇区的方法,当检测到坏扇区时,会将其映射到备用扇区。

交换空间管理 (Swap-Space Management) (page 28)

交换空间 (Swap Space)

交换空间是磁盘上的一块区域,用于在 DRAM(主内存)不足以容纳所有进程时,将整个进程(交换,swapping)或内存页面(分页,paging)从 DRAM 移到辅助存储器。

  • 目的:当 DRAM 不足时,提供额外的虚拟内存。
  • 优化:由于辅助存储器比 DRAM 慢得多,因此优化交换空间性能至关重要。
  • 多交换空间:系统可以有多个交换空间,以减少单个设备的 I/O 负载。
  • 专用设备:最好有专用的设备用于交换空间。
  • 位置:交换空间可以是一个单独的分区,也可以是文件系统中的一个文件(方便添加
  • Linux 系统中的交换数据结构
    • 交换映射(swap map)中的“0”表示该页面未使用。
    • 交换映射中的“3”表示该页面映射到进程号为 3 的进程。

磁盘连接方式 (Disk Attachment) (page 29-33)

磁盘可以连接到计算机的方式主要有三种:

1. 主机连接存储 (Host-Attached Storage) (page 29-31)

主机连接存储 (Host-Attached Storage)

磁盘直接通过 I/O 总线连接到计算机,通常是为单个主机提供存储服务。

  • 常见接口示例

    • SCSI (Small Computer System Interface)
      • 是一种总线架构,一条电缆上最多可以连接 16 个设备。
      • SCSI 发起者(initiator)请求操作,SCSI 目标设备(targets,例如磁盘)执行任务。每个目标设备最多可以有 8 个逻辑单元(logical units
      • Linux 中,SCSI 磁盘驱动器通常表示为 /dev/sdasd 代表 SCSI 磁盘。
    • IDE (Integrated Drive Electronics) 接口
      • Linux 中,IDE 磁盘驱动器通常表示为 /dev/hda
    • 光纤通道 (Fiber Channel)
      • 是一种高速串行总线。
      • 可以是交换式光纤(switched fabric,具有 24 位地址空间。
      • 是最常见的存储区域网络(SAN)互连方式。
  • 典型 PC 总线结构:一张图示(page 31)展示了处理器、内存、显卡控制器、SCSI 控制器、IDE 磁盘控制器等如何通过 PCI 总线连接,以及扩展总线接口连接键盘、并行端口、串行端口等。

2. 网络连接存储 (Network-Attached Storage, NAS) (page 29, 32)

网络连接存储 (Network-Attached Storage, NAS)

NAS 是通过网络而非本地总线提供存储的服务。它通常由一个或多个存储设备组成,通过标准网络协议(如以太网)连接到局域网。

  • 工作方式:客户端可以通过网络远程访问服务器上的文件系统。
  • 常见协议:NFS (Network File System)、CIFS (Common Internet File System) iSCSI (Internet Small Computer System Interface) 是常用的协议。
  • 实现:通常通过远程过程调用(RPCs)实现,并通过 TCP UDP 协议在 IP 网络上运行。
  • iSCSI 协议:专门设计用于在 IP 网络上承载 SCSI 协议命令,使得基于 IP 的网络可以像 SCSI 总线一样连接存储设备。

3. 存储区域网络 (Storage Area Network, SAN) (page 29, 33)

存储区域网络 (Storage Area Network, SAN)

SAN 是一个私有网络,专门用于连接服务器和存储单元,提供块级别(block-level)的数据访问。

  • 带宽消耗SAN 在数据网络上消耗大量带宽,因此通常需要将存储流量与普通数据流量分离。
  • TCP/IP 效率TCP/IP 协议栈对于存储访问来说效率较低。
  • 高速互连与高效协议SAN 使用高速互连技术和高效的协议,例如光纤通道(FC,通常与 InfiniBand 协议结合使用,是 SAN 最常见的互连方式。
  • 共享存储:多个主机和存储阵列可以连接到同一个 SAN
  • 动态分配:存储可以动态地分配给主机。
  • 集群共享:服务器集群可以共享相同的存储资源。

通过对硬盘(HDD)和固态硬盘(SSD)每 GB 价格的历史数据分析,可以观察到:

  • HDD 价格持续下降HDD 的每 GB 成本在过去几十年中持续下降,但速度相对平缓。
  • SSD 价格快速下降SSD 的每 GB 成本在初期较高,但随着技术发展和市场扩大,其价格呈现出更快速的下降趋势。
  • 未来预测:根据数据源(Mkomo.com, Gartner, Pingdom,截至 2011 12 SSD 的每 GB 价格预计将继续快速下降,逐渐接近 HDD 的水平,使得 SSD 在更广泛的应用中具备成本效益。

RAID 结构 (RAID Structure) (page 35-47)

RAID (Redundant Array of Independent Disks)

磁盘本身是不可靠、速度慢但价格便宜的设备。RAID 的核心思想是利用多块廉价磁盘的冗余组合,以提高存储的可靠性(即使一块磁盘故障也能继续工作)和性能(通过并行读写

RAID 的实现方式有多种:

  • 操作系统(OS)实现:通过多个主机连接的磁盘在软件层面实现。
  • 硬件 RAID 控制器:专用的硬件控制器负责 RAID 的逻辑管理。
  • RAID 阵列”独立设备:作为独立的存储盒子,内置 RAID 控制器和多块磁盘。

RAID 核心技术 (Core RAID Techniques) (page 36)

RAID 技术主要结合以下三种方法:

  • 数据镜像 (Data Mirroring)
    • 在多个磁盘上保存相同的数据副本。
    • 每次写入操作都需要写入到所有镜像副本,这会增加写入时间。
  • 数据条带化 (Data Striping)
    • 将数据分成小块,并分散存储在多个磁盘上。
    • 允许并行读取,从而提高读取性能。例如,从 8 个磁盘读取一个字节的比特位。
  • 纠错码 (Error-Code Correcting, ECC) - 奇偶校验位 (Parity Bits)
    • 存储额外的信息(奇偶校验位,以便在驱动器故障时重建丢失的数据。

这些技术可以根据需要进行组合,形成不同的 RAID 级别。

RAID 级别 (RAID Levels) (page 37)

RAID 技术的不同组合被称为“级别”(更像是一种市场营销工具。常用的 RAID 级别包括:RAID 0, 1, 1+0 (10), 5, 5+0 (50), 6, 6+0 (60)。

注意RAID 2 级在实践中并不常用。

RAID 0 ( 非冗余条带化 , Non-redundant Striping) (page 38-39)

原理:将数据均匀地分散(条带化)到两个或更多磁盘上,不包含任何奇偶校验位或其他冗余信息。

特点: - 无冗余:不提供数据冗余,因此不可靠。如果任何一个磁盘发生故障,整个阵列的数据将丢失。 - 性能提升:通过并行读写,提供更高的带宽,使得读写文件时速度更快。 - 逻辑大磁盘:给用户一种更大、更快的磁盘错觉。 - 单条带访问:访问单个条带(strip)并不会更快。 - 应用场景:适用于对性能要求极高,但对数据可靠性要求不高的场景,例如临时文件存储或高性能计算的中间结果。

示例4 个磁盘,固定条带大小,5 个不同大小的文件: - 数据被拆分成条带,交替写入到四个磁盘中,充分利用了多个磁盘的并行 I/O 能力。

RAID 1 ( 镜像 , Mirroring) (page 40-41)

原理:为一套数据在两个磁盘上保存一个完全相同的副本(也称为影子拷贝,shadowing

特点: - 高可靠性:除非发生极其罕见的同步故障,否则数据可靠性得到保证。 - 磁盘利用率:需要两倍于 RAID 0 的磁盘数量来存储相同的数据量,因为数据被复制了一份。 - 写入性能:每次写入操作都必须写入到两个磁盘,写入性能可能受到限制。 - 读取性能:可以通过从寻道时间最快的磁盘(即磁臂距离目标柱面最近的磁盘)读取数据来提升读取性能。

示例4 个磁盘,5 个不同大小的文件: - 每个文件的数据都被复制到两个磁盘上,例如文件 1 数据在磁盘 1 和磁盘 2 上各有一份,文件 2 数据在磁盘 3 和磁盘 4 上各有一份。

RAID 2 ( 位交错奇偶校验 , Bit-interleaved Parity) (page 42)

原理:以位级别进行数据条带化,并使用 汉明码 (Hamming code) 进行错误纠正。

特点: - 汉明码(例如,4 位数据+3 位奇偶校验)允许使用 7 个磁盘(其中 3 个用于奇偶校验)。 - 当前不常用:在实际应用中几乎没有使用。

RAID 3 ( 位交错奇偶校验 , Bit-interleaved Parity) (page 43)

原理:数据以位级别条带化到多个磁盘上,并使用 一个专用的奇偶校验磁盘 来存储所有数据磁盘的奇偶校验信息。

特点: - 写入操作:每次写入都会涉及所有数据磁盘,每个数据磁盘存储一个比特位,并计算并存储一个奇偶校验位。 - 数据恢复:奇偶校验位用于数据恢复。

数据恢复示例4 个数据磁盘,1 个奇偶校验磁盘: - 存储比特:假设在 4 个磁盘上存储比特 0 1 1 0。 - 奇偶校验位计算:奇偶校验位为 ((0 XOR 1) XOR 1) XOR 0 = 0。 - 丢失一个比特:假设丢失了第二个比特,数据变为 0 ? 1 0。 - 可以通过将剩余比特和奇偶校验位进行异或运算来恢复丢失的比特:((0 XOR 0) XOR 1) XOR 0 = 1。因此丢失的比特是 1。 - 恢复机制:即使丢失了不同的比特(例如 0 1 1 ?,异或运算仍然有效,可以恢复丢失的比特。 - 性能:位级别条带化增加了性能。 - XOR 开销:每次写入都有奇偶校验的 XOR 计算开销(通常由硬件完成。 - 恢复时间:恢复时间相对较长,因为它需要对大量比特进行 XOR 运算。

RAID 4 ( 块交错奇偶校验 , Block-interleaved Parity) (page 44)

原理:与 RAID 3 类似,但以块(strips/blocks)级别而不是位级别进行数据条带化。仍使用一个专用的奇偶校验磁盘。

特点: - 读取:小的读取请求通常只涉及一个磁盘,提高了小文件读取的性能。 - 写入瓶颈:由于所有写入操作都必须更新同一个奇偶校验磁盘,这个专用奇偶校验磁盘会成为写入性能的瓶颈。

RAID 5 ( 块交错分布式奇偶校验 , Block-interleaved Distributed Parity) (page 44)

原理:与 RAID 4 类似,但奇偶校验信息分散(分布)到所有磁盘上,而不是集中在一个专用磁盘上。

特点: - 无写入瓶颈:通过将奇偶校验块分布在所有磁盘上,消除了 RAID 4 中专用奇偶校验磁盘的写入瓶颈,显著提高了写入性能。 - 平衡负载:读写负载更均匀地分布在所有磁盘上。 - 容错:可以容忍一个磁盘故障。

RAID 6 (P+Q 冗余 , P+Q Redundancy) (page 44)

原理:在 RAID 5 的基础上进行了扩展,增加了额外的第二个奇偶校验块。它使用两种独立的奇偶校验计算方法(通常是异或和 Reed-Solomon 编码,并将它们分布到所有磁盘上。

特点: - 更高容错:可以容忍同时发生两个磁盘故障。 - 开销:需要更多的磁盘用于冗余,并且写入操作的计算开销更大。

RAID 与文件系统 (RAID and File Systems) (page 45-47)

  • RAID 的局限性RAID 只能检测和恢复磁盘故障,但 不能防止或检测数据损坏 (data corruption) 或其他非物理性的错误。
  • Solaris ZFS 文件系统:像 Solaris ZFS(Zettabyte File System)这样的现代文件系统增加了额外的检查来检测错误:
    • Checksums ( 校验和 )ZFS 为所有文件系统数据和元数据添加校验和。
      • 校验和与指向数据 / 元数据的指针共同定位。
      • 能够检测和纠正数据和元数据的损坏。
    • 存储池 (Storage Pools)ZFS 将磁盘分配到存储池中,而不是传统的卷(volumes)或分区(partitions
      • 存储池内的文件系统共享该池的容量,并可以从池中分配 / 释放空间。
      • 这种池化存储 (Pooled Storage) 提供了更大的灵活性和简化的管理。
传统卷与池化存储对比 (Traditional vs. Pooled Storage) (page 47)
  • 传统卷和文件系统:每个文件系统(FS)都建立在一个独立的卷(volume)上,而卷又对应于一个或多个物理磁盘。这种方式灵活性较低,管理复杂。
  • ZFS 和池化存储:多个文件系统可以共享同一个存储池(storage pool,该存储池由一个或多个物理磁盘组成。这种设计使得存储资源的分配和管理更加动态和高效。

总结 (Takeaway) (page 48)

本篇文档详细探讨了大容量存储的关键概念:

  • 磁盘结构:了解磁盘的物理和逻辑组成,以及数据如何存储和寻址。
  • 磁盘调度:掌握包括 FCFS、SSTF、SCAN、C-SCAN、LOOK C-LOOK 在内的各种调度算法及其优缺点,以及它们如何优化磁盘 I/O 性能。
  • RAID:理解 RAID 技术如何通过数据条带化、镜像和奇偶校验来提高存储的性能和可靠性,并详细了解 RAID 0 RAID 6 的各个级别及其特性。此外,还探讨了 ZFS 等文件系统如何与 RAID 协同工作以提供更全面的数据保护。