ceph存储 一文看懂目录配额(从入门到进阶,内涵完整流程和源码分析)
目录
Ceph
Ceph 是一个分布式存储系统,设计用于提供高性能、可扩展且高度可靠的存储服务。Ceph 可以提供三种主要类型的存储服务:
- RADOS Block Device (RBD):块存储,类似于传统的硬盘,为虚拟机或裸机服务器提供持久化存储。
- Ceph Object Gateway (RGW):对象存储,提供类似 Amazon S3 或 Swift 的 API 接口,适合存储大量非结构化的数据。
- Ceph File System (CephFS):分布式文件系统,提供 POSIX 兼容的文件存储,适合存储文件和目录结构。
在 CephFS 中,MDS(Metadata Server)扮演着至关重要的角色。MDS 的主要职责是管理文件系统的元数据,包括目录结构、文件属性、权限信息等。具体来说,MDS 负责以下工作:
- 目录和文件的元数据管理:MDS 保存和维护文件系统中所有目录和文件的元数据,如文件名、大小、权限、创建时间等。
- 文件系统的命名空间管理:MDS 跟踪文件系统的目录层次结构,处理文件和目录的创建、删除和重命名操作。
- 客户端请求处理:MDS 会接收来自客户端的文件系统操作请求,如打开、关闭、读取、写入文件等,并根据请求执行相应的元数据操作。
- 数据分片和定位:MDS 决定文件数据应存储在哪个 OSD(Object Storage Daemon)上,以及如何将大文件分割成多个数据块。
- 元数据的缓存:为了提高性能,MDS 会缓存元数据,减少对底层存储的访问频率。
MDS 架构设计为高可用和可扩展的,通常包含一个或多个 Active MDS 实例和一个或多个 Standby MDS 实例。Active MDS 负责处理客户端的请求,而 Standby MDS 则监听网络以检测 Active MDS 的故障。如果 Active MDS 发生故障,一个 Standby MDS 会接管其职责,从 RADOS 中重播 journal 日志,以恢复元数据状态并继续提供服务。
目录配额
在Ceph文件系统(CephFS)中,目录配额是一项功能,它允许管理员限制特定目录下可以使用的存储空间总量和/或文件数量。这项功能对于控制资源消耗和防止个别用户或应用程序过度占用共享存储资源特别有用。
CephFS 的目录配额可以通过设置扩展属性(Extended Attributes,xattrs)来实现。特别是 ceph.quota.*
xattrs,这些属性可以被附加到目录的索引节点上,以定义配额限制。
以下是如何使用 getfattr
和 setfattr
命令来查看和设置配额的一些例子:
查看配额
要检查目录是否设置了配额,可以使用 getfattr
命令。例如,要查看目录 /path/to/directory
的配额设置,可以运行:
Sh
这里 user.ceph.quota.max_bytes
表示最大字节数限制,user.ceph.quota.max_files
表示最大文件数限制。
设置配额
要设置配额,可以使用 setfattr
命令。例如,要限制目录 /path/to/directory
的存储空间不超过 1GB 和文件数量不超过 1000个,可以运行:
Sh
需要注意的是,有些情况下,CephFS 的客户端需要挂载文件系统时启用配额支持。例如,在挂载点添加 ceph.conf
文件中指定的 ceph.quota
参数,或者在挂载命令中使用 -o quota
选项。
此外,当目录达到其配额限制时,进一步的写入操作将会被拒绝,直到存储空间或文件数量释放到配额限制以下。这有助于防止个别目录或用户消耗过多的资源,确保存储资源的公平分配。
以上是目录配额的一个简单示例。
流程分析
考虑到涉及的步骤繁多,上述简化描述着重突出了关键流程。在此流程中,MDS(元数据服务器)扮演着核心协调者的角色,它汇总来自多个节点的信息,统一处理后再分发至各节点。这种设计至关重要,特别是在多节点并发操作同一目录配额的场景下。因为在单一节点环境下,系统仅能准确追踪本机的资源消耗情况,而面对跨节点的目录操作,若无统一的管理机制,很容易导致容量统计的不一致性和错误。因此,MDS的存在不仅解决了这一难题,还确保了整个系统在配额控制上的全局一致性和准确性。
简而言之,MDS通过集中管理的方式,有效避免了因节点间独立操作而导致的统计混乱,为Ceph文件系统中的目录配额实施提供了坚实的后台支撑。
关键函数分析
1. MDCache::predirty_journal_parents
最终容量增加的时候走的其实是 MDCache::predirty_journal_parents 这个函数,这个函数会被很多地方调用,例如说server,locker等地方。也就是我们写入了一个1G文件,那么最终实际添加容量的函数就是这个函数。
上面我们可以看到这里面调用了 broadcast_quota_to_client 和 project_rstat_frag_to_inode 函数,
这两个函数一个是广播函数,一个是容量的增加函数,在这个函数中还包含对父目录的遍历,去进行查找,这一块博主还没有理解,因为此时要开发的功能并不需要去遍历父目录。调用这两个函数也是这个函数关键的原因,我们如果想要开发一个和目录相似的流程那么这个函数的修改是必不可少的。
2. handle_client_setxattr
这个函数也是至关重要的一个函数,server中处理配额的一个函数就是这个函数,这个函数包含了判断各种配额以及处理配额的关键功能。
当我们在使用配额的时候,其实只需要用当上方的 if (is_ceph_vxattr(name)) 里面的代码,因为我们的类型是quota类型的,在这个判断里会进行判断,然后进去执行handle_set_vxattr函数,进行配额的设置
3. project_rstat_frag_to_inode
这个函数的主要功能是在 CephFS 中更新 inode 的 rstat
(资源统计)信息,特别是在涉及快照操作和碎片统计更新的情况下。该函数用于处理从一个片段(或多个连续片段)到 inode 的资源统计更新,这些更新可能源于数据写入、删除或其他引起资源统计变化的操作。
整个函数的核心逻辑在于根据快照片段的范围和统计信息的变化,正确地更新inode及其历史版本的统计信息,确保数据一致性。这在处理快照操作、合并快照或进行其他元数据操作时尤为重要。
同时也是处理数据增加或者减少时的较为关键的流程,如果我们需要记录文件增加的值,无疑这个地方是我们比较好的一个选择。
4. broadcast_quota_to_client
这个函数是用于我们ceph与客户端进行通信的函数,也是我们容量更新传播的一个重要函数。其中包括了容量检查,配额检查,mds的发送(但是暂时一直没被发送,很奇怪),消息的发送。
上面的这个函数就是关于配额的一些判断以及要不要去更新一下文件和广播,限制了广播不会乱发,频繁发的这种情况,使得日志中广播的信息更加精准,明确。
目录配额短暂超额的问题:
确实,MDS作为中心节点进行信息汇总与广播的设计,在带来全局一致性的同时,也引入了潜在的延迟问题。这一延迟的不确定性,尤其是当MDS的广播周期与客户端操作的时间点不匹配时,可能导致短暂的配额超限现象。例如,在设定目录配额为1GB的情况下,假设客户端正在进行连续写入操作,当累积写入量达到0.9GB时,MDS恰好进行了信息广播,更新了各节点的配额状态。然而,如果广播间隔较长,等到下一次广播时,客户端可能已经继续写入至1.1GB,此时便出现了超出配额的情况。
值得注意的是,CephFS内部确实存在一种更严格的检查机制,名为ceph_check_caps
,该机制在文件级别的限额控制中表现得更为精准,几乎能即时阻止超出配额的行为。令人好奇的是,为何在目录配额管理上并未采用相同策略。对于有深度探究兴趣的读者,建议直接探索Linux内核中Ceph的相关源码,那里隐藏着更多细节与答案,尽管本文不再深入展开。
总结
CephFs的目录配额功能展现了分布式存储系统在资源管理和优化方面的强大能力。通过深入分析源码,我们不仅理解了其背后的技术细节,也见识了Ceph如何在复杂环境中保持数据的完整性和一致性。对于希望深入了解分布式存储机制或优化存储资源管理的专业人士而言,CephFs的目录配额实现是一个值得研究的典范。
- 点赞
- 收藏
- 关注作者
评论(0)