记录一点对 “Ceph: A Scalable, High-Performance Distributed File System” 的翻译和理解
才开始翻译,有不好的地方请见谅。
摘要
Ceph是一个分布式文件系统,它具有高效、可靠和可扩展的特性。它在不可靠的对象存储设备(OSD)上使用一种伪随机Hash算法(CRUSH)很好的分离了数据存储和元数据管理。它通过在每一个OSD都会运行一个半自治的“对象文件系统”(运行在本地文件系统之上的Ceph组件)来实现数据复制、失效检测和故障恢复。使用一个元数据集群提供高效的元数据管理,其能达到250000 ops/s。并在各种负载下都有很好的IO性能。
简介
系统设计师一直想提高文件系统的性能,因为这对大部分应用的整体性能有关键性的影响。传统的方案,想NFS[20],提供了一个直观的模型:一台服务器通过导出其文件系统信息,让多个客户端可以将这个文件系统映射到本地命名空间中。尽管其应用很广泛,但是客户端/服务器模式的固有中心化管理体系对系统的扩展性有很大的影响。
较多的现代分布式文件系统采用了基于对象的存储架构,也就是说将传统的硬盘替换为了具有智能的对象存储设备(OSDs),该设备会使用CPU、网络和本地Cache加上底层的硬盘或者RAID[4,7,8,32,35]。OSDs替换了传统的基于块分配磁盘的方案,让客户端读取或写入一段字节到一个个对象(Objects)中,打散底层硬盘块分配任务到一个个设备本身。客户端和一台元数据服务器(metadata server,MDS)交互来执行元数据操作(open, rename),和OSDs交互来执行IO操作(read, write),这样极大的提高了系统扩展性。
采用这种模型的系统由于几乎没有元数据服务器的扩展,所以一直遭遇系统扩展性限制的问题。继续依赖像块分配列表和inode表这样的传统文件系统原则,会限制系统的扩展性和性能,并且降低系统的可靠性。
Ceph,一个具有高性能和高可靠性的同时,提供前所未有的扩展性的分布式文件系统。它的架构是基于PB级分布式文件系统内部是动态的的假设:大的系统必定是逐步增长的,节点失效是常态,并且系统的负载也一直变化着。
Ceph使用通用的函数替代了块分配表来解耦数据和元数据操作。这使得Ceph可以使用OSDs提供的智能来打散复杂的数据操作(序列化更新,数据冗余,故障检测和恢复)。Ceph使用自适应的元数据集群架构来提供系统扩展性和元数据访问效率。我们将讨论在系统的目标和负载假设条件下系统架构设计的选择,分析这些选择对系统扩展性和性能的影响,以及设计一个可使用的原型系统的经验。
系统概述
Ceph文件系统有三个主要的组件:客户端(每一个客户端会暴露一个近POSIX文件系统的接口给进程);OSDs集群(存储所有的数据和元数据);MSDs集群(管理命名空间(namespace: 文件名和目录),安全性(security),一致性(consistency)和连续性(coherence)). Ceph是近POXIS接口,因为为了更好的满足应用需要和提高系统效率我们扩展了POXIS接口并选择性的对一些语义(semantics)采用了若一致性处理。
这个架构的主要目标是扩展性(大于几百PB),效率和可靠性。多维度的考虑了扩展性,包括总体存储容量,系统吞吐量,每个客户端的效率,目录效率和文件效率。我们的目标负载可能是成千上万的客户端同时读取或者写入同一个文件,或者在同一个文件夹下创建文件。这种场景在超级计算集群中的科学计算场景很常见,但也越来越多的在通用目的下见到。更重要的是,我们发现分布式文件系统的负载是动态变化的,随着时间的改变,数据和元数据的访问会有很大的不同。Ceph通过三个巧妙的设计解决了在保证可扩展性的同时获得高的效率,可靠性和可用性:数据和元数据解耦,动态分布元数据,和可靠的自治分布式对象存储。
数据和元数据解耦——Ceph最大程度上的分离了元数据管理和数据存储。元数据操作(open, rename, 等)被元数据集群管理,而客户端直接访问OSDs进行IO操作(read, write)。基于对象的存储一直以来都承诺提高系统的可扩展性。Ceph不同于那些将一个长的块分配表替换为一个短的对象分配表的对象存储,它完全的去除了分配表的使用。Ceph将数据分配到一系列可以预知的对象中,然后使用CRUSH算法[29],将对象映射到各个存储设备。这使得任何程序都可以计算出组成一个文件的对象所保存的位置,消除了对象列表的使用必要,简化了系统设计,降低了元数据服务器的负载。
动态分布的元数据管理——应为元数据操作占了一个文件系统负载的一半[22],高效的元数据管理对系统整体性能至关重要。Ceph使用了树分割的元数据集群架构(Dynamic Subtree Partitioning)[30],这种方式可以自适应的将文件目录树的管理分配到数百个MDSs。一个动态的目录树分区被一个MDS保存在本地,提高了更新效率和聚合效率。另外,元数据服务器的负载分布完全依赖与当前的访问模式,这允许Ceph在任何负载下高效的使用可用的MDS资源并且得到接近线性的扩展能力。
可靠的自治分布式对象存储——一个大的系统有几千个设备组成,这让他们天生就具有动态的特性:动态增长,新节点的加入,旧节点的退出,设备经常失效,大量的数据被创建、移动、删除。所有这些因素都需要数据的分布能自我适应以高效的使用现存的设备并且保证副本个数。Ceph将数据迁移、复制、错误检测、故障恢复的任务交给用于保存数据的OSDs集群,也就是说从更上一层看,OSDs集群提供一个单一的逻辑对象存储给客户端和元数据服务器集群。这样让Ceph能更高效的使用OSDs展现的智能得到一个可靠的、高可用的和能线性扩展的对象存储。
我们描述Ceph客户端的操作、元数据服务器的操作、分布式对象存储的操作和刚才介绍的三个特性对这些操作的作用,我们同时也描述我们的原型系统的进度。
客户端操作
我们通过对Ceph客户端的描述来介绍Ceph的总体操作,和它和应用程序之间的交互。Ceph客户端执行应用程序代码并提供文件系统接口给应用程序。在Ceph的原型系统中,Ceph客户端完全在用户空间(user space)执行,可以通过直接链接(linking)访问或者使用FUSE[25](用户空间文件系统接口)将文件系统挂载到本地。每个客户端管理自己的文件数据缓存能够提供链接访问方式使用,并且它独立于内核页(kernel page)或者缓冲缓存(buffer cache)。
文件IO和权限
客户端同步
命名空间操作
个人理解
这篇文件应该讲的是CephFS,Ceph还有其他的客户端像RADOSGW和RBD设备