Ceph 是一个开源的分布式存储系统,包括对象存储、块设备、文件系统。
ceph 是一个对象(object)式存储系统,它把每一个待管理的数据流(文件等数据)切分为一到多个固定大小(默认 4 兆)的对象数据,并以其为原子单元(原子是构成元素的最小单元)完成数据的读写。
对象数据的底层存储服务是由多个存储主机(host)组成的存储集群,该集群也被称之为RADOS(reliable automatic distributed object store)存储集群,即可靠的、自动化的、分布式的对象存储系统。
librados 是 RADOS 存储集群的 API,支持 C/C++/JAVA/python/ruby/php 等编程语言客户端。
![图片[1]-ceph 架构-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2023/01/image-128.png)
块存储:需要格式化,将文件直接保存到磁盘上。
文件存储:提供数据存储的接口,是由操作系统针对块存储的应用,即由操作系统提供存储接口,应用程序通过调用操作系统将文件保存到块存储进行持久化。
对象存储:也称为基于对象的存储,其中的文件被拆分成多个部分并散布在多个存储服务器,在对象存储中,数据会被分解为称为“对象”的离散单元,并保存在单个存储库中,而不是作为文件夹中的文件或服务器上的块来保存,对象存储需要一个简单的 HTTP 应用编程接口 (API),以供大多数客户端(各种语言)使用。
分布式存储的实现:
元数据即是文件的属性信息(文件名、权限(属主、属组)、大小、更新时间等),元数据就是有一种路由机制,即当客户端或者应用程序产生的客户端数据被写入到分布式存储系统的时候,会有一个服务(NameNode)提供文件元数据的路由功能,即告诉应用程序去哪个服务器去请求文件内容,然后再有(DataNode)提供数据的读写请求及数据的高可用功能。
![图片[2]-ceph 架构-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2023/01/image-126.png)
ceph 架构
Pool:存储池、分区,存储池的大小取决于底层的存储空间。
PG(placement group):一个 pool 内部可以有多个PG 存在,pool 和 PG 都是抽象的逻辑概念,一个 pool 中有多少个 PG 可以通过公式计算。
OSD(Object Storage Daemon):每一块磁盘叫做 osd,多个 osd 组成一个主机。
存储池要先创建才能往 ceph 保存数据,文件在向 ceph 保存之前要先进行一致性 hash 计算,计算后会把文件保存在某个对应的 PG 的,某个文件一定属于某个 pool 的 PG,在通过 PG保存在 OSD 上。
数据对象在写到主 OSD 之后再同步对从 OSD 以实现数据的高可用。
![图片[3]-ceph 架构-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2023/01/image-129.png)
存储文件过程:
第一步:把文件对象映射给 PG
第二步:把文件对象映射给 OSD,
第三步:通过 OSD 写入到硬盘
监视器 mon 维护 OSD 和 PG 的集群状态
![图片[4]-ceph 架构-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2023/01/image-130.png)