Ceph分布式存储原理

发布时间 2023-10-27 16:30:02作者: 坚强的小蚂蚁

一. 基本介绍

1. 定义

Ceph是一个分布式存储系统(由c++编写完成,提供软件定义、统一存储解决方案),根据存储类型可分为块存储、对象存储和文件存储;它提供了一个可无限伸缩的Ceph存储集群

什么是文件存储,块存储,对象存储?

块存储简称RBD(RADOS Block Device),是一种有序的字节序块,也是在Ceph三大存储类型中最为常用的存储方式 ,Ceph的块存储是基于RADOS的,因此它也借助RADOS的快照、复制和一致性等特性提供了快照、克隆和备份等操作

参考:

https://www.cnblogs.com/luohaixian/p/8213748.html

https://blog.csdn.net/bandaoyu/article/details/109666281

2. 特点

  <1> Ceph支持对象存储、块存储和文件存储服务,故称为统一存储。
  <2> 采用CRUSH算法,数据分布均衡,并行度高,不需要维护固定的元数据结构;
  <3> 数据具有强一致,确保所有副本写入完成才返回确认,适合读多写少场景;
  <4> 去中心化,MDS之间地位相同,无固定的中心节点

Ceph存在一些缺点

 <1> 去中心化的分布式解决方案,需要提前做好规划设计,对技术团队的要求能力比较高。
 <2> Ceph扩容时,由于其数据分布均衡的特性,会导致整个存储系统性能的下降。

Ceph相比于其他存储方案的优势

<1> CRUSH算法:Crush算法是ceph的两大创新之一,简单来说,Ceph摒弃了传统的集中式存储元数据寻址的方案,转而使用CRUSH算法完成数据的寻址操作。CRUSH在一致性哈希基础上很好的考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。Crush算法有相当强大的扩展性,理论上支持数千个存储节点。

<2> 高可用:Ceph中的数据副本数量可以由管理员自行定义,并可以通过CRUSH算法指定副本的物理存储位置以分隔故障域,支持数据强一致性; Ceph可以忍受多种故障场景并自动尝试并行修复;Ceph支持多份强一致性副本,副本能够垮主机、机架、机房、数据中心存放。所以安全可靠。Ceph存储节点可以自管理、自动修复。无单点故障,容错性强。

<3> 高性能:因为是多个副本,因此在读写操作时候能够做到高度并行化。理论上,节点越多,整个集群的IOPS和吞吐量越高。另外一点Ceph客户端读写数据直接与存储设备(osd) 交互。在块存储和对象存储中无需元数据服务器。

<4> 高扩展性:Ceph不同于Swift,客户端所有的读写操作都要经过代理节点。一旦集群并发量增大时,代理节点很容易成为单点瓶颈。Ceph本身并没有主控节点,扩展起来比较容易,并且理论上,它的性能会随着磁盘数量的增加而线性增长。Ceph扩容方便、容量大。能够管理上千台服务器、EB级的容量。

<5> 特性丰富:Ceph支持三种调用接口:对象存储,块存储,文件系统挂载。三种方式可以一同使用。在国内一些公司的云环境中,通常会采用Ceph作为openstack的唯一后端存储来提升数据转发效率。Ceph是统一存储,虽然它底层是一个分布式文件系统,但由于在上层开发了支持对象和块的接口,所以在开源存储软件中,优势很明显。

二. 架构和功能模块

1. Ceph主要架构

img

RADOS(Reliable, Autonomic Distributed Object Store): ceph最底部为RADOS对象存储系统,主要由OSD和Monitor两部分组成,最终的数据存储在OSD中

Librados: 一个工具库,它允许应用程序通过访问librados来和rados系统进行交互,支持多种编程语言。如Python,C,C++等. 简单来说,就是给开发人员使用的接口。

在librados上面就是针对各个类型跟ceph集群交互的插件

  • 若是对象存储类型,必须经过 radosgw 即rados 对象网关,通过restfulAPI 形式与ceph交互,目前radosgw兼容 openstack swift api,Amzon S3 API 以及ceph原生admin API
  • 若是块存储类,ceph内部就是通过工具包librbd与应用程序进行交互
  • 对于文件存储,ceph提供工具库 libcephfs/posix相关库

2. Ceph功能模块

img

