ceph基本概念

ceph提供存储的形式

  • ceph非常强大的,能提供三种存储的形式

块存储

文件存储

对象存储

ceph组件

img

1、osd(集群仓库管理员)

  • 唯一存储用户的数据的组件,存储的都是对象,数据以对象的形式存储在osd上

  • 处理数据的复制,恢复和再平衡

  • osd直接与客户端进行通信,直接io读写

  • 一个硬盘对应一个osd,新版本的ceph,osd需要使用一整块盘

  • 在ceph集群中,osd具有主从关系

    • 所有的IO请求都是主OSD完成的

    • 数据的保护和复制都是由主osd完成的

    • 负责检查数据的一致性,数据的平衡,在恢复

    • 先将数据写到主OSD上,然后主OSD复制到多个从OSD上

    • 通常是一主多从的架构

    • 从OSD

      • 被动的接收数据复制

      • 随时准备接替主OSD的服务

2、mon

  • 维护集群状态的map,唯一的访问入口

  • 保存一份集群状态映射来维护整个集群的健康状态,分别为每个组件维护映射信息,包括OSD map,mon map,PG map,crush map

    • mon map 记录集群中哪些mon节点,ip地址,端口

    • osd map 记录集群中所有的osd设备,状态(up/down)

    • pg map 记录所有归置组(placement group)的详细信息,

    • crush map 记录集群的物理拓扑架构(主机,磁盘),数据如何通过crush算法分布到osd上的规则

    • mds map 记录元数据服务器mds状态和信息

  • 所有集群节点都向mon节点汇报信息,分享他们状态中的任何变化

  • mon需要配置奇数个上

  • 客户端进行读写的时候,首先连接MON,获取最新的集群信息

3、mgr

  • 一个web界面,显示集群信息

  • 通过web管理集群

  • 通过cephadm模块 管理ceph ,cephadm shell 进入一个shell管理ceph集群(不推荐使用)

  • dashboard默认是主备模式进行部署,监听在8443端口上

4、MDS(可选组件)

  • 元数据服务器,不存储数据,存储文件的元数据

  • 使用cephfs的时候,需要安装mds

    • 元数据和数据分离,客户端先通过这个MDS找到文件的地址,然后直接去找OSD读写数据

5、RGW(rados gateway)

  • 提供对象存储接口,实现对象存储的

  • 这是一个 HTTP 网关,它提供了与 Amazon S3 或 OpenStack Swift 兼容的 RESTful API

  • 它将 HTTP 请求(如上传文件)转换为对底层 RADOS 集群(OSD)的操作。当你使用 AWS SDK 调用 S3 接口上传文件到 Ceph 时,实际上就是 RGW 在处理这个请求

  • 使得 Ceph 可以作为对象存储被 Web 应用、备份软件等直接使用

7、crush

  • 数据分布和复制算法

  • 这不是一个单独的进程,而是一种算法

  • 职责:它决定了数据该放在哪里。当你有数据要存储时,不需要一个中心化的索引表来查询数据位置,CRUSH 算法通过计算(基于设备权重、故障域等规则)就能直接计算出数据应该写在哪个 OSD 上,以及从哪个 OSD 读数据

  • 这种算法避免了传统存储系统中的元数据查询瓶颈,实现了真正的去中心化和高扩展性

8、pools(存储池)

  • 逻辑存储池,用于数据组织

  • Pool 是 Ceph 中的一个逻辑分区,用于管理不同类型的存储策略

  • 每个 Pool 可以设置自己的 PG 数量(Placement Group)、副本数(如 2 副本或 3 副本)、或者纠删码策略

9、RBD (RADOS Block Device)

  • 提供块存储服务

  • 它将 Ceph 集群的存储空间划分成一个个的“块设备”(类似于虚拟硬盘)

  • 最常见的应用是作为 OpenStack 的后端存储,或者作为 Kubernetes 的持久化存储(PV)。虚拟机(如 KVM)可以直接将 RBD 设备作为系统盘或数据盘挂载,享受快照、克隆、动态扩容等功能

10、CephFS (Ceph File System)

  • 提供分布式文件系统

  • 它利用了 MDS 管理元数据,将文件数据切碎后通过 CRUSH 算法分布到各个 OSD 上

  • 适用于需要共享目录的多个 Linux 客户端场景,例如传统的文件服务器、HPC(高性能计算)场景,或者需要共享存储的容器化应用

ceph访问流程

1、正常写入

  • 客户端访问集群中的mon,会得到集群的cluster map(mon,mgr,osd,mds等map信息),这个表包含了存储池的数量等信息

  • 客户端会根据哈希算法使用对象id和存储池的名称算出对象所在的PG

  • 客户端根据找到的PG,使用池的放置算法(CRUSH算法)得出了PG映射的一组OSD

  • 客户端通过PG-map,得出一组OSD中的主OSD节点,第一个OSD是主OSD

  • 客户端向主OSD发起IO请求,完成对象的读写,操作(客户端直接与OSD进行通信)

  • 如果是通过文件系统访问,客户端会先经过 MDS 查找文件的元数据。

  • 管理员通过 Dashboard 监控整个流程的健康状态。

2、异常写入

  • 客户端访问的monitor的时候,得到了一个cluster map,然后得到了主osd发生了异常的变化,然后选举了一个备OSD变成了临时的主OSD(monitor选举出来的主OSD),然后进行写入即可,同步其他备节点

  • 主OSD恢复了,然后这个临时的主OSD进行全量拷贝到主OSD或者是增量(新数据同步到主OSD),然后临时的主OSD变成了备OSD

  • 下一次客户端IO与旧的OSD通信(临时的主OSD)

存储池

1、什么是存储池

  • 存储池被称为ceph的逻辑分区,先要存储到池子里面去,然后存储到OSD里面去

  • 一套ceph可以有多个存储池,每个存储池存储一个或者多个对象,不同存储池中的对象是互相隔离的

  • 池子之间是隔离的

存储池的作用

  • 一个池子有一个或者多个hash bucket,每个hash桶可以存储一个或者多个对象,每个桶对应映射的OSD有存储池的规则决定(该规则被称为桶的放置规则),将hash桶称为归置组,简称PG(placement group)

    • 也就是说存储池中有多个PG(归置组)

    • 一个PG对应一个或者多个OSD,对应的OSD数量有存储池的规则和类型决定

    • 一个对象只能在一个PG上,一个PG只能在一个存储池中

    • PG映射的OSD是有CRUSH算法决定PG最后存储在哪一个OSD上,这个crush算法被称为放置规则

PG

  • 在存储池中

  • PG映射一组OSD,

  • 是由Crush算法决定的(CRUSH的存储池放置规则),对象映射到PG,是由hash算法决定的,并且是由(crush存储池放置规则中的哈希算法决定的)

存储池和PG和OSD关系图

img

数据怎么存储进去的

  • 客户端会对文件进行切片(默认一个切片大小为4M),因此文件达到ceph的时候就已经是对象(也就是片),就会得到一个oid

  • 对象产生后会根据对象存储池中的放置规则中设置哈希算法,进行计算得出存储在池中哪一个PG上面,也就是PGID

  • PG根据池的放置规则(crush算法),来得到PG映射的一组OSD,根据PG-map找到这一组OSD中的主OSD

  • 客户端向主OSD发送起IO请求,完成对对象的写入

  • 主OSD在对象写入之后,将其同步到其他的从OSD,完成一次IO请求

posted @ 2026-03-15 15:00  乔的港口  阅读(1)  评论(0)    收藏  举报