引言

在当今云计算和大数据蓬勃发展的时代,存储系统的重要性不言而喻。无论是企业级数据中心、私有云平台,还是大规模的互联网应用,存储基础设施都扮演着至关重要的角色。在众多开源分布式存储解决方案中,Ceph 凭借其卓越的可扩展性、高可用性以及统一存储接口,成为了业界最受青睐的选择之一。

然而,Ceph 的强大功能背后隐藏着一套复杂而精密的技术架构。对于初学者而言,面对 RADOS、OSD、MON、MDS、PG 等一系列专业术语,往往会感到困惑。本文将系统性地梳理 Ceph 的核心概念,从基础架构出发,逐步深入探讨各个组件的职能与相互关系,帮助读者建立起对 Ceph 的全面认知。


一、Ceph 是什么?

Ceph 是一个开源的、高性能的、高可靠性的分布式存储系统,最初由 Sage Weil 在加州大学圣克鲁兹分校(UC Santa Cruz)作为博士论文项目开发,并于 2006 年正式对外发布。2012 年,Ceph 项目被 Inktank 公司商业化运营,随后在 2014 年被红帽(Red Hat)收购,成为红帽企业存储产品的核心技术基础。

Ceph 的设计目标是消除单点故障(SPOF),在廉价的商用硬件上构建高度可靠、可扩展至 EB 级别的存储系统。它能够同时提供三种存储接口:

  • 对象存储(Object Storage):兼容 Amazon S3 和 Swift API

  • 块存储(Block Storage):为虚拟机提供高性能块设备

  • 文件系统存储(File System Storage):提供符合 POSIX 标准的分布式文件系统

这种"三合一"的存储能力,使得 Ceph 在众多存储解决方案中独树一帜,也是其被广泛应用于 OpenStack、Kubernetes 等云平台的重要原因。


二、Ceph 的整体架构

在深入各个组件之前,有必要先了解 Ceph 的整体架构层次。Ceph 的架构可以划分为以下几个层次:

+-----------------------------------------------+
|         CephFS      RBD      RADOS GW          |  ← 存储接口层
+-----------------------------------------------+
|              librados / RADOS                  |  ← 核心存储层
+-----------------------------------------------+
|    OSD    OSD    OSD    OSD    OSD    OSD      |  ← 存储节点层
+-----------------------------------------------+
|    MON    MON    MON                           |  ← 监控层
+-----------------------------------------------+
|    MDS    MDS                                  |  ← 元数据层(仅CephFS)
+-----------------------------------------------+

这种分层架构确保了系统各组件的职责清晰,同时也为 Ceph 的高度可扩展性奠定了基础。接下来,我们将逐一解析各核心概念。


三、RADOS:Ceph 的核心存储引擎

RADOS(Reliable Autonomic Distributed Object Store,可靠的自主分布式对象存储)是整个 Ceph 架构的基石,也是其最重要的底层概念。可以说,理解了 RADOS,就理解了 Ceph 的灵魂。

3.1 RADOS 的设计理念

RADOS 的核心设计理念在于将存储智能分散到各个存储节点,而非集中在某个单一的控制节点上。传统存储系统通常依赖一个中央元数据服务器来管理数据的位置信息,这种设计虽然简单,但容易形成性能瓶颈和单点故障。

RADOS 采用了截然不同的方式:它利用一种称为 CRUSH 算法(后文详述)的确定性哈希机制来计算数据的存储位置,从而彻底消除了对中央元数据服务器的依赖。客户端可以直接与存储节点通信,大大提高了系统的并发处理能力。

3.2 RADOS 的自主修复能力

RADOS 中的"Autonomic"(自主)一词体现了其另一个重要特性:自我管理和自我修复。当某个存储节点发生故障时,RADOS 能够自动检测故障、重新分配数据副本,并在不需要人工干预的情况下恢复系统到健康状态。这种能力对于大规模存储系统尤为重要,因为在一个拥有数千个存储节点的集群中,硬件故障几乎是一种常态,而非异常。

3.3 librados:RADOS 的编程接口

