2.2 文件系统规划
文件系统是操作系统中用于提供文件访问、数据组织和管理的机制。基于目录和文件名,可以对文件进行读写、打开、关闭等访问操作。我们可以通过dentry 和inode 对每个文件的存储数据进行管理:dentry 记录文件名称、上级目录等信息;inode 记录存储对象数据的属性和磁盘位置。管理主要针对磁盘资源进行,不同的文件系统会对磁盘空间进行不同方式的划分。为了给应用提供统一的文件系统接口,Linux 通过虚拟文件系统VFS 来屏蔽文件系统差异。Linux 支持几十种文件系统格式,而XFS 和ext4 是目前使用最广泛的两种文件系统格式。
Redhat 的文件系统默认使用XFS,Ubuntu 的文件系统默认使用ext4。XFS 和ext4 已经广泛使用和发展很多年,社区生态均已成熟,并且都有大量的应用实践。两者有如下共性:
● 测试和生产的案例众多,Bug 较少。
● Bug 修复周期短,在生产实践中碰到了问题,能迅速从各自的社区得到支持。
● 使用范围广、用户多。操作系统上的新特性都会较早支持这两种格式。
● 两者都是日志文件系统,都会记录文件在磁盘中的位置及磁盘元数据的任何更改。在系统崩溃时,文件系统可以快速恢复。
● ext4 通过quota 对目录进行空间限制,XFS 通过xfs_quota 对目录进行空间限制。我们可以在Kubernetes 上利用该特性来限制emptyDir 的目录大小。
● 支持对文件系统的扩容,可以满足Kubernetes 上对磁盘扩容特性的支持。
两者也有差别:
● 性能。从众多的测试结果来看,两者差距较小,在不同的方面表现各有所长。例如,对于小文件的direct I/O,XFS 性能比ext4 差;而在很多相同场景下的buffer I/O,XFS 占用CPU 的时间比ext4 占用CPU 的时间短。
● 文件大小和空间限制。ext4 支持的最大单个文件大小为16TB,文件系统容量为1EB。XFS 支持的最大单个文件大小是8EB,文件系统容量为8EB。
● 格式化。当使用 ext4 对磁盘进行格式化的时候,会根据磁盘大小对磁盘的superblock、inode 等资源进行提前预分配,所以格式化速度较慢。例如,格式化一个容量达几TB 的磁盘,可能需要10 min 以上。而XFS 在创建文件系统的时候,将其他文件系统对inode 等资源进行预分配的方式修改为动态分配,所以格式化速度较快,几十秒就可以完成一个10TB 磁盘的格式化。
● XFS 支持快照,而ext4 不支持。
在节点上,容器读写数据主要发生在外挂的网络存储或本地存储卷上,而主机的根分区空间不应该作为主要的数据读写空间提供给容器。因此,在对主机文件系统格式的选择上,稳定性和可维护性是最重要的考量因素,要尽量保持与系统的默认格式一致。在选择Kubernetes 外挂的块设备卷的文件系统格式时,选择的格式最好能与主机文件的系统格式保持一致,这样只维护一套技术栈即可。
很多热门的文件系统格式(如btrfs、zfs 等),都具有ext4 和XFS 不支持的一些特性,甚至被誉为未来的文件系统。但其使用规模和稳定性都不如ext4 和XFS,因此不建议将它们作为大规模集群下主机的文件系统格式。如果由于业务原因需要其他的文件系统格式,则可以通过给容器的外挂卷设置相应的文件系统格式来满足需求,或者可以通过裸设备使用户在容器内自由定义文件系统格式。