磁盘 IO 出错的情况

主要观点:写读写文件的应用(不只是数据库)要考虑多种有趣场景,如数据未写入磁盘、写入错误位置、读取错误位置、数据损坏等,文中回顾两篇相关论文并介绍相关术语和可能出错情况及应对方法。
关键信息:

  • 术语:扇区(硬件最小读写单位,现代常为 4KiB)、块(文件系统/内核视图,通常为扇区大小,ext4 为 4KiB)、页(内核视图为磁盘块在内存中,数据库/应用视图为系统操作的最小单位,不同数据库默认页大小不同)。
  • 出错情况:数据未达磁盘(默认写成功是数据复制到内核内存,不保证写入磁盘,可通过 fsync 或 O_DIRECT 确保,macOS 上 fsync 是 no-op,不同数据库对 fsync 处理不同)、fsync 失败(无法确定具体写入失败,可通过特定方式处理)、数据损坏(未校验易不知,部分数据库默认校验)、部分写入(页大小等于块和扇区大小时写入才原子性,不同数据库处理方式不同)、数据未达磁盘(fsync 成功但磁盘撒谎,可通过回读或版本控制应对)、数据写入或读取错误位置(易不知,数据库和文件系统一般不处理)。
    重要细节:介绍了相关论文,提及不同系统在处理这些情况时的特点,如 Postgres、SQLite、MongoDB、MySQL 等,还给出进一步阅读的建议。
阅读 8
0 条评论