librados 是访问 RADOS 集群的本地客户端库,支持 C、C++、Python、Java、PHP 等多种编程语言。通过 librados,应用程序可以直接操作 RADOS 集群中的对象,进行读写、快照、事务等操作。CephFS、RBD 和 RADOS Gateway 这三种上层服务,在底层都是通过 librados 与 RADOS 集群进行交互的。


四、核心组件详解

4.1 OSD:对象存储守护进程

OSD(Object Storage Daemon,对象存储守护进程)是 Ceph 集群中真正存储数据的组件。每个 OSD 通常对应一个物理磁盘(或分区、LVM 逻辑卷),负责管理该磁盘上的数据存储、复制、恢复以及心跳检测等任务。

OSD 的主要职责

数据存储与检索:OSD 接收来自客户端或其他 OSD 的读写请求,并将数据以对象的形式存储在本地文件系统之上。早期版本的 Ceph 使用 FileStore 作为底层存储引擎,而从 Ceph Luminous(12.x)版本起,BlueStore 成为默认的存储引擎,直接管理裸磁盘,绕过了操作系统文件系统层,显著提升了性能和可靠性。

数据复制:当客户端向主 OSD(Primary OSD)写入数据时,主 OSD 会将数据同步复制到其他副本 OSD(Replica OSD)。只有当所有副本都确认写入成功后,主 OSD 才会向客户端返回成功响应,从而确保数据的强一致性。

故障检测与报告:每个 OSD 都会定期向集群监视器(MON)发送心跳信号,同时也会监测邻近 OSD 的健康状态。当某个 OSD 检测到另一个 OSD 无响应时,会将这一情况报告给 MON,触发后续的故障处理流程。

数据恢复与再平衡:当有 OSD 加入或离开集群时,需要对数据进行迁移以维持均衡分布。OSD 守护进程会在后台执行这些数据迁移任务,同时尽量减少对正常 I/O 操作的影响。

OSD 的部署建议

在生产环境中,通常建议为每个物理磁盘部署一个独立的 OSD 进程,以充分发挥各磁盘的 I/O 能力。对于 SSD 和 NVMe 设备,可以考虑使用 BlueStore 的混合模式,将 WAL(Write-Ahead Log)和 DB 元数据存储在高速设备上,而将对象数据存储在大容量 HDD 上,从而在成本和性能之间取得最佳平衡。

4.2 MON:集群监视器

MON(Monitor,集群监视器)是 Ceph 集群的"大脑",负责维护整个集群的权威状态信息。MON 本身并不存储数据,但它所维护的**集群状态图(Cluster Map)**对于整个系统的正常运作至关重要。

集群状态图的组成

集群状态图由以下几部分组成:

  1. Monitor Map:记录所有 MON 节点的信息,包括地址、端口号以及当前的 epoch 编号。

  2. OSD Map:记录所有 OSD 的状态(up/down、in/out)、数据池(Pool)信息以及 PG 分配情况。

  3. PG Map:记录所有归置组(Placement Group)的状态及其 OSD 映射关系。

  4. CRUSH Map:存储集群的物理拓扑结构,指导 CRUSH 算法进行数据分布计算。

  5. MDS Map:记录 CephFS 元数据服务器(MDS)的状态信息。

MON 的 Paxos 一致性协议

为了确保集群状态信息的一致性和可靠性,Ceph 的 MON 组件采用了 Paxos 分布式一致性协议。这意味着集群中必须部署奇数个 MON 节点(通常为 3 个或 5 个),并且需要超过半数的 MON 节点达成共识,才能对集群状态进行更新。

这种设计确保了即使部分 MON 节点发生故障,集群仍然能够正常运作。例如,在 3 个 MON 节点的集群中,允许 1 个节点故障;在 5 个 MON 节点的集群中,则允许 2 个节点同时故障。

MON 与客户端的交互

客户端在访问 Ceph 集群时,首先需要向 MON 请求最新的集群状态图。一旦获取到集群状态图,客户端便可以利用 CRUSH 算法自行计算数据的位置,并直接与相应的 OSD 进行通信,无需再经过 MON 中转。这种设计有效避免了 MON 成为系统的性能瓶颈。

4.3 MDS:元数据服务器

