Skip to content

Ceph基础与部署 ​

Ceph 是分布式存储系统,可以同时提供块存储、文件存储和对象存储。底层数据不是放在某一台“主存储服务器”上,而是通过 CRUSH 算法分散到多台机器的 OSD 里,再按副本或纠删码策略保证可用性。

Ceph 的学习门槛比 NFS 高很多。它不是“装一个服务端、客户端挂载目录”这种模型,而是一套由 MON、MGR、OSD、Pool、PG、CRUSH、认证和客户端接口组成的集群。运维时最常看的不是某个进程是否启动,而是 ceph -s 里的健康状态、OSD 状态、PG 状态、容量和恢复进度。

一、Ceph 组件 ​

Ceph 基本组件:

组件作用运维关注
MON保存集群拓扑、认证和关键状态quorum、时钟、网络
MGR管理模块、Dashboard、指标prometheus 模块、dashboard
OSD真正存数据的守护进程,一块盘通常对应一个 OSD磁盘、延迟、容量、down/out
MDSCephFS 元数据服务文件系统目录元数据
RGWS3/Swift 对象网关bucket、用户、访问密钥

基本关系:

客户端从 MON 拿集群地图和认证信息,然后直接和 OSD 读写数据。这个点和很多传统存储不同:MON 不是数据转发代理,OSD 才是真正承载 IO 的地方。

二、Pool、PG 和 CRUSH ​

Pool 可以理解成 Ceph 里的逻辑存储池。RBD 镜像、CephFS 数据、RGW 对象最终都会落到某个 Pool 里。

PG 是 Placement Group,介于 Pool 和 OSD 之间。Ceph 不会直接把每个对象逐个映射到 OSD,而是先把对象映射到 PG,再把 PG 映射到一组 OSD。PG 数量影响数据分布、恢复速度和集群开销。

CRUSH 是 Ceph 的数据放置算法。它根据规则决定数据应该放到哪些 OSD、主机、机架或故障域里。

常见概念:

概念说明
size副本数,比如 3 表示三副本
min_size允许 IO 的最小副本数
pg_numPool 的 PG 数量
failure domain故障域,比如 host、rack、room
CRUSH rule数据按什么故障域分布

三副本 Pool 不是“一个主两个从”。Ceph 会把每个 PG 放到多个 OSD 上,其中有 primary OSD 负责协调这个 PG 的 IO。OSD 故障后,Ceph 会按 CRUSH 重新恢复副本。

三、部署规划 ​

实验环境至少 3 台节点更接近真实 Ceph:

主机IP角色
ceph01192.168.10.41MON、MGR、OSD
ceph02192.168.10.42MON、MGR、OSD
ceph03192.168.10.43MON、MGR、OSD

每台至少准备一块独立数据盘,比如 /dev/sdb。OSD 盘会被 Ceph 接管,原有数据会清空。

基础要求:

项目说明
时间同步MON quorum 对时间偏差敏感
主机名解析节点之间能通过主机名互相访问
网络存储网络延迟和带宽影响明显
磁盘OSD 数据盘独立,避免和系统盘混用
容器运行时cephadm 以容器方式部署 Ceph 守护进程
SSHcephadm 需要免密管理节点

生产里 Ceph 的磁盘、网络和故障域要提前规划。随便拿几台业务机器拼一个 Ceph,后面容量、恢复和性能都会很难看。

四、版本和安装方式 ​

官方推荐的新集群安装方式是 cephadm。它用容器运行 Ceph 守护进程,并通过 orchestrator 管理 MON、MGR、OSD 等服务。

Ceph 长期笔记里更适合用版本变量。官方文档有 latest 页面,但 latest 更偏当前开发文档;实际部署选择稳定发行版,比如 reef、squid 这类 release 名称,再按对应系统版本配置仓库。

bash
# release 按实际稳定版本选择,比如 reef / squid
CEPH_RELEASE=squid

# RHEL/Rocky/CentOS 要让系统版本和 Ceph 仓库路径匹配
curl --silent --remote-name --location "https://download.ceph.com/rpm-${CEPH_RELEASE}/el9/noarch/cephadm"
chmod +x cephadm
./cephadm add-repo --release "${CEPH_RELEASE}"
./cephadm install

Ubuntu/Debian 类系统也可以用 cephadm 脚本安装,版本和仓库要按发行版对应调整。内网环境一般会提前准备三类东西:

项目说明
软件仓库cephadm、ceph-common 等包
容器镜像MON、MGR、OSD、MDS、RGW 等镜像
registry 配置cephadm 拉镜像时使用内网仓库