Ceph 的核心组件包括Monitor监控服务,OSD存储服务,MDS元数据服务以及客户端Client,各个核心组件功能如下:

  • Ceph OSDs: ceph OSD 守护进程,主要功能是存储数据,处理数据的复制、恢复、回填和再均衡,并通过检查其他OSD之间的心跳向Monitor提供监控信息。

  • Monitors: ceph monitor负责整个集群的监控,维护集群的健康状态,包括监视图、OSD图、归置(PG)图、和CRUSH图。

  • MDS: Ceph元数据服务为ceph文件系统存储元数据,管理目录结构。简单说就是管理数据位置,以及在何处存储新数据

  • Client: 主要负责存储协议的接入和节点负载均衡

三. Ceph 数据存储过程

参考:https://www.cnblogs.com/renyz/p/11699134.html

1. 存储过程图

img

  无论使用哪种存储方式(对象、块、文件系统),存储的数据都会被切分成Objects,它是ceph数据存储的基本单位。Objects size大小可以由管理员调整,通常为2M或4M。每个对象都会有一个唯一的OID,由ino与ono生成,虽然这些名词看上去很复杂,其实相当简单。

ino:即是文件的File ID,用于在全局唯一标识每一个文件
ono:则是分片的编号

比如:一个文件FileID为A,它被切成了两个对象,一个对象编号0,另一个编号1,那么这两个文件的oid则为A0与A1。

2. 名词解释:

  1. File —— 此处的file就是用户需要存储或者访问的文件。对于一个基于Ceph开发的对象存储应用而言,这个file也就对应于应用中的“对象”,也就是用户直接操作的“对象”。

  2. Object —— 此处的object是RADOS所看到的“对象”。Object与上面提到的file的区别是,object的最大size由RADOS限定(通常为2MB或4MB),以便实现底层存储的组织管理。因此,当上层应用向RADOS存入size很大的file时,需要将file切分成统一大小的一系列object(最后一个的大小可以不同)进行存储。

  3. PG(Placement Group)—— 顾名思义,PG的用途是对object的存储进行组织和位置映射,它是对象的集合,该集合里的所有对象都具有相同的放置策略;简单点说就是相同PG内的对象都会放到相同的硬盘上; PG是 ceph的核心概念, 服务端数据均衡和恢复的最小粒度就是PG;

    扩展:pgp( Placement Group for Placement purpose):值应与pg保持一致,当此值修改时,pg内的数据对象才会进行rebalance

    参考: https://www.cnblogs.com/luohaixian/p/9693978.html

  4. OSD —— 即object storage device。相当于LVM中的PV。OSD是负责物理存储的进程,一般配置成和磁盘一一对应,一块磁盘启动一个OSD进程;在实践当中,至少也应该是数十上百个的量级才有助于Ceph系统的设计发挥其应有的优势。

  5. Pool是存储对象的逻辑分区,类似LVM中的卷组(Volume Group)。它规定了数据冗余的类型和对应的副本分布策略;支持两种类型:副本(replicated)和 纠删码( Erasure Code);目前使用的Pool是副本类型(3副本);

  6. Image—— 对应于 LVM 的 Logical Volume,它将被条带化为 N 个子数据块,每个数据块将会被以对象(object)形式保存在 RADOS 对象存储中的简单块设备(simple block devicees)

    https://www.cnblogs.com/sammyliu/p/4843812.html

  7. CRUSH,Controlled Replication Under Scalable Hashing,它表示数据存储的分布式选择算法, ceph 的高性能/高可用就是采用这种算法实现。CRUSH 算法取代了在元数据表中为每个客户端请求进行查找,它通过计算系统中数据应该被写入或读出的位置。CRUSH能够感知基础架构,能够理解基础设施各个部件之间的关系。并CRUSH保存数据的多个副本,这样即使一个故障域的几个组件都出现故障,数据依然可用。CRUSH 算是使得 ceph 实现了自我管理和自我修复。

基于上述定义,便可以对寻址流程进行解释了。具体而言, Ceph中的寻址至少要经历以下三次映射:

  (1)File -> object映射
  (2)Object -> PG映射,hash(oid) & mask -> pgid
  (3)PG -> OSD映射,CRUSH算法

3. object, pg, osd, pool关系图:

  • 一个Pool里有很多PG,
  • 一个PG里包含一堆对象;一个对象只能属于一个PG;
  • PG有主从之分,一个PG分布在不同的OSD上(针对三副本类型)

img