MDS(Metadata Server,元数据服务器)是专门为 CephFS(Ceph 文件系统)设计的组件,负责管理文件系统的命名空间,包括目录结构、文件属性、权限信息等元数据。值得注意的是,MDS 只在使用 CephFS 时才需要部署,对于纯粹的对象存储或块存储场景,MDS 并非必需组件。

MDS 的动态子树分区

CephFS 采用了一种称为**动态子树分区(Dynamic Subtree Partitioning)**的技术来分配元数据管理责任。系统可以根据访问负载的变化,动态地将文件系统目录树的不同子树分配给不同的 MDS 实例管理,从而实现元数据服务的水平扩展和负载均衡。

MDS 的高可用配置

CephFS 支持主备 MDS(Active-Standby)配置模式。在这种模式下,备用 MDS 会实时同步主 MDS 的状态信息,当主 MDS 发生故障时,备用 MDS 能够快速接管,最大程度地缩短故障恢复时间。在大规模部署中,还可以配置多个活跃 MDS 实例,通过动态子树分区技术实现元数据的并行处理。

4.4 MGR:集群管理器

MGR(Manager,集群管理器)是在 Ceph Luminous 版本中引入的新组件,它弥补了 MON 在集群管理和监控方面的不足。MGR 负责收集集群的实时运行数据,并通过一套模块化的插件系统提供丰富的管理功能。

MGR 内置了多种实用模块,包括:

  • Dashboard 模块:提供 Web 界面的集群管理控制台

  • Prometheus 模块:暴露 Prometheus 格式的监控指标

  • Balancer 模块:自动优化 PG 在 OSD 之间的分布,提升集群均衡性

  • Orchestrator 模块:与 Rook、Ansible 等编排工具集成,简化集群部署和管理

  • RESTful 模块:提供 REST API 接口,便于与第三方系统集成


五、数据组织与分布机制

5.1 Pool:存储池

Pool(存储池)是 Ceph 中数据存储的逻辑命名空间。每个存储池都有自己独立的配置参数,包括:

  • 复制类型:副本(Replicated)模式或纠删码(Erasure Code)模式

  • 副本数量:在副本模式下,每份数据存储几个副本

  • PG 数量:该存储池包含多少个归置组

  • CRUSH 规则:指定数据应该分布到哪些 OSD 或特定故障域

  • 访问权限:控制哪些客户端可以读写该存储池

不同的应用场景可以使用不同的存储池,并根据需求设置不同的配置。例如,可以为关键业务数据创建 3 副本存储池,而为冷数据或备份数据创建纠删码存储池以节省存储空间。

副本模式 vs 纠删码模式

副本模式(Replicated Pool) 是最简单也是性能最高的数据保护方式。在 3 副本模式下,每份数据会在不同的 OSD 上保存 3 份完整副本,任意 2 个 OSD 故障都不会导致数据丢失。副本模式的缺点是存储空间利用率较低(3 副本意味着实际存储效率只有 33%)。

纠删码模式(Erasure Code Pool) 则通过更复杂的数学算法来提高存储效率。以 4+2 的纠删码配置为例,系统将数据分成 4 个数据块和 2 个校验块,存储在 6 个不同的 OSD 上,允许任意 2 个 OSD 同时故障而不丢失数据,而存储效率达到了 67%,远高于 3 副本模式。

5.2 PG:归置组

PG(Placement Group,归置组)是 Ceph 数据管理中最核心、也是最容易令初学者困惑的概念之一。理解 PG 对于深入掌握 Ceph 至关重要。

为什么需要 PG?

在一个大规模 Ceph 集群中,可能存在数以亿计的对象。如果集群直接跟踪每个对象与 OSD 的映射关系,管理开销将会极其巨大。PG 的引入解决了这一问题:PG 充当了对象与 OSD 之间的中间层

具体来说,每个对象通过哈希运算被映射到某个 PG,而每个 PG 则通过 CRUSH 算法被映射到一组 OSD。通过这种两级映射机制,集群只需要管理数百到数千个 PG,而无需直接追踪数亿个对象,大大降低了管理复杂度。

PG 与 OSD 的映射

一个 PG 通常被映射到多个 OSD(具体数量取决于存储池的副本数),其中一个 OSD 担任主 OSD(Primary OSD),其余的担任副本 OSD(Replica OSD)。主 OSD 负责协调该 PG 的所有读写操作和数据一致性维护。

