OCFS2 – Linux共享磁盘集群文件系统
引言
OCFS2是一个文件系统。它允许用户存储和检索数据。数据存储在以分层目录树组织的文件中。它是POSIX兼容的文件系统,支持该规范说明的标准接口和行为语义。
它也是一个共享磁盘集群文件系统,该文件系统允许多个节点同时访问同一磁盘。这就是乐趣的开始,因为允许在多个节点上访问文件系统会打开蠕虫罐。(This is where the fun begins as allowing a file system to be accessible on multiple nodes opens a can of worms.) 如果节点具有不同的架构怎么办?如果节点在写入文件系统时挂掉,该怎么办?如果两个节点上的进程同时进行读写操作,可以期待什么样的数据一致性?如果一个节点在文件仍在另一节点上使用的同时删除了该文件怎么办?
与答案模糊的大多数共享文件系统不同,OCFS2中的答案定义非常明确。它在所有节点上的行为与本地文件系统完全相同。如果删除了文件,则将删除目录条目,但只要在整个集群中都使用它,inode就会保留。当最后一个用户关闭描述符时,将索引节点标记为删除。
数据一致性模型遵循相同的原理。它就像在两个不同节点上运行的两个进程在同一个节点上运行一样。不管使用哪种IO模式,对节点的读取都将获得最后的写入。这些模式可以是缓冲,直接,异步,拼接或内存映射的IO。它是完全高速缓存连贯的。
以REFLINK功能为例,该功能允许用户创建文件的多个可写快照。像所有其他功能一样,此功能完全支持集群。在多个节点上写入的文件可以在另一个节点上安全地重新链接。创建的快照是文件的时间点映像,其中包括文件数据及其所有属性(包括扩展属性)。
它是日记文件系统。当节点死亡时,存活节点透明地重放死亡节点的日志。这样可以确保文件系统元数据始终保持一致。它还默认使用有序数据日志记录,以确保在日志记录提交之前将文件数据刷新到磁盘,以消除崩溃后文件中出现陈旧数据的这种很小的可能性。
它是体系结构和字节序中立的。它允许在具有不同处理器(例如x86,x86_64,IA64和PPC64)的节点上并发安装。它处理大小端字节的32位和64位体系结构。
它是功能丰富的。它支持索引目录、元数据校验和、扩展属性、POSIX ACL、配额、REFLINK、稀疏文件、未写入的扩展数据和内联数据。
它与主线Linux内核完全集成。OCFS2文件系统在2006年初合并到Linux内核2.6.16中。
它可快速安装。几乎所有Linux发行版都可以使用它。文件系统在所有磁盘上都是磁盘兼容的。
它是模块化的。可以将文件系统配置为与其他集群堆栈(如Pacemaker和CMAN)以及其自己的堆栈O2CB一起运行。
它易于配置。O2CB集群堆栈配置涉及编辑两个文件,一个用于集群布局,另一个用于集群超时。
它非常有效。OCFS2文件系统消耗很少的资源。它用于在有限的内存环境(例如Xen和KVM)中存储虚拟机映像。
总之,OCFS2是一个高效,易于配置,模块化,快速安装,完全集成和兼容,功能丰富的体系结构和字节序中性,缓存一致,有序数据日志记录,符合POSIX的共享磁盘集群文件系统。
概览
OCFS2是用于Linux的通用共享磁盘集群文件系统,能够同时提供高性能和高可用性。
由于它提供了本地文件系统语义,因此几乎可以与所有应用程序一起使用。支持集群的应用程序可以利用来自多个节点的缓存一致性并行I/O轻松扩展应用程序。如果节点发生故障,其他应用程序可以利用集群工具对正在运行的应用程序进行故障转移。
OCFS2文件系统值得关注的特性有:
可调块大小
文件系统支持512、1K,2K和4K字节的块大小。几乎总是建议使用4KB。该功能在OCFS2文件系统的所有发行版中均可用。
可调簇大小
簇大小也称为分配单位。文件系统支持4K,8K,16K,32K,64K,128K,256K,512K和1M字节的簇大小。对于大多数用例,建议使用4KB。 但是,对于托管大部分都非常大的文件(例如数据库文件、虚拟机映像等)的卷,建议使用较大的值。较大的簇大小可使文件系统更有效地存储大文件。该功能在OCFS2文件系统的所有发行版中均可用。
字节序和架构中立
文件系统可以同时挂载在具有不同体系结构的节点上。像32位、64位、Little-Endian(x86,x86_64,ia64)和Big-endian(ppc64,s390x)。该功能在OCFS2文件系统的所有发行版中均可用。
缓冲、直接、异步、拼接和内存映射的I/O模式
文件系统支持所有I/O模式,以实现最大的灵活性和性能。它还支持集群范围内的共享可写mmap(2)。在所有发行版中都提供对缓冲、直接和异步I/O的支持。在Linux内核2.6.20中添加了对Splice I/O的支持,并在2.6.23中添加了对共享可写map(2)的支持。
多个集群堆栈
文件系统包括一个灵活的框架,使其可以与用户空间集群堆栈(如Pacemaker(pcmk)和CMAN(cman))、其自己的内核内集群堆栈o2cb、无集群堆栈一起工作。
所有版本均提供对o2cb集群堆栈的支持。
Linux内核2.6.20中增加了对无集群堆栈或本地挂载的支持。
Linux内核2.6.26中增加了对用户空间集群堆栈的支持。
日志记录
文件系统支持有序(默认)和回写数据日志记录模式,以在电源故障或系统崩溃时提供文件系统一致性。它在Linux内核2.6.28及更高版本中使用JBD2。它在较早的内核中使用JBD。
基于范围的分配
文件系统在集群范围内分配和跟踪空间。这与必须跟踪每个块的基于块的文件系统不同。此功能使文件系统在处理大容量文件和大文件时都非常高效。该功能在文件系统的所有发行版中均可用。
稀疏文件
稀疏文件是带有空洞的文件。使用此功能,文件系统会延迟分配空间,直到向集群发出写操作为止。此功能已添加到Linux内核2.6.22中,并且需要启用磁盘功能sparse
。
未写入的范围
未写入的范围也称为用户预分配。它允许应用程序请求在文件中分配一定范围的簇,但不初始化。预分配使文件系统可以用更少,更大的范围来优化数据布局。它还可以提高性能,延迟初始化,直到用户写入簇为止。此功能已添加到Linux内核2.6.23中,并且需要启用磁盘功能unwritten
。
打孔
打孔允许应用程序删除文件中任意分配的区域。本质上是制造孔。这比将相同范围调零更为有效。此功能在虚拟化环境中特别有用,因为它允许将Guest文件系统中的块丢弃转换为主机文件系统中的打孔,从而允许用户减少磁盘空间使用。
此功能已添加到Linux内核2.6.23中,并且需要启用磁盘功能sparse
以及unwritten
。
内联数据
内联数据也称为in-inode数据,因为它允许在inode块中存储小的文件和目录。这不仅节省了空间,而且对冷缓存目录和文件操作产生了积极影响。当数据不再适合inode块时,将透明地移出数据。此功能已添加到Linux内核2.6.24中,并且需要启用磁盘功能inline-data
。
REFLINK
REFLINK也称为快速复制。它允许用户自动(并立即)复制常规文件。换句话说,创建常规文件的多个可写快照。之所以称为REFLINK,是因为其看上去比传统快照更像(硬)链接。像链接一样,它是常规的用户操作,受限于reflinked的inode的安全性属性,而不是创建快照通常所需的超级用户特权。像链接一样,它在文件系统中运行。但是,与链接不同,它在数据范围级别上链接inode,从而使每个reflinked的inode在写入时都可以独立增长。多达40亿个inode可以共享一个数据范围。此功能已添加到Linux内核2.6.32中,并且需要启用磁盘功能引用计数(refcount
)。
分配保留
文件连续性在文件系统性能中起着重要作用。当文件在磁盘上碎片化时,对该文件的读写操作涉及许多Seek动作,从而导致吞吐量降低。另一方面,连续文件可最大程度地减少寻道,从而使磁盘以最大速率执行IO。
通过分配保留,文件系统会在位图中为所有扩展文件保留一个窗口,从而允许每个文件尽可能连续地增长。由于实际上并没有分配额外的空间,因此如有需要,其他文件可以使用它。此功能已在Linux内核2.6.35中添加,可以使用挂载选项resv_level
进行调整。
索引目录
索引目录允许用户在非常大的目录中快速查找文件。它还可以加快创建和取消链接的速度,从而提供更好的整体性能。此功能已添加到Linux内核2.6.30中,并且需要启用磁盘功能indexed-dirs
。
文件属性
这指的是EXT2样式的文件属性,例如不可变的(immutable),使用chattr
修改并使用lsattr
查询的属性。Linux内核2.6.19中添加了此功能。
扩展属性
扩展属性指的是一个name:value
对,该对可以与常规文件、目录、符号链接等文件系统对象关联。OCFS2允许每个对象关联无限数量的属性。属性名称的长度最多为255个字节,以第一个NUL字符终止。虽然不是必需的,但建议使用可打印的名称(ASCII)。属性值最多可以是64 KB的任意二进制数据。可以使用标准Linux实用程序setfattr
和getfattr
修改和列出这些属性。此功能已添加到Linux内核2.6.29中,并且需要启用磁盘功能xattr
。
元数据校验和
该功能允许文件系统检测所有元数据块(如inode和目录)中的无提示损坏。此功能已添加到Linux内核2.6.29中,并且需要启用磁盘功能metaecc
。
POSIX ACL和安全属性
POSIX ACL允许为文件和目录分配细粒度的自由访问权限。该安全方案比传统的文件访问权限(采用严格的user-group-other模型)灵活得多。
安全属性允许文件系统支持其他安全机制,例如SELinux,SMACK,AppArmor等。
这两个安全扩展都是在Linux内核2.6.29中添加的,并且需要启用磁盘功能xattr
。
用户和组配额
此功能允许通过使用诸如quota
,setquota
,quotacheck
和quotaon
之类的标准实用程序,来基于用户和用户组设置使用配额。此功能已添加到Linux内核2.6.29中,并且需要启用磁盘功能usrquota
和grpquota
。
Unix文件锁
Unix操作系统历来提供了两个系统调用来锁定文件。flock
或BSD锁以及fcntl
或POSIX锁。OCFS2将两个文件锁都扩展到了集群。在一个节点上执行的文件锁与在其他节点上执行的文件锁交互。(File locks taken on one node interact with those taken on other nodes.)
Linux内核2.6.26中增加了对集群flock
的支持。支持所有flock
选项,包括内核在用户收到适当的终止信号时取消锁定请求的功能。所有集群堆栈(包括o2cb)都支持此功能。
Linux内核2.6.28中增加了对集群fcntl
的支持。但是因为需要群组通信才能使锁连贯,所以只有用户空间集群堆栈pcmk
和cman
支持它,而默认集群堆栈o2cb不支持。
全面的工具支持
文件系统具有全面的EXT3样式的工具集,该工具集尝试使用相似的参数来简化操作。它包括mkfs.ocfs2
(格式化),tunefs.ocfs2
(调整),fsck.ocfs2
(检测),debugfs.ocfs2
(调试)等。
在线调整大小
可以使用tunefs.ocfs2
动态扩展文件系统。Linux内核2.6.25中添加了此功能。
最近变更
O2CB集群堆栈具有全局心跳模式。它允许用户指定所有节点上一致的心跳区域。集群堆栈还允许在线添加和删除节点和心跳区域。
o2cb
是新的集群配置实用程序。这是一个易于使用的实用程序,允许用户在不属于集群的节点上创建集群配置。它替换了已不推荐使用的旧实用程序o2cb_ctl
。
ocfs2console
已被淘汰。
o2info
是一个新的实用程序,可用于提供文件系统信息。它允许非特权用户查看已启用的文件系统功能,块和簇大小,扩展的文件统计信息,可用空间碎片等。
o2hbmonitor
是一个o2hb
心跳监视器。这是一种非常轻巧的实用程序,一旦心跳延迟超过警告阈值,便会将消息记录到系统记录器中。该实用程序在识别遇到I/O延迟的卷时很有用。
debugfs.ocfs2
有一些新命令。
net_stats
显示各个节点之间的o2net
消息时间。这对于确定会减慢集群操作的节点很有用。
stat_sysdir
允许用户转储可用于调试问题的整个系统目录。
grpextents
将完整的可用空间碎片转储到集群组分配器中。
mkfs.ocfs2
现在默认启用xattr
,indexed-dirs
,discontig-bg
,refcount
,extended-slotmap
和clusterinfo
特性标志,以及较旧的默认设置(稀疏sparse
,未写入unwritten
和内联数据inline-data
)。
mount.ocfs2
允许用户指定节点之间的缓存一致性级别。默认情况下,文件系统在完全一致性模式下运行,该模式还会序列化直接I/O。尽管此模式在技术上是正确的,但它限制了集群数据库中的I/O吞吐量。该安装选项允许用户将缓存一致性限制为仅缓冲的I/O,以允许多个节点对同一文件进行并发直接写入。此功能适用于Linux内核2.6.37及更高版本。
兼容性
OCFS2开发团队竭尽全力维护兼容性。它尝试在文件系统的所有发行版之间维持磁盘和网络协议的兼容性。即使在添加需要磁盘格式和网络协议更改的新功能时,它也会这样做。为了成功做到这一点,它遵循一些规则:
- 磁盘格式更改由一组可以打开和关闭的功能标志管理。内核中的文件系统在挂载期间会检测到这些功能,并且仅在了解所有功能后才继续。遇到此问题的用户可以选择禁用该功能或将文件系统升级到较新的版本。
最新版本的
ocfs2-tools
与文件系统的所有版本兼容。所有实用程序都会检测磁盘上启用的功能,并且仅在了解所有功能后才能继续。遇到此问题的用户必须将工具升级到较新的版本。节点协商网络协议版本,以确保所有节点都了解正活跃的协议版本。
功能特性标识
功能标志分为三类,即Compat,Incompat和RO Compat。
Compat,或说是Compatible/兼容,是指那种文件系统不需要完全了解即可安全地读取或写入卷的特性。其中一个示例是backup-super
功能,该功能增加了在文件系统中多个位置备份超级块的功能。由于文件系统通常不会读取或写入备份超级块,因此较早的文件系统可以在启用此功能的情况下安全地挂载卷。
Incompat,或说是Incompatible/不兼容,是指那些文件系统需要充分了解才能读取/写入卷的特性。大多数功能特性都属于此类别。
RO Compat,或说是Read-Only Compatible/只读兼容,是文件系统需要充分了解它才能写入卷的功能特性。较旧的软件可以安全地读取启用这些特性的卷。用户和组配额就是一个例子。由于仅在写入文件系统时才操作配额,因此较旧的软件可以安全地以只读模式挂载此类卷。
功能标志列表,添加它的内核版本,了解它的工具的最早版本等如下:
发表回复