为什么要用Ceph?
高扩展性
高性能
无单点的分布式⽂文件存储系统
可用于对象存储,块设备存储和文件系统存储
读写速度快利利于共享
一、块存储
典型设备: 磁盘阵列,硬盘
主要是将裸磁盘空间映射给主机使用的。优点:
通过Raid与LVM等手段,对数据提供了保护。
多块廉价的硬盘组合起来,提高容量。
多块磁盘组合出来的逻辑盘,提升读写效率。缺点:
采用SAN架构组网时,光纤交换机,造价成本高。
主机之间无法共享数据。使用场景:
Docker容器、虚拟机磁盘存储分配。
日志存储。
文件存储。
…
二、文件存储
典型设备: FTP、NFS服务器
为了克服块存储文件无法共享的问题,所以有了文件存储。
在服务器上架设FTP与NFS服务,就是文件存储。优点:
造价低,随便一台机器就可以了。
方便文件共享。缺点:
读写速率低。
传输速率慢。使用场景:
日志存储。
有目录结构的文件存储。
…
三、对象存储
为什么需要对象存储?
首先,一个文件包含了属性(术语叫metadata,元数据,例如该文件的大小、修改时间、存储路径等)以及内容(以下简称数据)。
例如FAT32这种文件系统,存储过程是链表的形式。
而对象存储则将元数据独立了出来,控制节点叫元数据服务器(服务器+对象存储管理软件),里面主要负责存储对象的属性(主要是对象的数据被打散存放到了那几台分布式服务器中的信息),而其他负责存储数据的分布式服务器叫做OSD,主要负责存储文件的数据部分。当用户访问对象,会先访问元数据服务器,元数据服务器只负责反馈对象存储在哪些OSD,假设反馈文件A存储在B、C、D三台OSD,那么用户就会再次直接访问3台OSD服务器去读取数据。
这时候由于是3台OSD同时对外传输数据,所以传输的速度就加快了。当OSD服务器数量越多,这种读写速度的提升就越大,通过此种方式,实现了读写快的目的。
另一方面,对象存储软件是有专门的文件系统的,所以OSD对外又相当于文件服务器,那么就不存在文件共享方面的困难了,也解决了文件共享方面的问题。
所以对象存储的出现,很好地结合了块存储与文件存储的优点。典型设备: 内置大容量硬盘的分布式服务器(Swift, S3)
多台服务器内置大容量硬盘,安装上对象存储管理软件,对外提供读写访问功能。优点:
具备块存储的读写高速。
具备文件存储的共享等特性。使用场景: (适合更新变动较少的数据)
图片存储。
视频存储。
四、ceph数据的存储过程
image.png无论使用哪种存储方式(对象、块、挂载),存储的数据都会被切分成对象(Objects)。Objects size大小可以由管理员调整,通常为2M或4M。每个对象都会有一个唯一的OID,由ino与ono生成,虽然这些名词看上去很复杂,其实相当简单。ino即是文件的File ID,用于在全局唯一标示每一个文件,而ono则是分片的编号。比如:一个文件FileID为A,它被切成了两个对象,一个对象编号0,另一个编号1,那么这两个文件的oid则为A0与A1。Oid的好处是可以唯一标示每个不同的对象,并且存储了对象与文件的从属关系。由于ceph的所有数据都虚拟成了整齐划一的对象,所以在读写时效率都会比较高。
但是对象并不会直接存储进OSD中,因为对象的size很小,在一个大规模的集群中可能有几百到几千万个对象。这么多对象光是遍历寻址,速度都是很缓慢的;并且如果将对象直接通过某种固定映射的哈希算法映射到osd上,当这个osd损坏时,对象无法自动迁移至其他osd上面(因为映射函数不允许)。为了解决这些问题,ceph引入了归置组的概念,即PG。
PG是一个逻辑概念,我们linux系统中可以直接看到对象,但是无法直接看到PG。它在数据寻址时类似于数据库中的索引:每个对象都会固定映射进一个PG中,所以当我们要寻找一个对象时,只需要先找到对象所属的PG,然后遍历这个PG就可以了,无需遍历所有对象。而且在数据迁移时,也是以PG作为基本单位进行迁移,ceph不会直接操作对象。
对象时如何映射进PG的?还记得OID么?首先使用静态hash函数对OID做hash取出特征码,用特征码与PG的数量去模,得到的序号则是PGID。由于这种设计方式,PG的数量多寡直接决定了数据分布的均匀性,所以合理设置的PG数量可以很好的提升CEPH集群的性能并使数据均匀分布。
最后PG会根据管理员设置的副本数量进行复制,然后通过crush算法存储到不同的OSD节点上(其实是把PG中的所有对象存储到节点上),第一个osd节点即为主节点,其余均为从节点。
1. 名词介绍
Ceph核心组件及概念介绍
核心组件 | 概念介绍 |
---|---|
Monitor | Monitor:一个Ceph集群需要多个Monitor组成的小集群,它们通过Paxos同步数据,用来保存OSD的元数据。 |
OSD | OSD:全称Object Storage Device,也就是负责响应客户端请求返回具体数据的进程。一个Ceph集群一般都有很多个OSD。 |
MDS | MDS:全称Ceph Metadata Server,是CephFS服务依赖的元数据服务。 |
Object | Object:Ceph最底层的存储单元是Object对象,每个Object包含元数据和原始数据。 |
PG | PG:全称Placement Grouops,是一个逻辑的概念,一个PG包含多个OSD。引入PG这一层其实是为了更好的分配数据和定位数据。 |
RADOS | RADOS:全称Reliable Autonomic Distributed Object Store,是Ceph集群的精华,用户实现数据分配、Failover等集群操作。 |
Librados | Librados:是Rados提供库,因为RADOS是协议很难直接访问,因此上层的RBD、RGW和CephFS都是通过librados访问的,目前提供PHP、Ruby、Java、Python、C和C++支持。 |
CRUSH | CRUSH:是Ceph使用的数据分布算法,类似一致性哈希,让数据分配到预期的地方。 |
RBD | RBD:全称RADOS block device,是Ceph对外提供的块设备服务。 |
RGW | RGW:全称RADOS gateway,是Ceph对外提供的对象存储服务,接口与S3和Swift兼容。 |
CephFS | CephFS:全称Ceph File System,是Ceph对外提供的文件系统服务。 |