PG 的状态机

PG 具有复杂的状态机,常见的 PG 状态包括:

  • Active+Clean:正常状态,所有副本都在线且数据一致

  • Degraded:有副本不可用,但数据未丢失

  • Undersized:活跃 OSD 数量少于期望副本数

  • Recovering:数据正在从一个 OSD 向另一个 OSD 迁移恢复

  • Backfilling:新加入的 OSD 正在接受数据迁移

  • Stale:PG 状态信息过时,通常是主 OSD 失联导致

  • Peering:PG 的各个副本 OSD 正在进行状态协商

PG 数量的规划

PG 数量的设置对集群性能有重要影响。PG 数量过少会导致数据分布不均匀,数量过多则会增加系统的管理开销。Ceph 官方建议每个 OSD 承载 100-200 个 PG 为最佳。

从 Ceph Nautilus 版本开始,引入了 pg_autoscaler 模块,可以根据集群的实际状态自动调整 PG 数量,大大简化了 PG 规划工作。

5.3 CRUSH 算法:数据分布的核心

CRUSH(Controlled Replication Under Scalable Hashing,可扩展哈希下的受控复制)是 Ceph 最具创新性的核心技术之一,也是 Ceph 区别于其他分布式存储系统的重要特征。

CRUSH 的工作原理

CRUSH 是一种伪随机数据放置算法。给定对象名称、存储池 ID 和集群状态图,CRUSH 算法能够确定性地计算出数据应该存储在哪些 OSD 上,而无需查询任何中央目录服务。这意味着:

  1. 计算过程是确定的(相同的输入永远产生相同的输出)

  2. 客户端可以在本地执行计算,无需网络查询

  3. 数据分布是随机的(近似均匀分布)

CRUSH Map 与层次结构

CRUSH Map 描述了集群的物理拓扑结构,使用树形层次结构来表示各种故障域(Failure Domain)。典型的 CRUSH 层次结构如下:

root(根节点)
  └── datacenter(数据中心)
        └── room(机房)
              └── row(机柜排)
                    └── rack(机柜)
                          └── host(主机)
                                └── OSD(磁盘)

通过 CRUSH 规则(CRUSH Rules),管理员可以指定数据副本必须分布在不同的故障域层级上。例如,可以要求 3 个副本必须分别位于不同的机架(Rack)上,从而确保即使整个机架的供电中断,也不会导致数据丢失。

CRUSH 的优势

CRUSH 算法的最大优势在于其无需中央元数据服务器的特性。这使得 Ceph 集群可以无限水平扩展,而不会因为中央服务器的性能瓶颈而受到限制。同时,CRUSH 算法还具备出色的负载均衡能力,能够将数据近似均匀地分布到所有 OSD 上。


六、三种存储接口详解

6.1 RADOS Gateway(RGW):对象存储接口

RADOS Gateway(也称为 RGW 或 Ceph Object Gateway)是建立在 librados 之上的对象存储接口,对外提供兼容 Amazon S3OpenStack Swift 的 RESTful API。

RGW 使用 HTTP/HTTPS 协议与客户端通信,支持多种认证机制,包括 S3 风格的 Access Key/Secret Key 认证以及 Swift 风格的 Keystone 认证。对于已经使用 AWS S3 API 的应用,可以通过简单修改 endpoint 配置,将数据迁移到基于 Ceph 的私有对象存储系统,实现真正意义上的云兼容性。

RGW 还支持多站点复制(Multi-site Replication)功能,可以在多个地理位置分散的 Ceph 集群之间进行数据同步,实现异地容灾和就近访问。

6.2 RBD:块存储接口

RBD(RADOS Block Device,RADOS 块设备)提供了一种高性能的分布式块存储接口,主要用于为虚拟机或容器提供持久化存储卷。

RBD 镜像(Image)是一种虚拟磁盘,其数据以对象的形式分散存储在多个 OSD 上。RBD 支持精简配置(Thin Provisioning),即按需分配实际存储空间,而非预先分配所有空间。同时,RBD 还支持快照(Snapshot)和克隆(Clone)功能,可以快速创建数据的时间点副本,是虚拟机快照和模板克隆功能的技术基础。

