存储系统¶
存储的核心不是“把字节写进磁盘”,而是在性能、持久性、容量与故障恢复之间定义清楚的契约。应用调用 write()、内核页缓存变脏、设备确认命令、介质真正保留数据,是四个不同事件;系统设计必须明确哪一个事件才允许向用户宣告成功。
学习路径¶
- 存储层次与块 I/O:从访问局部性、队列和页缓存建立成本模型。
- SSD 与 NVMe:理解 flash 的擦写约束、FTL、写放大和多队列接口。
- 文件系统:从 inode、目录、extent 到 journaling、CoW 与崩溃恢复。
- 数据库存储引擎:比较页式组织、B+ tree、LSM、MVCC 与 WAL。
- 缓存、日志与崩溃一致性:把易失缓存、顺序点和恢复不变量串成协议。
三个必须分开的性质¶
| 性质 | 问题 | 典型机制 |
|---|---|---|
| 原子性 | 崩溃后看到旧值还是新值,能否看到撕裂中间态 | WAL、CoW、atomic write |
| 持久性 | 返回成功的数据是否跨电源故障保留 | flush/FUA、fsync、可靠介质 |
| 顺序性 | 数据、元数据和提交记录以什么顺序可持久观察 | barrier、flush、日志协议 |
复制不是本地持久性的替代:多个副本可能同时确认仍在易失缓存中的同一错误状态。校验和也不等于冗余:它能检测损坏,却不能凭空恢复正确数据。
性能坐标¶
一次存储操作至少报告:
- 请求大小、随机/顺序、读写比例与地址分布;
- 队列深度、并发线程、同步/异步;
- buffered/direct I/O、预热与工作集;
- 吞吐、IOPS、P50/P99/P99.9 和错误;
- 持久性语义:是否
fsync、FUA、掉电保护; - 设备、文件系统、挂载选项、内核与基准时长。
\[
\mathrm{throughput}=\mathrm{IOPS}\times \mathrm{average\ request\ size}
\]
公式只是单位关系,不表示增加请求大小总能线性提速;设备并行度、控制器、总线与写放大都会成为瓶颈。