Ceph FS 介绍和使用

  • 一个项目测试使用到了 CephFS,故简要整理 CephFS 资料和相关文档

CephFS

Overview

  • CephFS 应用相比于 RBD/RGW 不够广泛主要是因为文件系统采用树状结构管理数据(文件和目录)、基于查表寻址的设计理念与 Ceph 扁平化的数据管理方式、基于计算进行寻址的设计理念有些违背;其次文件系统的支持常常需要集中的元数据管理服务器来作为树状结构的统一入口,这又与 Ceph 去中心化、追求近乎无限的横向扩展能力的设计思想冲突。
  • 由于分布式文件系统的需求仍旧很大,应用场景尤为广泛,在 Ceph 不断的版本迭代中,CephFS 也取得了越来越好的支持。

背景

  • 要想实现分布式文件系统,那么就必须实现分布式文件系统的特点,即具有良好的横向扩展性,性能能够随着存储规模呈线性增长,为了实现这样的目标则需要对文件系统命名空间分而治之,即实现相应的负荷分担和负载均衡,采用相应的数据路由算法。

文件系统数据负载均衡分区

静态子树分区
  • 手工分区,数据直接分配到某个固定的服务节点,负载不均衡时再手动调整。
    20201013150928
HASH 计算分区
  • HASH 计算数据的存储位置,保证了数据分布的均衡,但如果环境变化(集群规模变化)此时需要固定原有的数据分区而减少数据的迁移,或者根据元数据的访问频率,要想保证 MDS 负载均衡,需要重新决定元数据的分布,此时则不适合使用 HASH
动态子树分区
  • 通过实时监控集群节点的负载,动态调整子树分布于不同的节点。这种方式适合各种异常场景,能根据负载的情况,动态的调整数据分布,不过如果大量数据的迁移肯定会导致业务抖动,影响性能。在元数据存储、流量控制和灵活的资源利用策略方面,动态分区比其他技术有许多优势。
  • https://ceph.com/wp-content/uploads/2016/08/weil-mds-sc04.pdf
    20201013151347
  • 动态子树分区方法的核心是将文件系统作为层次结构处理。通过将层次结构的子树的权限委托给不同的元数据服务器,对文件系统进行分区。委托可以嵌套:例如,/usr可以分配给一个MDS,而/usr/local可以分配给另一个MDS。但是,在没有显式分配子树的情况下,嵌套在某个点下的整个目录树被假定驻留在同一台服务器上。
  • 这个结构中隐含着层次结构遍历的过程,以便找到并打开嵌套的索引节点,以便随后下降到文件层次结构中。这样的路径遍历对于验证POSIX语义所要求的嵌套项的用户访问权限也是必要的,对于在目录层次结构深处定位一个文件来说,这个过程可能代价很高。
  • 为了允许有效地处理客户机请求(以及正确响应它们所需的路径遍历),每个MDS都缓存缓存中所有项的前缀索引节点,以便在任何时候缓存的层次结构子集仍然是树结构。也就是说,只有叶子项可以从缓存中过期;在目录中包含的项首先过期之前,不能删除目录。这允许对所有已知项进行权限验证,而不需要任何额外的I/O成本,并保持层次一致性。
  • 为了适应文件系统发展和工作负载变化的要求,MDS集群必须调整目录分区,以保持工作负载的最佳分布。动态分布是必要的,因为层次结构部分的大小和流行度都以一种不均匀和不可预测的方式随时间变化。通过允许MDS节点传输目录层次结构的子树的权限,元数据分区会随着时间的推移进行修改。MDS节点定期交换心跳消息,其中包括对其当前负载级别的描述。此时,忙碌的节点可以识别层次结构中适当流行的部分,并发起一个双重提交事务,将权限传递给非繁忙节点。在此交换过程中,所有活动状态和缓存的元数据都被转移到新的权威节点,这既是为了保持一致性,也是为了避免磁盘I/O,否则,新权威节点将需要磁盘I/O来重新读取它,而磁盘I/O会慢上几个数量级。

CephFS MDS 特点

  • 采用多实例消除性能瓶颈并提升可靠性
  • 采用大型日志文件和延迟删除日志机制提升元数据读写性能
  • 讲 Inode 内嵌至 Dentry 中来提升文件索引率
  • 采用目录分片重新定义命名空间层次结构,并且目录分片可以在 MDS 实例之间动态迁移,从而实现细粒度的流控和负载均衡机制
20200831094239

架构