前 言
各位好,我是何韬,一名“95 后”程序员。在 2021 年冬天的一天,我在一个技术群中和朋友提到过我正在学习和整理单机文件系统的技术内容,希望能够梳理成文档。后来朋友提到为什么不考虑把这些资料系统性地整理一下,考虑出一本实体书呢?所以基于这样的建议,我在学习文件系统的时候,慢慢通过搜集和整理资料就有了这本书的雏形。当然,从写书到最终书稿内容的完善历时一年多,同时书中的内容章节也经过了多次的调整。我写完这本书稿时已经是 2023 年的春天,没想到反反复复地拖延了这么久。
我写这本书的一个目的是希望能够帮助一些对单机文件系统感兴趣的朋友进行深入学习。因为在和朋友交流的过程中发现单机文件系统的原理学习是分布式存储工程师的一个重难点,如果没有对底层文件系统的深入理解,那么在存储开发和运维过程中会碰到大量的参数需要优化调整,还有遇到生产故障等问题。
我在写这本书时也一直在思考,到底这本书要写成怎样的?市面上不乏 Linux 系统架构相关的经典书籍,但是专门讲解文件系统相关内容的,可以说很少,甚至是没有。大部分 Linux 书籍是对 vfs 的内容进行简单讲解浅尝辄止,也有一些资料是讲解如何实现一个简单的文件系统的,会在内核中注册一个自定义的文件系统,然后实现基础的创建目录操作等,然而这样的资料与分布式存储工程师的日常工作是相去甚远的,更准确地说,这样的资料比较适合做一个类似文件系统的“hello world”的demo 那样的小工具。因此在写这本书时,我希望能够结合自研单机存储引擎过程中遇到的一些困惑和感悟慢慢地分享出来。
读者对象
这本书的核心是希望能够让读者深入理解单机文件系统原理,因此对于本书的读者对象相对适合以下人群:
¾ 分布式存储工程师日常进阶学习文件系统原理。
¾ 对 Linux 文件系统感兴趣的朋友。
当然,Linux 文件系统的深入学习相较于一些热门的技术方向,如前端和大数据等,会略显小众,因此本书希望读者具备Linux 系统的操作基础知识,这是方便在学习的过程中,可以帮助理解对不同文件系统的使用命令。
如何阅读这本书
本书主要分为三大部分,其中第一部分是对 Linux 文件系统的宏观理解,主要是对文件结构和常见的文件操作语义的理解,以第一章为主要内容。第二部分则是以 zfs 为核心,深入理解 zfs
的部分模块实现和技术原理,以第二章为主要内容。第三部分则是以文件存储为核心出发,理解文件系统从单机到分布式过程的变化,还有文件系统的测试与优化等,以第三和第四章为主要内容。
我在写这本书时,已经在武汉成为一名分布式存储研发工程师,非常感谢武汉青云科技的同事,特别感谢团队同事黄蒙、宁安、肖文文、张文、黄力、杨俊、莫溢和任忠华,没有团队同事的协助和帮助,就不会有今天这本书。同时还非常感谢 Zeppelin 社区的刘勋、FastDFS 的作者余庆和《elasticsearch 源码解析与优化实战》的作者张超,以及黄亮和刘志旺先生,他们作为国内非常优秀的行业前辈,在我写本书的过程中给予了我很多的帮助和指导,十分感谢。另外还要感谢我的家里人,
非常感谢他们的理解,写书的过程是一个很大胆且有挑战性的工作,他们曾经担心我写的书是否会有读者关注,能否卖得好,等等,这也让我对于内容和细节把控有更多的思考和想法。
推 荐 语
如果只是一般使用,选择文件存储可能有比较多的空间,包括各种商业和开源的。而对于存储软件产品的研发人员,或者需要自己运维开源存储的用户,想深入理解文件存储相关技术原理,研究源码的能力就比较重要了。
由 Ceph 引领的开源分布式存储热潮还没有过去,而 Ceph并不是在各种应用场景下都是“万能”的,比如文件存储。我们看到历史悠久的 Lustre 仍然被 HPC 高性能计算行业追捧;功能特性丰富的单机文件系统 ZFS,早年以在 Solaris 和 FreeBSD平台优秀的代码质量而著称,如今移植到 Linux 后应用也变得越来越多。许多对成本敏感的用户,在分布式 Lustre 的后端,用ZFS 替代相对昂贵的传统商业 SAN 存储。
在开源项目流行的时代,经验和技巧的分享是很有价值,对整个行业都是有益的。我很高兴看到一名存储同行、“95 后”程序员何韬撰写出新书。从本书的目录章节 “初始 Linux 文件系统”——“深入理解zfs”——“文件存储从单机到分布式”——“测试与优化”,并最后落到“lustre 对 zfs 参数优化”,是很贴近实用的,希望这本书能够帮助到更多的技术同行朋友!
《企业存储技术》微信公众号作者 黄亮
2023 年春天
目 录
contents
1.初始Linux文件系统 ………………………………… 001
1.1 为什么学习文件系统… ……………………………… 001
1.2 文件语义… …………………………………………… 003
1.3 文件结构… …………………………………………… 008
1.4…file 和 inode…operation… ……………………………… 015
1.5 注册与卸载文件系统… ……………………………… 019
1.6 接口错误码… ………………………………………… 021
1.7 文件对齐和非对齐写… ……………………………… 024
1.8 文件 truncate…………………………………………… 027
1.9 文件数据写入 write… ………………………………… 035
1.10 文件打开和关闭……………………………………… 038
1.11 文件属性信息………………………………………… 041
2.深入理解zfs …………………………………………… 045
2.1…zfs 存储池设计………………………………………… 045
2.2…zfs 层次结构…………………………………………… 053
2.3…zfs 指针结构和文件结构……………………………… 056
2.4…zfs 属性 zap… ………………………………………… 062
2.5 位图与 metaslab… …………………………………… 072
2.6…zfs…SpaceMap 和 MetaSlab……………………………… 078
2.7…zfs 校验码……………………………………………… 088
2.8…zfs…缓存概念理解……………………………………… 089
2.9…zfs…缓存实现…………………………………………… 094
2.10…zfs…zil… ……………………………………………… 097
2.11…zfs 事务组… ………………………………………… 101
2.12…读请求流程代码走读………………………………… 107
2.13…zfs…zio… ……………………………………………… 116
2.14…zfs 磁盘移除… ……………………………………… 119
2.15…zfs…scrub… …………………………………………… 124
2.16…zfs…dedup……………………………………………… 126
2.17…zfs 快照… …………………………………………… 129
2.18…zfs 动态 trim… ……………………………………… 131
3.文件存储从单机到分布式 …………………………… 136
3.1 单机到分布式的架构变化… ………………………… 136
3.1.1 元数据中心架构………………………………… 136
3.1.2 无中心架构……………………………………… 139
3.2 分布式下的一致性… ………………………………… 141
3.2.1 数据广播和流式传递…………………………… 141
3.2.2 多数一致性……………………………………… 145
3.2.3 两副本可靠吗…………………………………… 147
3.3 数据和请求负载均衡… ……………………………… 150
3.3.1 leader 分散… …………………………………… 150
3.3.2 数据扩容和重平衡……………………………… 152
3.4 EC 卷…………………………………………………… 156
3.4.1 背景及原理……………………………………… 156
3.4.2 ec 和多副本差异………………………………… 158
3.5 分布式异常数据修复… ……………………………… 160
3.6 对象与文件存储差异… ……………………………… 166
4. 测试与优化 ………………………………………… 169
4.1 文件系统测试… ……………………………………… 169
4.1.1 单元测试………………………………………… 169
4.1.2 模拟真实环境测试……………………………… 171
4.1.3 生态工具测试…………………………………… 172
4.1.4 性能测试………………………………………… 175
4.2 小文件优化… ………………………………………… 177
4.3 lustre 对 zfs 参数优化… ……………………………… 178
附录引用 ……………………………………………… 179