在从方案演进及变迁的较为宏观角度对比了分布式存储系统的有中心架构与无中心架构寻址方式之后,本小节将深入Ceph 存储系统的数据寻址方案,进行详细介绍。
在 PB 级数据存储和成百上千台存储服务器纳管的需求背景下,大规模分布式存储系统必须做到数据和负载的均衡分布,以此来提高资源利用率,最大化系统的性能输出,同 时要处理好系统的扩展和硬件失效问题。Ceph设计了一套 CRUSH 算法,用在分布式对象存储系统(RADOS)上,可以有效地将数据对象(Object)映射到存储设备(OSD)上。CRUSH 算法能够处理存储设备的添加和移除,并最小化由于存储设备的添加和移动而导致的数据迁移。
CRUSH 算法有两个关键优点。
(1) 任何组件都可以独立计算出 Object所在的位置(去中心化)。
(2) 运算过程只需要很少的集群元数据(ClusterMap),只有当存储集群添加或删除设备时,这些元数据才会发生改变。
这些特性使得 CRUSH 适合管理对象分布非常大的(PB级别)且要求可伸缩性、性能和可靠性非常高的存储系统。
2.2.1 Ceph寻址流程
为了讲清楚 Ceph 寻址流程,这里先介绍一下常用术语。
◆ File
File 是要存储和访问的文件,它是面向用户的,也是可直观操作的对象,在块存储使用场景,File 指挂载出去使用的RBD设备;在对象存储使用场景,File指用户可见的音视频或其他格式的用户数据;在文件存储使用场景,File 指文件系统中存储的用户数据。
◆ Object
Object是 Ceph底层 RADOS所看到的对象,也是在 Ceph中数据存储的基本单位,当 File过大时,需要将File切分成统一大小的 Object进行存储,每个 Object应包含 ID、BinaryData和 Metadata信息。Object的大小可由 RADOS限定(通常为 4MB,可依据需要进行配置)。
◆ PG
PG(PlacementGroup)是一个逻辑的概念,它的用途是对 RADOS层 Object的存储进行组织和位置的映射,通过PG概念的引入,Ceph 存储系统可以更好地分配数据和定位数据,PG是 Ceph存储系统数据均衡和恢复的最小单位。
◆ Pool
Pool规定了数据冗余的类型,如副本模式、纠删码模式,对于不同冗余类型的数据存储,需要单独的 Pool划分,即每个 Pool只能对应一种数据冗余类型的规则。每个 Pool内可包含多个 PG。
◆ OSD
如第 1章介绍,OSD(ObjectStorageDevice)服务负责数据的存取,并处理数据的复制、恢复、回填、再均衡等任务。
PG和 Object 是一对多的关系,1个 PG里面组织若干个 Object,但是 1个 Object只射到 1个 PG 中。
PG和OSD是多对多的关系,1个PG会映射到多个OSD上(依照副本或者纠删码规则),每个 OSD也会承载多个 PG。
PG和 Pool是多对一的关系,1个 Pool内包含多个 PG,Pool创建时可指定其中 PG的数量(通常为2的指数次幂),Pool创建之后,也可以通过命令对其进行调整。
图 2-1展示了 Ceph 的寻址流程,可以看到,Ceph的寻址需要经历 3次映射。
图 2-1Ceph寻址流程
首先,将File切分成多个 Object。
每个Object都有唯一的ID(即OID),OID根据文件名称得到,由ino和ono构成, ino为文件唯一ID(比如filename+timestamp),ono则为切分后某个Object的序号(如0、 1、2、3、4、5等),根据该文件的大小我们就会得到一系列的OID。
其次,将每个 Object映射到一个 PG中去。
实现方式也很简单,对 OID进行 Hash 运算,然后对运算结果进行按位与计算,即可得到某一个 PG的 ID。图中的mask掩码设置为 PG的数量减 1。
我们认为得到的 pgid是随机的,这与 PG的数量和文件的数量有关系,在足够量级PG数量的前提下,集群数据是均匀分布的。最后,将 Object所在的 PG映射到实际的存储位置 OSD上。
这里应用的就是 CRUSH算法了,CRUSH算法可以通过 pgid得到多个 OSD(与副本或者纠删码的配置策略有进程。
可以看到,Ceph 存储系统的数据寻址过程只需要输入文件的名称以及文件的大小等信息,所有计算过程都可以直接在客户端本地完成。Ceph客户端只要获得了 ClusterMap, 就可以使用 CRUSH算法计算出某个 Object所在OSD的 id,然后直接与它通信。Ceph客户端在初始化时会从Monitor服务获取最新的 Cluster Map,随后采用反向订阅机制,仅当Monitor服务中记录的ClusterMap 发生变化时,才主动向Ceph 客户端进行推送。