Ceph的工作原理及流程
首先介绍RADOS中最为核心的、基于计算的对象寻址机制,然后说明对象存取的工作流程,之后介绍RADOS集群维护的工作过程,最后结合Ceph的结构和原理对其技术优势加以回顾和剖析。
寻址流程:
File:用户需要存储或访问的文件。对于一个基于Ceph开发的对象存储应用而言,这个file就是对应于应用中的“对象”,也就是用户直接操作的对象。
Object:当上层应用向RADOS存入size很大的file时,需要将file切分成统一大小的一系列object进行存储。
PG(Placement Group) 它可以看成是一致性哈希中的虚拟节点,维护了一部分数据并且是数据迁移和改变的最小单位。PG的用途是对object的存储进行组织映射。具体而言,一个PG负责组织若干个object,但一个object只能被映射到一个PG中,即PG和object是”一对多”映射关系。同时一个PG会被映射到n个OSD上,而每个OSD上都会承载大量的PG,即PG与OSD是”多对多”映射关系。在生产环境中n至少为3,。
OSD:即object storage device在实践中至少应该是数十上百个才有助于Ceph系统的设计发挥其应有的优势。
failure domain:故障域
Ceph中的寻址至少要经历以下三次映射:
(1)File->object映射
这次映射的目的是将用户要操作的file,映射为RADOS能够处理的object。其映射十分简单,本质上就是按照object的最大size对file进行切分,相当于RAID中的条带化过程。
这种切分好处有二:
1.让大小不限的file变成最大size一致、可以被RADOS高效管理的object.
2.让对单一file实施的串行处理变为对多个object实施的并行化处理。
每一次切分后产生的object将获得唯一的oid,即object id .其生产方式也是线性映射,极其简单
图中,ino是待操作file的元数据,可以简单理解为该file的唯一id。ono则是由该file切分产生的某个object的序号。而oid就是将这个序号简单连缀在该file id之后得到的。举例而言,如果一个id为filename的file被切分成了三个object,则其object序号依次为0、1和2,而最终得到的oid就依次为filename0、filename1和filename2。
这里隐含的问题是:ino的唯一性必须得到保证,否则后续映射无法正常进行。
(2)Object->PG映射
在file被映射为一个或多个object之后,就需要将每个object独立地映射到一个PG中去。过程很简单,计算公式是:
hash(oid) & mask -> pgid
计算由两步组成。首先是使用Ceph系统指定的一个静态哈希函数计算oid的哈希值,将oid映射成一个近似均匀分布的伪随机数值。然后将这个伪随机数值与mask按位相与,得到最终的PG序号(pgid)。根据RADOS的设计,给定PG的总数为m(m为2的整数幂),则mask的值为m-1。因此,哈希值计算和按位与操作的整体结果事实上是从所有m个PG中近似均匀地随机选择一个。基于这一机制,当有大量object和大量PG时,RADOS能够保证object和PG之间的近似均匀映射。又因为object是由file切分而来,大部分object的size相同,因而,这一映射最终保证了,各个PG中存储的object的总数据量近似均匀。
只有在object和PG的数量较多是,这种伪随机关系的近似均匀性才能成立,Ceph的数据存储均匀性才能保证。一方面,object的最大size应该被合理配置,以使得同样数量的file能够被切分成更多的object;另一方面,Ceph也推荐PG总数量应该为OSD总数的数百倍,以保证有足够数量的PG可够映射。
(3)PG->OSD映射
第三次映射就是将作为object的逻辑组织单元的PG映射到数据的实际存储单元OSD。
RADOS采用一个名为CRUSH的算法,将PGid带入其中,然后得到一组工n个OSD。这n个OSD即共同负责存储和维护一个PG中的所有object (n通常为3)。具体到每个OSD,则由其上运行的OSD deamon负责执行映射到本地的Object在本地文件系统中的存储、访问、元数据维护等操作。
和”Object->PG”映射中采用的哈希算法不同,这个CRUSH算法的结果不是绝对不变的,主要受到两个因素影响:1.当前系统状态(宕机) 2.存储策略配置(一般不变)
之所以在此次映射中使用CRUSH算法,而不是哈希算法,原因之一是CRUSH具有上述可配置特性,可以根据管理员的配置参数决定OSD的物理位置映射策略;另一方面是CRUSH具有特殊的”稳定性”,即当系统中加入新的OSD,导致系统规模增大时,大部分PG与OSD之间的映射关系不会发生改变,只有少部分PG的映射关系会发生变化并引发数据迁移。这种可配置和稳定性Hash算法都不能提供。因此CRUSH算法也是Ceph的核心内容之一。
到此为止,Ceph通过三次映射,完成从file到object、PG、OSD整个映射过程。整个过程没有任何的全局查表操作需求。至于唯一的全局性数据结构cluster map,它的维护和操作都是轻量级的,不会对系统的可扩展性、性能等因素造成不良影响。
问:为什么要设计三层映射而不是一层?
答:如果将object直接映射到一组OSD上,如果这种算法是固定的哈希算法,则意味着一个object被固定映射在一组OSD上,当其中一个OSD损坏时,object也无法部署到新的OSD上(因为映射函数不允许)。
如果设计一个动态算法(例如CRUSH算法)来完成这一映射,结果将是各个OSD所处理的本地元数据暴增,由此带来的计算复杂度和维护工作量也是难以承受的。
综上所诉,引入PG的好处至少有二:一方面试下呢object和OSD之间的动态映射,从而为Ceph的可靠性、自动化等特性的实现留下了空间;另一方面也有效简化了数据的存储组织,大大降低了系统的维护管理开销。