在访问方式上,RBD 支持两种模式:

  • 内核 RBD(krbd):通过 Linux 内核中的 rbd 模块,将 RBD 镜像映射为本地块设备(如 /dev/rbd0),性能较好但对内核版本有要求

  • librbd:通过用户空间的 librbd 库访问 RBD,QEMU/KVM 等虚拟化平台通常采用这种方式,避免了内核模块的依赖

6.3 CephFS:分布式文件系统

CephFS(Ceph File System)是建立在 RADOS 之上,提供符合 POSIX 标准的分布式文件系统。与 RBD 和 RGW 不同,CephFS 需要 MDS 组件来管理文件系统元数据。

CephFS 的数据和元数据分别存储在不同的存储池中。元数据(目录结构、文件属性等)存储在元数据存储池中,并由 MDS 进行缓存管理;而文件内容则存储在数据存储池中,直接由客户端通过 libcephfs 与 OSD 交互读写,绕过了 MDS 的处理路径,避免了元数据服务器成为 I/O 性能瓶颈。

CephFS 支持 Linux 内核原生挂载(通过 ceph 文件系统类型)以及 FUSE(Filesystem in Userspace)挂载,兼容性广泛,可用于需要共享文件系统访问的应用场景。


七、数据一致性与故障恢复

7.1 数据一致性模型

Ceph 采用**强一致性(Strong Consistency)**模型。当客户端向主 OSD 写入数据时,主 OSD 必须等待所有副本 OSD 均确认写入完成后,才会向客户端返回成功响应。这种同步写入机制确保了在任何时刻,所有副本的数据都是完全一致的,客户端不会读取到过时的数据。

为了进一步保证数据完整性,Ceph 还实现了**数据校验(Scrubbing)**机制:

  • 轻量级校验(Scrubbing):定期比对 PG 中各副本的元数据(对象大小、属性等),检测不一致性

  • 深度校验(Deep Scrubbing):比轻量级校验更彻底,逐字节比对实际数据内容,能够发现磁盘上的静默错误(Silent Data Corruption)

7.2 Peering 过程

Peering(对等协商)是 PG 在变为可用状态之前必须经历的过程。当 PG 的主 OSD 发生变化(如某个 OSD 重新上线或下线)时,该 PG 的所有副本 OSD 需要通过 Peering 过程来协商确认数据的最新状态,确保所有副本都同步到最新的一致状态,然后 PG 才能重新接受读写请求。

7.3 故障恢复流程

当某个 OSD 发生故障并被标记为 down 状态后,Ceph 的故障恢复流程如下:

  1. 故障检测:相邻 OSD 向 MON 报告目标 OSD 失联,MON 经过一定的等待时间确认故障

  2. OSD 状态更新:MON 将故障 OSD 标记为 down 并更新 OSD Map,通知所有其他 OSD

  3. PG 重新映射:受影响的 PG 进行新的主 OSD 选举,Peering 过程重新触发

  4. 数据恢复:集群开始在其他健康的 OSD 上创建缺失副本,优先恢复处于 degraded 状态的 PG

  5. 状态汇报:恢复完成后,相关 PG 重新进入 Active+Clean 状态

如果故障 OSD 长时间(默认 10 分钟)未恢复,MON 会将其标记为 out 状态,触发完整的数据再平衡流程。


八、Ceph 的典型应用场景

8.1 OpenStack 集成

Ceph 是 OpenStack 生态系统中最常用的后端存储解决方案。在典型的 OpenStack+Ceph 部署中:

  • Glance(镜像服务)使用 RBD 存储虚拟机镜像

  • Nova(计算服务)使用 RBD 作为虚拟机实例的启动卷和临时磁盘

  • Cinder(块存储服务)使用 RBD 提供持久化块存储卷

  • Swift(对象存储服务)可以被 RGW 替代

这种深度集成不仅简化了 OpenStack 的存储管理,还通过 RBD 的 COW(Copy-on-Write)克隆特性大幅加速了虚拟机的创建速度。

8.2 Kubernetes 持久化存储

