首页 理论教育 统一存储系统Ceph的优势与设计目标

统一存储系统Ceph的优势与设计目标

时间:2023-10-17 理论教育 版权反馈
【摘要】:所谓统一存储,可以说是同时支持以上3种存储技术的一种集成式解决方案。统一存储概念的出现,需要追溯到十余年之前。在过去的十年里,统一存储发展的势头却一直不温不火。在数据存储架构中部署统一存储系统有着如下优势。(二)统一存储系统实例统一存储的一个代表实例就是Ceph。对应上面所说的Ceph的设计目标,相对于其他分布式文件系统,Ceph统一存储文件系统有以下几个设计目标。

统一存储系统Ceph的优势与设计目标

前面讨论了云存储系统的3个分类,分别是分布式文件系统存储、分布式块存储和分布式对象存储。所谓统一存储,可以说是同时支持以上3种存储技术的一种集成式解决方案。下面我们从统一存储的概念出发,结合一个统一存储的系统实例Ceph来进行描述。

(一)统一存储的概念

统一存储,实质上是一个可以支持基于文件的网络附加存储(NAS)以及基于数据块的SAN的网络化的存储架构。由于其支持不同的存储协议为主机系统提供数据存储,因此也被称为多协议存储,这些多协议系统可以通过网络连接口或者光纤通道连接到服务器上。

统一存储概念的出现,需要追溯到十余年之前。在过去的十年里,统一存储发展的势头却一直不温不火。但发展至最近两年,统一存储开始迸发出新的能量,重新成为了存储厂商之间的夺金点=

关于统一存储的定义,简而言之,就是既支持基于文件的NAS存储,包括CIFS、NFS等文件协议类型,又支持基于块数据的SAN存储,包括FC、iSCSI等访问协议,并且可由一个统一界面进行管理。

在数据存储架构中部署统一存储系统有着如下优势。

1.规划整体存储容量的能力:通过部署一个统一存储系统可以省去对文件存储容量以及数据块存储容量分别进行规划。

2.利用率可以得到提升,容量本身并没有标准限制:统一存储可以避免与分别对数据块及文件存储支持相关的容量利用率方面的问题,用户不必担心买多了支持其中一种协议而少买了支持另外一种协议的存储。

3.存储资源池的灵活性:用户可以在无须知道应用是否需要数据块或者文件数据访问的情况下,自由分配存储来满足应用环境的需要。

4.积极支持服务器虚拟化:在很多时候,用户在部署他们的服务器虚拟化环境时都会因为性能方面的要求而对基于数据块的裸设备映射(RDM)提出要求。统一存储为用户如何存储他们的虚拟机提供了选择,而无须像之前那样分别购买存储区域网络(SAN)和网络附件存储(NAS)设备。

对于需要大规模存储数据的企业来说,他们可能经常面对由应用的特殊性能要求而带来的存储系统的特殊性需求。就目前大家对统一存储使用的趋势来看,统一存储将会在许多次级应用上取代存储区域网络(SAN)以及网络附加存储CNAS)。2008年企业战略集团(ESG)的研究结果表明,用户们已经陆续开始采取统一存储,参与研究调查的人群中有70%的人表示,他们在实施或者计划开始实施统一存储的解决方案,主要的驱动力在于统一存储解决方案能带来可观的存储效率

(二)统一存储系统实例

统一存储的一个代表实例就是Ceph。Ceph是开源实现的PB级分布式文件系统,其分布式对象存储机制为上层提供了文件接口、块存储接口和对象存储接口。我们从Ceph的基本概念入手,分析其特点、设计目标,以及它的设计架构与组件,并着重对Ceph的数据分布算法做重点的介绍。

1.Ceph的设计目标与特点

Ceph最初是一项关于存储系统的PhD研究项目,由Sage Weil在University of California,Santa Cruz(UCSC)实施。

首先我们先介绍Ceph系统的设计目标,要知道,设计一个分布式文件系统需要多方面的努力,Ceph的目标可以简单定义为3个方面:

可轻松扩展到数PB容量;

可靠性

对多种工作负载的高性能(每秒输入/输出操作和带宽)。

对应上面所说的Ceph的设计目标,相对于其他分布式文件系统,Ceph统一存储文件系统有以下几个设计目标。

(1)可扩展性

Ceph的可扩充性主要体现在以下3个方面:

Ceph系统在LGPL许可下基于POSIX规范编写,具有良好的二次开发和移植性。

存储节点容量可以很容易扩展到PB级。

Ceph是一个比较通用的文件系统,不像GFS针对大文件的场合比较适合,其对大部分workloads比较适合。

(2)性能和可靠性

可扩展性和性能之间必然有一种平衡,Ceph的存储节点的扩展带来性能降低呈现的是一种非线性的降低。而其可靠性也和目前的分布式系统一样采用N-way副本策略。但它也有自己的特点,即元数据不采用单一节点方式,而采用集群方式,对热点节点的元数据同样也采用了多副本策略。

(3)负载均衡