公网能装通不代表生产能装通。生产环境更常见的问题是节点无法出网、镜像仓库证书不被信任、代理配置没有传到 cephadm 管理的容器里。

引导第一个 MON/MGR:

bash
# mon-ip 写第一台节点的管理网 IP,后续节点会加入这个集群
cephadm bootstrap --mon-ip 192.168.10.41

有独立集群网络时,bootstrap 可以把 public network 和 cluster network 写清楚:

bash
# public network 给客户端和 MON 通信,cluster network 给 OSD 复制和恢复流量
cephadm bootstrap \
  --mon-ip 192.168.10.41 \
  --cluster-network 10.10.10.0/24

小集群没有独立存储网络也能跑,但恢复、backfill 和业务 IO 会抢同一张网卡。Ceph 集群规模上来以后,网络规划会直接影响故障恢复时的业务抖动。

bootstrap 完成后会生成:

文件 / 信息作用
/etc/ceph/ceph.confCeph 客户端配置
/etc/ceph/ceph.client.admin.keyringadmin 认证 key
Dashboard 地址和账号Web 管理入口
cephadm SSH key后续管理其他节点

安装命令行工具:

bash
cephadm install ceph-common
ceph -s

ceph -s 是 Ceph 运维最常用入口。状态正常时应该能看到 MON quorum、MGR active、OSD 数量、Pool/PG 状态和容量。

五、加入节点 ​

cephadm 通过 SSH 管理其他节点。先把公钥拷到节点:

bash
# 查看 cephadm 管理用公钥
ceph cephadm get-pub-key

把这段公钥加入 ceph02、ceph03 的 root 用户 authorized_keys,再添加主机:

bash
# _admin 标签表示这个节点会自动下发 ceph.conf 和 admin keyring
ceph orch host add ceph02 192.168.10.42 --labels _admin
ceph orch host add ceph03 192.168.10.43 --labels _admin

ceph orch host ls

查看服务:

bash
ceph orch ps
ceph orch ls

如果主机加入失败,常见原因是 SSH 不通、主机名解析异常、Python/容器运行时缺失、目标节点时间不同步。

MON 数量一般保持奇数,3 个 MON 是常见起点。MON 不是越多越好,数量多了 quorum 通信和故障判断也会更复杂;普通中小集群 3 个 MON 已经能覆盖一台控制节点故障。

六、创建 OSD ​

查看可用磁盘:

bash
# Available 为 Yes 的设备才能被直接创建 OSD
ceph orch device ls

把所有可用盘加入 OSD:

bash
# 会清空被接管磁盘上的数据,执行前确认设备没有业务数据
ceph orch apply osd --all-available-devices

也可以指定某台主机某块盘:

bash
ceph orch daemon add osd ceph01:/dev/sdb
ceph orch daemon add osd ceph02:/dev/sdb
ceph orch daemon add osd ceph03:/dev/sdb

查看 OSD:

bash
ceph osd tree
ceph osd df
ceph -s

OSD 状态里 up 表示进程在,in 表示参与数据分布。down 是守护进程不可用,out 是 Ceph 不再把数据分配给它。故障处理时要区分这两个状态。

七、OSD 故障和替换 ​

OSD 故障通常先从 ceph -s 或监控里看到:

bash
ceph -s
ceph health detail
ceph osd tree
ceph osd df

定位到节点后看磁盘和守护进程:

bash
# 看 OSD 容器或 systemd 状态
ceph orch ps --daemon_type osd

# 到对应节点看磁盘、内核日志和 SMART
lsblk
dmesg | grep -iE 'error|fail|nvme|sd[a-z]' | tail -50
smartctl -a /dev/sdb

坏盘替换的大致顺序:

bash
# 确认这个 OSD 是否可以安全销毁,避免副本不足时继续操作
ceph osd safe-to-destroy osd.<id>

# 如果已经安全,清理 OSD 守护进程和 CRUSH/认证记录
ceph orch osd rm <id> --replace
ceph orch osd rm status

换盘后重新加入:

bash
# 新盘出现后确认 Available 为 Yes
ceph orch device ls

# 用新盘创建 OSD
ceph orch daemon add osd <host>:/dev/sdb

有些故障是磁盘慢但还没彻底坏,表现为 slow ops、OSD apply/commit latency 高。这个时候只看 up/in 会误判成正常,ceph osd perf 和磁盘延迟更有参考价值。

OSD 被移除或新增后会触发 recovery/backfill。恢复期间业务 IO、OSD 磁盘和集群网络都会变忙:

bash
ceph -s
ceph pg stat
ceph osd perf

需要临时控制恢复强度时,可以调整恢复参数:

bash
# 降低恢复并发,减少对业务 IO 的影响;具体值要按集群规模压测
ceph config set osd osd_max_backfills 1
ceph config set osd osd_recovery_max_active 1

恢复太慢会延长降级时间,恢复太快又可能把业务 IO 打满。这个参数不是“一劳永逸”的固定值,更适合在故障恢复现场结合业务压力临时调整,恢复后再复查。

八、Pool 创建 ​

创建一个三副本 Pool:

bash
# 这里 pg_num 用 32 只是小集群示例,生产要按 OSD 数量和数据规模规划
ceph osd pool create rbd-pool 32
ceph osd pool set rbd-pool size 3
ceph osd pool set rbd-pool min_size 2

启用 RBD 应用类型:

bash
ceph osd pool application enable rbd-pool rbd

查看 Pool:

bash
ceph osd pool ls detail
ceph pg stat

Pool 的副本数直接影响可用容量。三副本大致是 3T 原始容量提供 1T 可用容量,还要预留恢复和水位空间。Ceph 集群长期跑到 85% 以上,恢复、重平衡和写入都会变得紧张。

九、健康状态 ​

ceph -s 常见状态:

状态含义
HEALTH_OK当前无健康告警
HEALTH_WARN有风险或待处理告警
HEALTH_ERR严重问题,可能影响 IO 或数据冗余

常见告警:

告警方向
OSD_DOWNOSD 进程挂了、节点异常、磁盘异常
PG_DEGRADED副本不足,正在恢复或有 OSD 不可用
PG_STUCKPG 长时间不活跃或不干净
MON_CLOCK_SKEWMON 节点时间不同步
NEARFULL / FULLOSD 或 Pool 容量水位过高
SLOW_OPS磁盘、网络或 OSD 队列慢

查看详细健康信息:

bash
ceph health detail
ceph -s
ceph osd tree
ceph pg dump_stuck

排 Ceph 故障时从 ceph -s 和 ceph health detail 开始。直接冲到某台机器看日志容易迷路,因为 Ceph 的问题通常是集群状态和单机状态叠在一起。

十、容量和恢复 ​

查看容量:

bash
ceph df
ceph osd df tree

容量里要区分:

项目说明
RAW STORAGE原始磁盘容量
POOLSPool 逻辑使用量
%RAW USED原始容量使用比例
MAX AVAIL按当前 CRUSH 和副本策略估算的可用容量

OSD 故障后,Ceph 会恢复副本。恢复会消耗磁盘和网络资源:

bash
ceph -s
ceph pg stat
ceph osd perf

恢复期间业务 IO 可能变慢。生产集群要在业务高峰、恢复速度和数据冗余之间取舍,恢复太慢风险时间长,恢复太快可能把业务 IO 打满。

十一、Dashboard 和监控 ​

cephadm bootstrap 默认会启用 Dashboard。查看服务:

bash
ceph mgr services

Prometheus 模块:

bash
# mgr prometheus 模块会暴露 Ceph 指标,通常给 Prometheus 抓取
ceph mgr module enable prometheus
ceph mgr services

日常监控重点:

指标说明
OSD up/inOSD 是否在线并参与数据分布
PG active+cleanPG 是否健康
容量水位OSD、Pool、集群整体使用率
延迟OSD apply/commit latency
recovery/backfill是否在恢复或重平衡
slow ops慢操作数量和持续时间

Ceph 监控里容量告警要留足提前量。等到 FULL 才处理,写入会被阻塞,扩容和数据迁移也更被动。

十二、常见排查入口 ​

集群状态:

bash
ceph -s
ceph health detail
ceph orch ps

OSD:

bash
ceph osd tree
ceph osd df
ceph osd perf

PG:

bash
ceph pg stat
ceph pg dump_stuck

日志:

bash
# cephadm 部署的守护进程跑在容器里,日志可以通过 cephadm 或 journalctl 看
cephadm logs --name osd.<id>
journalctl -u ceph-*.service -n 200 --no-pager

常见现象:

现象方向
ceph -s 卡住MON 不可达、认证文件缺失、网络问题
OSD down节点、磁盘、容器、网络
PG degradedOSD 不足、恢复中、CRUSH 分布异常
写入慢OSD 延迟、磁盘、网络、恢复任务
nearfull数据分布不均、容量不足、某些 OSD 太小
Dashboard 打不开MGR 模块、端口、防火墙、证书
OSD 一直无法删除仍有 PG 副本依赖,查看 safe-to-destroy
恢复很慢backfill/recovery 参数、网络、目标 OSD 延迟

Ceph 的“健康”包含进程、PG、OSD、容量和恢复状态。systemctl 全绿但 PG degraded、OSD nearfull,业务读写一样会受影响。