在容器云领域,Ceph 通过 Rook 这一云原生存储编排器,可以在 Kubernetes 集群内部署和管理 Ceph 存储系统。Rook 将 Ceph 打包为 Kubernetes Operator,使得存储系统的生命周期管理(安装、配置、扩容、升级)都可以通过 Kubernetes 标准的声明式 API 来完成。

Ceph 为 Kubernetes 提供了三种类型的持久化卷(PV):

  • RBD:用于 ReadWriteOnce(RWO)类型的块存储

  • CephFS:用于 ReadWriteMany(RWX)类型的共享文件存储

  • RGW:用于对象存储场景

8.3 大数据与 HPC

Ceph 的高吞吐量特性使其在大数据和高性能计算场景中同样表现出色。CephFS 可以作为 Hadoop 的 HDFS 替代方案,通过 libcephfs 直接与 Hadoop 生态系统集成。同时,Ceph 的 POSIX 兼容性使其能够无缝对接各种 HPC 应用和科学计算工作负载。


九、性能优化关键点

9.1 网络规划

网络是影响 Ceph 性能的关键因素之一。建议将 Ceph 集群网络分为两个独立网络:

  • 公共网络(Public Network):用于客户端与 OSD 之间的数据传输

  • 集群网络(Cluster Network):用于 OSD 之间的数据复制和心跳通信

这种网络隔离确保了数据恢复和复制流量不会影响客户端的正常 I/O 访问。在高性能场景下,推荐使用万兆(10GbE)甚至 25GbE/100GbE 网络。

9.2 硬件选型

  • CPU:BlueStore 的压缩和校验功能对 CPU 有一定要求,建议使用多核处理器

  • 内存:每个 OSD 建议分配 2-4GB 内存,MDS 可能需要更多内存用于元数据缓存

  • 存储:SSD 或 NVMe 用于 BlueStore 的 WAL 和 DB,大容量 HDD 用于数据存储

  • 网络:如前所述,建议使用万兆以上网络

9.3 调优参数

Ceph 提供了大量可调优的参数,常见的调优方向包括:

  • 调整 OSD 并发操作数(osd_max_write_size

  • 优化 BlueStore 缓存大小

  • 根据工作负载特征选择合适的 OSD 操作队列(mClock、WPQ 等)

  • 调整 Recovery 和 Backfill 的速率限制,平衡恢复速度与正常 I/O 影响


十、Ceph 的版本演进

Ceph 的版本命名采用字母顺序的英文单词,主要里程碑版本包括:

版本代号

版本号

重要特性

Firefly

0.80

纠删码支持正式发布

Hammer

0.94

缓存分层功能完善

Jewel

10.x

RBD 镜像异地复制

Kraken

11.x

BlueStore 预览版

Luminous

12.x

BlueStore 正式默认,MGR 引入

Mimic

13.x

Dashboard v2

Nautilus

14.x

pg_autoscaler,RADOS 命名空间

Octopus

15.x

性能优化,Cephadm 引入

Pacific

16.x

多站点 RGW 增强

Quincy

17.x

MClock 调度器默认启用

Reef

18.x

最新长期支持版本


结语

Ceph 作为当今最成熟、功能最全面的开源分布式存储系统,其技术架构体现了分布式系统设计的诸多精华。从 RADOS 的自主存储引擎,到 CRUSH 算法的智能数据分布,从灵活的 PG 机制,到统一的三种存储接口,每一个设计决策背后都蕴含着深刻的工程智慧。

当然,Ceph 的学习曲线相对陡峭,要在生产环境中稳定运行 Ceph 集群,需要对其各个核心概念有深入的理解,并结合实际工作负载进行细致的调优。希望本文能够为读者提供一个系统全面的入门指引,帮助大家在 Ceph 的技术探索之路上走得更加稳健。

无论您是正在评估存储方案的架构师,还是正在学习 Ceph 的运维工程师,深入理解这些核心概念都将为您的工作带来实质性的帮助。随着 Ceph 社区的持续发展和技术迭代,这一优秀的开源项目必将在未来的云原生存储领域发挥更加重要的作用。


本文涵盖了 Ceph 的主要核心概念,如需深入了解某一具体方面,欢迎参考 Ceph 官方文档 或相关社区资源。