负载均衡策略主要体现在元数据和存储节点上。元数据集群中,热点节点的元数据会迁移到新增元数据节点上。而对于存储节点,同样会定期迁移到新增节点上,从而保证所有节点的负载均衡。

2 Ceph的系统架构与组件

Ceph系统架构可以大致划分为四部分:客户端(数据用户)、元数据服务器(缓存和同步分布式元数据)、一个对象存储集群(将数据和元数据作为对象存储,执行其他关键职能),以及集群监视器(执行监视功能)。系统概念架构如图7-12所示。

图7-12 Ceph系统概念架构

Ceph和传统的文件系统之间的重要差异之一就是,它将智能都用在了生态环境而不是文件系统上。图7-13显示了一个简单的Ceph生态系统。Ceph client是Ceph文件系统的用户。Ceph metadata daemon提供了元数据服务器,而Ceph object storage daemon提供了实际存储(对数据和元数据两者)。最后,Ceph monitor提供了集群管理。要注思的是,Ceph客户、对象存储端点、元数据服务器(根据文件系统的容量)可以有许多,而且至少有一对冗余的监视器。

图7-13 Ceph生态系统示例

(1)Ceph客户端

Ceph文件系统或者至少是客户端接口是在Linux内核中实现的。值得注意的是,在大多数文件系统中,所有的控制和智能在内核的文件系统源本身中执行。但是,在Ceph中,文件系统的智能分布在节点上,这简化了客户端接口,并为Ceph提供了大规模扩展能力。

(2)Ceph元数据服务器

Ceph元数据服务器(cmds)的工作就是管理文件系统的名称空间。虽然元数据和数据两者都存储在对象存储集群中,但两者分别管理,支持可扩展性。事实上,元数据在一个元数据服务器集群上被进一步拆分,元数据服务器能够自适应地复制和分配名称空间,避免出现热点。如图7-14所示,元数据服务器管理名称空间部分,可以(为冗余和性能)进行重叠。元数据服务器到名称空间的映射在Ceph中使用动态子树逻辑分区执行,它允许Ceph对变化的工作负载进行调整(在元数据服务器之间迁移名称空间),同时保留性能的位置。

因为每个元数据服务器只是简单地管理客户端入口的名称空间,它的主要应用就是一个智能元数据缓存(实际的元数据最终存储在对象存储集群中)。进行写操作的元数据被缓存在一个短期的日志中,它最终还是被推入物理存储器中。这个动作允许元数据服务器将最近的元数据回馈给客户(这在元数据操作中很常见)。这个日志对故障恢复也很有用:如果元数据服务器发生故障,它的日志就会被重放,保证元数据安全存储在磁盘上。(www.xing528.com)

图7-14 元数据服务器的Ceph名称空间的分区

元数据服务器管理inode空间,将文件名转变为元数据。元数据服务器将文件名转变为索引节点,文件大小和Ceph客户端用于文件I/O的分段数据。

(3)Ceph对象存储

和传统的对象存储类似,Ceph存储节点不仅包括存储,还包括智能。传统的驱动只响应来自启动者的命令。但是对象存储设备是智能设备,它能作为目标和启动者,支持与其他对象存储设备的通信和合作。

从存储角度来看,Ceph对象存储设备执行从对象到块的映射(在客户端的文件系统层中常常执行的任务)。这个动作允许本地实体以最佳方式决定怎样存储一个对象。Ceph的早期版本在一个名为EBOFS的本地存储器上实现一个自定义低级文件系统。这个系统实现一个到底层存储的非标准接口,这个底层存储已针对对象语义和其他特性(例如对磁盘提交的异步通知)调优。

(4)Ceph监视器

Ceph包含实施集群映射管理的监视器,但是故障管理的一些要素是在对象存储本身中执行的。当对象存储设备发生故障或者添加新设备时,监视器就检测和维护一个有效的集群映射。这个功能按一种分布的方式执行,这种方式中映射升级可以和当前的流量通信。Ceph使用1Paxos,它是一系列分布式共识算法。

3.Ceph的数据分布算法解析

从Ceph的原始论文《Ceph:Reliable,Scalable,and High-Performance Distributed Storage》来看,Ceph专注于扩展性、高可用性和容错性。Ceph放弃了传统的Metadata查表方式(HDFS),而改用算法(CRUSH)去定位具体的block,现在我们详细剖析一下Ceph的数据分布算法——CRUSH(Controlled Replication Under Scalable Hashing)算法。

CRUSH是Ceph的一个模块,主要解决可控、可扩展、去中心化的数据副本分布问题。它能够在层级结构的存储集群中有效地分布对象的副本。CRUSH实现了一种伪随机(确定性)的函数,它的参数是object id或object group id,并返回一组存储设备(用于保存object副本)。CRUSH需要Cluster map(描述存储集群的层级结构)和副本分布策略(rule)。

CRUSH算法通过每个设备的权重来计算数据对象的分布。对象分布是由Cluster map和data distribution policy决定的。Cluster map描述了可用存储资源和层级结构(比如有多少个机架,每个机架上有多少个服务器,每个服务器上有多少个磁盘)。data distribution policy由placement rules组成。rule决定了每个数据对象有多少个副本,以及这些副本存储的限制条件(比如3个副本放在不同的机架中)。

