Ceph 分布式存储全解析:架构 / 部署 / 池 / 认证 / 块·对象·文件存储 实战指南
前言
Ceph 是一款开源、分布式、软件定义存储(SDS),具备极高的可用性、扩展性和易用性,用于存储海量数据。Ceph 可部署在通用服务器上(x86 或 ARM 架构),并支持在同一集群内混用 x86 和 ARM 主机。
本文根据教学教材系统整理,带你从 Ceph 介绍 → 架构 → 部署 → 池管理 → 认证授权 → 块/对象/文件存储 全流程掌握 Ceph。
第 1 章 Ceph 分布式存储介绍
1.1 存储中用户角色
在一个较大的云存储环境中,存在不同职责的存储用户:
- 存储管理员:安装、配置和维护 Ceph 存储集群;培训架构师;提供弹性和恢复(复本、备份、灾难恢复);通过基础设施即代码实现自动化。
- 存储操作员:协助日常操作,主要使用 Ceph Dashboard GUI 查看和响应集群警报和统计,负责更换故障存储设备等日常任务。
- 其他角色:云操作员、自动化工程师、应用开发人员(DevOps)、服务管理员、部署工程师、应用架构师、基础架构架构师、数据中心操作员。
在不同组织中角色实施不同:电信/云服务商中"云操作员、存储操作员、基础架构架构师"通常只消费存储不维护;银行金融等场景所有角色由内部人员承担;小规模组织一个人可能承担多个角色。
1.2 Ceph 技术优势
- 采用 RADOS 系统将所有数据作为对象存储在存储池中;
- 去中心化:客户端可根据 CRUSH 算法自行计算出对象存储位置,再进行数据读写;
- 集群可自动进行扩展、数据再平衡、数据恢复。
1.3 Ceph 历史
- 2003 年,圣克鲁兹加利福尼亚大学的 Sage Weil 开发 Ceph(其博士项目一部分),初始原型约 4 万行 C++ 代码;
- 2006 年,遵循 LGPL 协议开源;
- 2012 年,Sage Weil 在 DreamHost 资助下成立 Inktank 公司提供专业服务;
- 2014 年,Inktank 并入红帽(Red Hat),成为 Ceph 存储;
- Ceph 与 Linux 内核、SUSE、OpenStack、CloudStack 等项目深度整合。
1.4 上游 Ceph 版本
Ceph 采用代号 + 版本号的发布机制,主要 LTS 版本:
| 版本 | 代号 | 发布时间 |
|---|---|---|
| 16.2.x | Pacific | 2021-03 |
| 17.2.x | Quincy | 2022-04 |
| 18.2.x | Reef | 2023-08 |
| 19.2.x | Squid | 2024-09 |
版本格式 x.y.z 含义:
x:发行周期(如 13 表示 Mimic);y:发行类型(x.0.z开发版、x.1.z候选版、x.2.z稳定版);z:发行号。
红帽企业版 Ceph(RHCS)与社区 LTS 版本生命周期一致,并提供 36 个月支持。
1.5 Ceph 架构介绍
Ceph 采用模块化分布式架构,包含:
存储后端组件:
| 组件 | 全称 | 职责 |
|---|---|---|
| MON | Monitor(监控器) | 维护集群状态映射,帮助其他守护进程协调 |
| OSD | Object Storage Device(对象存储设备) | 存储数据,处理数据复制、恢复和重新平衡 |
| MGR | Manager(管理器) | 通过浏览器 Dashboard 和 REST API 跟踪运行时指标、公开集群信息 |
| MDS | Metadata Server(元数据服务器) | 存储 CephFS 使用的元数据(非对象/块存储) |
四种访问方式:
| 访问方式 | 库 | 说明 |
|---|---|---|
| Ceph 原生 API | librados | 原生 C 库,性能最优 |
| Ceph 块设备 | librbd(RBD) | RADOS 块设备,支持精简配置、快照、克隆 |
| Ceph 对象网关 | librgw(RGW) | 兼容 S3 和 Swift API |
| Ceph 文件系统 | libcephfs(CephFS) | POSIX 接口,支持快照 |
Ceph 使用 RADOS 提供对象存储,通过 librados 封装库提供多种存储方式,外层通过 RGW(对象)、RBD(块)、CephFS(文件)将数据写入存储。
第 2 章 Ceph 部署
2.1 集群安装方式
官方推荐:
- Cephadm:基于容器部署,支持 Octopus 及以后版本,部署后可通过命令行和图形界面管理;
- Rook:基于 Kubernetes 部署,支持 Nautilus 及以后版本。
其他方式: ceph-ansible(ansible 部署)、ceph-deploy(已不维护)、DeepSea(salt 部署)、手动部署。
2.2 Ceph 服务端口
| 服务 | 端口 | 描述 |
|---|---|---|
| MON | 6789、3300 | Ceph 集群内部通信 |
| OSD | 6800-7300 | 每个 OSD 占四个端口(客户端通信、OSD 数据通信、心跳) |
| MDS | 6800-7300 | 元数据服务器通信 |
| MGR | 8443 | SSL 方式登录 Ceph 图形化页面 |
| RESTful 管理模块 | 8003 | SSL 方式与 RESTful 模块通信 |
| Prometheus | 9283/9093/9100 | 管理、告警、节点导出 |
| Grafana | 3000 | Grafana 服务 |
| RGW | 80 | RADOS 网关通信 |
| Ceph iSCSI 网关 | 9287 | iSCSI 网关通信 |
所有端口均为 TCP 协议。实验环境通常直接关闭 firewalld 和 SELinux 以降低部署难度。
2.3 Cephadm 简介
Cephadm 是一个 Ceph 全生命周期管理工具,通过"引导(bootstrapping)"创建一个包含一个 MON 和一个 MGR 的单节点集群,后续可通过自带的编排接口进行扩容、添加主机、部署服务。
- Cephadm 使用容器部署 Ceph,大大降低复杂性和包依赖性;
- Cephadm 通过 SSH 向集群添加新主机、添加存储或监控;
- 提供两个管理接口:Ceph CLI 和 Dashboard GUI。
Ceph CLI 接口:
bash
# 进入容器化 shell(安装了所有必需的 Ceph 包)
cephadm shell
[ceph: root@ceph1 /]#
# 直接运行命令
cephadm shell -- ceph status
# cluster: id: 2faf... health: HEALTH_OK
# services: mon: 3 daemons mgr: ceph2.oetbal(active)
# 常用状态查看
ceph status
ceph -s
2.4 部署 mon 和 mgr
bash
# 引导集群(创建单节点集群,含 MON + MGR)
cephadm bootstrap --mon-ip 192.168.108.11
# 查看集群状态
ceph status
2.5 部署 OSD
OSD 资源建议:
- OSD CPU 最少 1 核,每 200-500MB/s 或 1000-3000 IOPS 增加一核;
- OSD 内存 2G-4G 可实现基本功能。
bash
# 在节点上添加 OSD
ceph orch device ls # 查看可用磁盘
ceph orch apply osd --all-available-devices # 应用所有可用磁盘为 OSD
# 查看 OSD 状态
ceph osd tree
ceph osd status
2.6 部署服务
bash
ceph orch ls # 列出所有服务
ceph orch apply mon ceph2 # 在节点部署 mon
ceph orch apply mgr ceph2 # 部署 mgr
ceph orch apply osd ... # 部署 osd
第 3 章 Ceph 集群配置
3.1 配置文件
Ceph 配置文件采用 INI 文件格式 ,涵盖 Ceph 守护进程和客户端配置,位于 /etc/ceph/ceph.conf。每个部分使用 [name] 标记。
ini
[global]
fsid = 2faf683a-...
mon host = ceph1.laogao.cloud,ceph2,ceph3
[mon]
mon allow pool delete = true
[osd]
osd journal size = 1024
3.2 配置集群监控器(Monitor)
MON 维护集群状态映射(cluster map),包括 MON、OSD、MDS 信息。可通过 ceph mon dump、ceph mon stat 查看监控器状态。
3.3 配置集群网络
- 公共网络(public network):客户端与 Ceph 集群通信;
- 集群网络(cluster network):OSD 之间数据复制、心跳、再平衡流量。
配置独立 cluster 网络可减少 public 网络流量负载、与后端 OSD 运维流量分流。
ini
[global]
public network = 192.168.108.0/24
cluster network = 10.1.0.0/16
存储网络推荐配置 MTU 支持巨型帧(jumbo frame)以提升性能。
第 4 章 Ceph 池管理
4.1 Ceph 数据组织结构
POOL(资源池)
└── PG(Placement Group,放置组)
└── OSD(对象存储设备)
└── Object(对象)
- POOL(池):Ceph 存储集群的逻辑分区,用于在通用名称标签下存储对象。每个池分配特定数量的 PG。
- PG(Placement Group):构成 pool 的子集,一系列对象的集合,一个 PG 仅能属于一个 Pool。Ceph 将每个 PG 映射到一组 OSD。
PG 数量影响性能:
- PG 过多:每个 PG 维护数据量过少,Ceph 占用大量 CPU 和内存计算;
- PG 过少:单个 PG 存储数据多,移动 PG 占用大量带宽。
PG 数量原则(一般):
| OSD 数量 | PG 数量 |
|---|---|
| OSD < 5 | 128 |
| 5 < OSD < 10 | 512 |
| 10 < OSD < 50 | 4096 |
| OSD > 50 | 借助官方工具计算 |
4.2 映射对象到 OSD(CRUSH 算法)
1. 客户端从 MON 获取最新的集群映射副本(不含对象位置)
2. 计算 PG ID:PG ID = hash(Object ID) % (PG number)
3. 使用 CRUSH 算法确定 PG 负责的 OSDs(Acting Set)
- Acting Set 第一个 OSD 是主 OSD(primary),其余是辅助 OSD
4. 客户端直接与主 OSD 通信读写对象
Ceph 客户端自行计算对象存储位置,比通过组件交互查询快得多,因此数据读写时由客户端根据 CRUSH 完成位置计算。
4.3 Ceph 数据读写流程
读取流程:
1. 客户端通过 MON 获取 cluster map
2. 客户端获取主 OSD 节点信息,向其发送读取请求
3. 主 OSD 将数据返回给客户端
写入流程(强一致性,分两次确认优化):
1. 客户端通过 MON 获取 cluster map
2. 客户端向主 OSD 发送写入请求
3. 主 OSD 写入数据,并向两个备 OSD 发起写入指令
4. 备 OSD 写入后返回确认到主 OSD
5. 主 OSD 收到所有备 OSD 确认后,向客户端返回写入完成确认
优化:第一次所有数据写入 OSD 缓存后即向客户端确认;第二次所有数据从缓存写入磁盘后再确认,客户端据此删除本地数据。
4.4 数据保护(两种池类型)
| 池类型 | 原理 | 特点 |
|---|---|---|
| 复本池(replicated) | 将对象复本到多个 OSD | 需较多存储空间,冗余提高读取可用性 |
| 纠删代码池(erasure code) | 奇偶校验计算 | 需较少存储空间和带宽,但占用较多 CPU |
选择建议:
- 不频繁访问、不需要低延迟的数据 → 纠删码池;
- 频繁访问、需快速读取性能的数据 → 复本池。
⚠️ 池一旦创建完成,池的类型便无法更改。
4.5 创建池
创建复本池:
bash
ceph osd pool create pool-name pg-num pgp-num replicated crush-rule-name
# 示例
ceph osd pool create mypool 128 128 replicated
ceph osd pool ls
ceph osd pool ls detail # 查看池详情
创建纠删代码池:
bash
# 创建纠删代码配置文件
ceph osd erasure-code-profile set ec-profile k=2 m=1 crush-failure-domain=osd
# 创建纠删池
ceph osd pool create ec-pool 128 128 erasure ec-profile
# 删除池
ceph osd pool delete mypool mypool --yes-i-really-really-mean-it
第 5 章 Ceph 认证和授权管理
5.1 cephx 协议
Ceph 存储使用 cephx 协议 管理集群认证。用户账户用途:
- Ceph 守护进程之间的内部通信;
- 客户端通过 librados 库访问集群;
- 集群管理。
账户命名规则:
- 守护进程账户与进程名匹配,如
osd.1、mgr.ceph1; - librados 客户端账户以
client.前缀,如client.openstack、client.rgw.hostname; - 超级用户账户
client.admin(访问所有内容、修改集群配置)。
5.2 密钥环文件(keyring)
Ceph 创建用户账户时,为每个账户生成密钥环文件验证身份,必须复制到客户端系统或应用服务器。
- 默认位置:
/etc/ceph/$cluster.$name.keyring(如ceph.client.openstack.keyring); - 密钥环文件以纯文本存储机密密钥,需用适当 Linux 文件权限保护。
5.3 指定用户身份
bash
# 用 --id(不带 client. 前缀)指定用户
ceph --id operator3 osd lspools
# 用 --name(需 client. 前缀)
ceph --name client.operator3 osd lspools
# 密钥环在默认位置则无需 --keyring
# 可设置环境变量
export CEPH_ARGS="--id laogao"
5.4 管理用户账户
bash
# 列出所有用户账户
ceph auth list
ceph auth ls
# 获取特定账户详情
ceph auth get osd.0
# 获取密钥
ceph auth get-key client.operator3
ceph auth print-key client.operator3
# 创建用户(get-or-create)
ceph auth get-or-create client.rbd mon 'profile rbd' osd 'profile rbd' \
-o /etc/ceph/ceph.client.rbd.keyring
5.5 cephx 协议通信原理
1. client 向 MON 请求会话密钥(传递共享密钥)
2. MON 创建会话密钥,分享给 MDS 和 OSD
3. MON 使用共享密钥加密会话密钥返回给 client
4. client 解密获得会话密钥,用其向 MON 请求票据(ticket)
5. client 使用 ticket 与 MDS、OSD 交互,三者共享 MON 产生的密钥验证 ticket 合法性
第 6 章 Ceph 块存储管理(RBD)
6.1 Ceph RBD IO 流程
1. 客户端创建 pool,指定 pg 数量
2. 创建 pool/image(rbd 设备)进行挂载
3. 用户写入的数据切块(每块默认 4M,名字为 object+序号)
4. 每个 object 通过 pg 进行副本位置分配
5. pg 根据 CRUSH 算法寻找 3 个 OSD 保存 object
6. OSD 底层磁盘格式化为 xfs 文件系统
7. object 存储为 rbd0.object1.file 文件
6.2 RBD 常用命令
| 命令 | 功能 |
|---|---|
rbd create |
创建块设备映像 |
rbd ls |
列出 rbd 存储池中的块设备 |
rbd info |
查看块设备信息 |
rbd diff |
统计 rbd 使用量 |
rbd map |
映射块设备 |
rbd showmapped |
查看已映射块设备 |
rbd remove |
删除块设备 |
rbd resize |
更改块设备大小 |
6.3 创建 RBD 镜像
bash
# 1. 创建 rbd 池并初始化
ceph osd pool create images_pool
rbd pool init images_pool # 等同于 ceph osd pool application enable images_pool rbd
# 2. 创建专用受限用户(仅授 RBD 池读写权限)
ceph auth get-or-create client.rbd mon 'profile rbd' osd 'profile rbd' \
-o /etc/ceph/ceph.client.rbd.keyring
# 3. 创建 RBD 镜像
rbd create images_pool/webapp1 --size 1G
# 4. 查看
rbd ls images_pool
rbd pool stats images_pool
rbd info images_pool/webapp1
6.4 访问 RBD 块设备存储
访问方式:
- KRBD:客户端 krbd 模块将 RBD 镜像映射为 Linux 块设备;
- librbd 库:将 RBD 存储提供给 KVM 虚拟机和 OpenStack 云实例。
使用内核 RBD(KRBD)访问:
bash
# 客户端安装 ceph-common
dnf install -y ceph-common
# 从 ceph1 复制配置文件和密钥环到客户端
scp /etc/ceph/ceph.conf root@client:/etc/ceph/
scp /etc/ceph/ceph.client.rbd.keyring root@client:/etc/ceph/
# 客户端列出镜像
rbd ls images_pool --id rbd
# 映射 RBD 镜像为 /dev/rbd0
rbd map images_pool/webapp1 --id rbd
# 查看已映射
rbd showmapped
# 格式化并挂载
mkfs.xfs /dev/rbd0
mkdir /mnt/rbd
mount /dev/rbd0 /mnt/rbd
第 7 章 Ceph 对象存储管理(RGW)
7.1 对象存储介绍
对象存储将数据存储为离散项(对象),每个对象具有唯一对象 ID。对象包含三部分:
| 部分 | 说明 |
|---|---|
| Key(键) | 对象名称,UTF-8 编码,长度 0~1024,桶内唯一 |
| Metadata(元数据) | 描述信息(Date、Content-length、ETag 等) |
| Data(数据) | 文件数据内容 |
对象存储在**扁平的命名空间(桶 bucket / 容器 container)**中,无多层级目录结构。
特征: 接入灵活、访问协议简单(http/https)、访问网络不受限、结构扁平化。
7.2 RADOS 网关(RGW)
- RADOS Gateway(对象网关 RGW)为客户端提供标准对象存储 API 访问 Ceph 集群;
- Ceph 支持 Amazon S3 (称存储桶)和 OpenStack Swift(称容器)两种对象 API;
- 守护进程
radosgw基于 librados 库构建,提供 HTTP Web 服务接口。
RADOS 网关用户只能访问网关,不能像 cephx 用户一样直接访问存储集群。网关用户通过 RGW 认证后,网关再使用 cephx 凭据向存储集群认证。
RGW 默认创建的池: .rgw.root、.default.rgw.control、.default.rgw.meta、.default.rgw.log、.default.rgw.buckets.index、.default.rgw.buckets.data、.default.rgw.buckets.non-ec。
7.3 多站点 RGW 部署(区域概念)
- 区域(zone):关联一个或多个 RADOS 网关;
- 区域组(zone group):一个或多个区域集合,数据复制到组内所有区域;
- 域(realm):所有对象和存储桶的全局命名空间,含一个或多个区域组;
- 期间(period)/ 时期(epoch):跟踪域、区域组、区域的配置状态与版本。
创建用户等元数据更新操作必须在主区域进行。
7.4 使用 Amazon S3 API 客户端(aws CLI)
bash
# 1. 安装 awscli(pip 方式,配置 aliyun 源)
mkdir .pip
cat > .pip/pip.conf << 'EOF'
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
EOF
pip3 install awscli
# 2. 配置 AWS CLI 凭据
aws configure
# AWS Access Key ID: 12345
# AWS Secret Access Key: 67890
# Default region name: (回车)
# Default output format: (回车)
# 3. 创建存储桶(bucket)
aws --endpoint-url http://192.168.108.11 s3 mb s3://webapp
# 4. 上传 / 下载对象
aws --endpoint-url http://192.168.108.11 s3 cp ./file4 s3://webapp/file4
aws --endpoint-url http://192.168.108.11 s3 ls s3://webapp
# 多配置凭据
aws configure --profile=ceph
7.5 Swift 客户端
bash
# 安装 swift 客户端
pip3 install python-swiftclient
# 配置凭据(S3 和 Swift 共享)
# 创建容器
swift --auth-version 3 ...
第 8 章 Ceph 文件系统存储管理(CephFS)
8.1 介绍 CephFS
CephFS 是构建在 Ceph 存储之上、兼容 POSIX 的文件系统,作为 librados 的原生接口实施。
三种存储方式对比:
| 类型 | 特点 |
|---|---|
| 文件存储 | 带目录树层次结构,文件有名 + 元数据 |
| 块存储 | 大小相等区块,格式化或直接读写 |
| 对象存储 | 任意数据 + 元数据,扁平池,API 访问 |
8.2 元数据服务器(MDS)
MDS 负责:管理目录层次结构和文件元数据、访问客户端缓存并维护一致性。
两种运行模式:
- 活动 MDS:负责管理 CephFS 元数据;
- 备用 MDS:备份,活动 MDS 无响应时切换为活动模式。
CephFS 相关概念:
- CephFS 卷:对应一个 CephFS 文件系统;
- CephFS 子卷:对应文件系统子目录,可指定 UID/GID、文件模式、大小;
- 配额 :通过
ceph.quota.max_bytes、ceph.quota.max_files限制。
客户端访问 CephFS 流程:
1. 客户端联系 MON 身份验证并检索集群映射
2. 客户端从集群映射获取活动 MDS 信息
3. 客户端向活动 MDS 索取文件元数据
4. 客户端直接与 OSD 通信,使用元数据访问文件/目录
8.3 部署 CephFS
部署方法:手动部署(步骤多可控)或卷部署(步骤少简单)。
手动部署流程:创建池 → 创建 CephFS → 部署 MDS
bash
# 1. 创建数据池和元数据池
ceph osd pool create cephfs.cephfs1.data.1
ceph osd pool create cephfs.cephfs1.meta
# 元数据池设置更高复本级别
ceph osd pool set cephfs.cephfs1.meta size 3
# 2. 创建文件系统
ceph fs new cephfs1 cephfs.cephfs1.meta cephfs.cephfs1.data.1
# 添加数据池
ceph osd pool create cephfs.cephfs1.data.2
ceph fs add_data_pool cephfs1 cephfs.cephfs1.data.2
卷部署(推荐):
bash
# 创建 CephFS 卷(部署三个 MDS 实例)
ceph fs volume create cephfs2 --placement="3 ceph1.laogao.cloud ceph2.laogao.cloud ceph3.laogao.cloud"
# 查看
ceph fs ls
ceph mds stat
ceph orch ls mds
# 删除
ceph fs volume rm cephfs2 --yes-i-really-mean-it
8.4 挂载 CephFS 文件系统
挂载方式:
- Kernel 挂载:要求 Linux 内核 4+(RHEL 8+),不支持配额,速度较快;
- FUSE 挂载:支持配额和 ACL。
CephFS 访问权限选项:
r:读取权限;w:写入权限;p:额外使用布局或配额;s:额外创建快照。
授权用户:
bash
# 示例1:允许对 / 文件夹具备读写、配额、快照权限
ceph fs authorize cephfs1 client.cephfs1-all-user / rwps \
> /etc/ceph/ceph.client.cephfs1-all-user.keyring
# 示例2:允许读取 / 文件夹,/dir2 具备读写
ceph fs authorize cephfs1 client.cephfs1-restrict-user / r /dir2 rw \
> /etc/ceph/ceph.client.cephfs1-restrict-user.keyring
客户端挂载准备:
bash
# 客户端安装 ceph-common
dnf install -y ceph-common
# 复制配置和 keyring
scp /etc/ceph/ceph.conf root@client:/etc/ceph/
scp /etc/ceph/ceph.client.cephfs1-all-user.keyring root@client:/etc/ceph/
使用 Kernel 挂载:
bash
# mount.ceph [src] [mount-point] -o ceph-options
mkdir /mnt/cephfs1
mount.ceph ceph1.laogao.cloud:/ /mnt/cephfs1 -o name=cephfs1-all-user,fs=cephfs1
# 验证
df -h /mnt/cephfs1
mkdir /mnt/cephfs1/dir1
echo Hello World > /mnt/cephfs1/dir1/welcome.txt
# 查看文件系统状态
ceph fs status
ceph df
总结
- 架构:Ceph 由 MON(集群状态)、OSD(数据)、MGR(管理)、MDS(元数据)四大组件构成,通过 RADOS + CRUSH 实现去中心化。
- 部署:官方推荐 cephadm(容器化)和 Rook(K8s),一条命令引导出单节点集群再扩容。
- 池管理:对象 → PG → OSD 三级映射,CRUSH 算法客户端自算位置;复本池重性能、纠删池省空间,池类型创建后不可更改。
- 认证:cephx 共享密钥协议,客户端 → MON 取会话密钥 → 取票据 → 与 OSD/MDS 交互。
- 三种存储:块(RBD,虚拟磁盘)、对象(RGW,兼容 S3/Swift)、文件(CephFS,POSIX),统一后端 RADOS。
- 统一存储:一个 Ceph 集群同时提供块、对象、文件三种存储服务,是私有云/OpenStack 的首选存储底座。
希望这份 Ceph 教程对你有帮助,欢迎点赞收藏,评论区交流~