CRUSH算出x到一组0SD集合(0SD是对象存储设备):

(osdO,osdl,osd2...osdn)=CRUSH(x)

CRUSH利用多参数HASH函数,HASH函数中的参数包括x,使得从x到OSD集合是确定和独立的。CRUSH只使用了cluster map、placement rules、x。CRUSH是伪随机算法,相似输入的结果之间没有相关性。

(1)层级的Cluster map

Cluster map由Device和Bucket组成,它们都有ID和权重值。Bucket可以包含任意数量Item。Item可以都是Devices或者Buckets。管理员控制存储设备的权重。权重和存储设备的容量有关。Bucket的权重被定义为它所包含所有item的权重之和。CRUSH基于4种不同的Bucket Type,每种有不同的选择算法。

(2)副本分布

副本在存储设备上的分布影响数据的安全。Cluster map反映了存储系统的物理结构。CRUSH placement policies决定把对象副本分布在不同的区域(某个区域发生故障时并不会影响其他区域)。每个rule包含一系列操作(用在层级结构上)。

这些操作如下。

1)tack(a):选择一个Item,、一般是Bucket,并返回Bucket所包含的所有Item。这些Item是后续操作的参数,这些Item组成向量i。

2)select(n,t):迭代操作每个Item(向量i中的Item),对于每个Item(向量i中的Item)向下遍历(遍历这个Item所包含的Item),都返回n个不同的Item(Type为t的Item),并把这些Item都放到向量i中。select函数会调用c(r,x)函数,这个函数会在每个Bucket中伪随机选择一个Item。

3)emit:把向量i放到result中。

存储设备有一个确定的类型。每个Bucket都有Type属性值,用于区分不同的Bucket类型(比如row、rack、host等,Type可以自定义)。rules可以包含多个take和emit语句块,这样就允许从不同的存储池中选择副本的storage target。

(3)冲突、故障、超载

Select(n,t)操作会循环选择第r=1,…,n个副本,r作为选择参数。在这个过程中,假如选择到的Item遇到3种情况(冲突、故障、超载)时,CRUSH会拒绝选择这个Item,并使用r'(r'和r,出错次数、firstn参数有关)作为选择参数重新选择Item。

1)冲突:这个Item已经在向量i中,已被选择。

2)故障:设备发生故障,不能被选择。

3)超载:设备使用容量超过警戒线,没有剩余空间保存数据对象。

故障设备和超载设备会在cluster map上标记(还留在系统中),这样避免了不必要的数据迁移。

(4)MAP改变和数据迁移

当添加移除存储设备,或有存储设备发生故障时(cluster map发生改变时),存储系统中的数据会发生迁移。好的数据分布算法可以最小化数据迁移大小。(5)Bucket的类型

CRUSH映射算法解决了效率和扩展性这两个矛盾的目标。而且当存储集群发生变化时,可以最小化数据迁移,并重新恢复平衡分布。CRUSH定义了四种具有不同算法的Buckets。每种Bucket基于不同的数据结构,并有不同的c(r,x)伪随机选择函数。

不同的Bucket有不同的性能和特性。

1)Uniform Buckets:适用于具有相同权重的Item,而且Bucket很少添加删除Item。它的查找速度是最快的。

2)List Buckets:它的结构是链表结构,所包含的Item可以具有任意的权重。CRUSH从表头开始查找副本的位置,它先得到表头Item的权重Wh、剩余链表中所有Item的权重之和Ws,然后根据hash(x,r,item)得到一个[0~1]的值v,假如这个值v在[0-Wh/Ws]之中,则副本在表头Item中,并返回表头Item的ID。否则继续遍历剩余的链表。

3)Tree Buckets:其结构如图7-15所示,链表的查找复杂度是0(n),决策树的查找复杂度是O(log n)。Item是决策树的叶子节点,决策树中的其他节点知道它左右子树的权重,节点的权重等于左右子树的权重之和。CRUSH从root节点开始查找副本的位置,它先得到节点的左子树的权重W1,得到节点的权重Wn,然后根据hash(x,r,node_id)得到一个[0~1]的值v,假如这个值v在[0~W1/Wn)中,则副本在左子树中,否则在右子树中。继续遍历节点,直到到达叶子节点。Tree Bucket的关键是当添加删除叶子节点时,决策树中的其他节点的node id不变。决策树中节点的node id的标识是根据对二叉树的中序遍历来决定的(node_id不等于Item的ID,也不等于节点的权重)。

图7-15 Tree Buckets的结构

4)Straw Buckets:这种类型让Bucket所包含的所有Item公平地竞争(不像list和tree一样需要遍历)。这种算法就像抽签一样,所有的Item都有机会被抽中(只有最长的签才能被抽中)。每个签的长度是由length=f(Wi*hash(x,r,i)决定的,f(Wi)和item的权重有关,i是item的id号。c(r,x)=MAXi(Wi*hash(x,r,i)。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