一、问题背景
传统存储架构面临的挑战:
- 容量扩展困难:单机存储容量有限,扩容需要停机或数据迁移
- 性能瓶颈:单机 IOPS 和吞吐量有上限,无法满足高并发需求
- 单点故障:单机存储故障会导致服务中断和数据丢失
- 成本高昂:传统 SAN/NAS 存储设备价格昂贵,维护成本高
- 管理复杂:多套存储系统管理复杂,资源利用率低
Ceph 是一个开源的分布式存储系统,提供对象存储、块存储和文件系统存储,具备以下特点:
- 高可靠性:多副本或纠删码保证数据安全
- 高可用性:无单点故障,自动故障恢复
- 高扩展性:可横向扩展到数千节点和 EB 级容量
- 统一存储:支持对象、块、文件三种存储接口
- 成本可控:基于 x86 服务器和通用硬盘,成本低于传统存储
本文记录从单机存储迁移到 Ceph 分布式存储的完整过程,包括架构设计、环境准备、安装部署、性能优化、监控告警和故障处理。
二、适用场景
Ceph 适用于以下场景:
- 虚拟化平台:为 OpenStack、KVM、VMware 等提供块存储
- 容器平台:为 Kubernetes 提供持久化存储
- 对象存储:S3/Swift 兼容的对象存储服务
- 文件共享:CephFS 提供 POSIX 兼容的分布式文件系统
- 数据库存储:为 MySQL、PostgreSQL 等提供高性能块存储
- 备份归档:大容量、低成本的备份存储
- 私有云存储:企业私有云的统一存储平台
不适用场景:
- 小规模环境:节点数少于 3 个,管理成本高于收益
- 极低延迟要求:Ceph 延迟通常在毫秒级,不适合微秒级延迟需求
- 单机应用:无高可用和扩展需求的单机应用
三、核心知识点
3.1 Ceph 架构组件
核心组件:
- MON(Monitor):维护集群状态映射(cluster map),提供共识服务,至少需要 3 个 MON 节点实现高可用
- OSD(Object Storage Daemon):存储数据,处理数据复制、恢复、再平衡,每个磁盘对应一个 OSD 进程
- MGR(Manager):收集集群状态信息,提供监控接口和 Dashboard
- MDS(Metadata Server):管理 CephFS 文件系统元数据,块存储和对象存储不需要 MDS
存储接口:
- RBD(RADOS Block Device):块设备接口,提供虚拟磁盘
- RGW(RADOS Gateway):对象存储接口,兼容 S3 和 Swift API
- CephFS:文件系统接口,POSIX 兼容
核心概念:
- Pool:存储池,数据的逻辑分区,定义副本数或纠删码策略
- PG(Placement Group):归置组,数据到 OSD 的映射中间层,用于数据分布和负载均衡
- Object:Ceph 存储的基本单元,默认 4MB
- CRUSH:数据分布算法,根据集群拓扑和策略计算数据位置
3.2 数据分布原理
Ceph 使用 CRUSH 算法实现数据分布:
- 数据分片:文件被切分为多个 Object
- Object 到 PG:Object 通过哈希映射到 PG
- PG 到 OSD:PG 通过 CRUSH 算法映射到 OSD 集合
- 数据写入:数据写入主 OSD,主 OSD 复制到副本 OSD
File → Object → PG → OSD Set → Disk
CRUSH 算法优势:
- 去中心化:客户端直接计算数据位置,无需查询元数据服务器
- 确定性:相同输入总是得到相同输出
- 拓扑感知:根据机架、机房等物理拓扑分布数据
- 动态平衡:节点增删时自动重新分布数据
3.3 数据冗余策略
副本(Replication):
- 数据写入多个副本,通常 3 副本
- 读写性能好,存储开销大(3 倍)
- 适合高性能场景
纠删码(Erasure Code):
- 数据切分为 K 个数据块和 M 个校验块,可容忍 M 个块丢失
- 常用配置:4+2(6 块中可丢失 2 块)、8+3(11 块中可丢失 3 块)
- 存储开销低(1.5-2 倍),写性能较差
- 适合冷数据和归档场景
3.4 性能调优方向
硬件层面:
- 使用 SSD 或 NVMe 作为 OSD 数据盘
- 使用 SSD 作为 DB/WAL 分离盘
- 万兆或更高速网络
- 充足的内存(每 OSD 至少 2GB)
配置层面:
- 合理设置 PG 数量
- 调整副本数和纠删码策略
- 启用 BlueStore(Ceph 原生存储引擎)
- 调整 OSD 线程数和队列深度
网络层面:
- 公共网络和集群网络分离
- 启用 Jumbo Frame(MTU 9000)
- 网络绑定和冗余
3.5 故障恢复机制
故障检测:
- OSD 之间定期心跳检测
- MON 监控 OSD 状态
- 超时未响应标记为 down
故障恢复:
- OSD down 后,Ceph 自动从副本恢复数据
- 恢复过程中服务可用,性能略有下降
- 恢复速度受网络带宽和磁盘性能限制
数据迁移:
- 节点增删时,CRUSH 重新计算数据分布
- 自动迁移数据到新的 OSD 集合
- 迁移过程可配置速率限制,避免影响业务
四、整体实施思路
从单机到 Ceph 集群的迁移路径:
需求评估 → 架构设计 → 硬件准备 → 环境准备 → Ceph 部署 → 功能验证
→ 性能测试 → 数据迁移 → 业务切换 → 监控告警 → 持续优化
关键步骤:
- 评估存储需求和规模
- 设计 Ceph 集群架构
- 准备硬件和网络
- 安装和配置操作系统
- 部署 Ceph 集群
- 创建存储池和测试
- 性能测试和优化
- 迁移数据到 Ceph
- 切换业务到 Ceph
- 配置监控和告警
- 持续优化和维护
五、实战步骤
5.1 需求评估
5.1.1 容量需求
评估当前和未来 1-2 年的存储容量需求:
- 当前数据量
- 数据增长率
- 副本数或纠删码开销
- 预留空间(建议预留 20-30%)
计算公式(3 副本):
原始容量需求 = 当前数据量 × (1 + 年增长率) × 预计年限
实际容量需求 = 原始容量需求 × 副本数 / (1 - 预留比例)
示例:
当前数据量:10TB
年增长率:50%
预计年限:2 年
副本数:3
预留比例:20%
原始容量需求 = 10TB × (1 + 0.5) × 2 = 30TB
实际容量需求 = 30TB × 3 / 0.8 = 112.5TB
5.1.2 性能需求
评估 IOPS 和吞吐量需求:
- 峰值 IOPS(读/写)
- 峰值吞吐量(MB/s)
- 延迟要求
- 并发连接数
根据性能需求选择磁盘类型:
- HDD:200-300 IOPS/磁盘,适合冷数据和归档
- SATA SSD:10K-50K IOPS/磁盘,适合一般业务
- NVMe SSD:100K-500K IOPS/磁盘,适合高性能场景
5.1.3 可靠性需求
评估可用性和数据安全要求:
- 服务可用性目标(例如 99.9%、99.99%)
- 可容忍的故障域(节点、机架、机房)
- 数据备份和恢复策略
根据可靠性需求设计架构:
- 单机房:至少 3 个节点,容忍 1 个节点故障
- 跨机架:数据分布在不同机架,容忍机架故障
- 跨机房:数据分布在不同机房,容忍机房故障
5.2 架构设计
5.2.1 节点规划
最小生产环境推荐:
- MON 节点:3 个,实现高可用
- MGR 节点:2 个(通常与 MON 共用主机)
- OSD 节点:至少 3 个,每个节点 4-12 块磁盘
节点数量建议:
- 3 节点:适合小规模测试环境
- 5-10 节点:适合中小规模生产环境
- 10+ 节点:适合大规模生产环境
5.2.2 硬件配置
MON/MGR 节点:
- CPU:4-8 核
- 内存:16-32GB
- 磁盘:2 × SSD(系统盘和 MON 数据盘)
- 网络:双万兆网卡
OSD 节点:
- CPU:每 OSD 0.5-1 核,12 盘位节点需要 8-12 核
- 内存:每 OSD 2-4GB,12 盘位节点需要 32-64GB
- 磁盘:
- 数据盘:4-12 × HDD/SSD
- DB/WAL 盘:1-2 × NVMe SSD(可选,用于 BlueStore 加速)
- 网络:双万兆网卡
RGW 节点(对象存储网关):
- CPU:8-16 核
- 内存:16-32GB
- 磁盘:系统盘 SSD
- 网络:双万兆网卡
5.2.3 网络设计
网络分离:
- 公共网络(Public Network):客户端访问,MON 通信
- 集群网络(Cluster Network):OSD 之间数据复制和恢复
网络拓扑:
客户端
|
公共网络 (10.0.1.0/24)
|
MON/MGR 节点
|
OSD 节点
|
集群网络 (10.0.2.0/24)
网络带宽:
- 万兆网络(10GbE)是生产环境最低配置
- 25GbE/40GbE 适合高性能场景
- 启用 Jumbo Frame(MTU 9000)提升性能
5.2.4 存储池规划
根据业务需求创建不同的存储池:
| 池名称 | 用途 | 副本策略 | PG 数 |
|---|---|---|---|
| rbd-hdd | 虚拟机磁盘(普通性能) | 3 副本 HDD | 512 |
| rbd-ssd | 虚拟机磁盘(高性能) | 3 副本 SSD | 256 |
| rgw-data | 对象存储数据 | 纠删码 4+2 | 1024 |
| cephfs-data | 文件系统数据 | 3 副本 HDD | 512 |
| cephfs-metadata | 文件系统元数据 | 3 副本 SSD | 64 |
PG 数量计算公式:
PG数 = (OSD总数 × 100) / 副本数
向上取到最接近的 2 的幂次。
示例:
OSD总数:30
副本数:3
PG数 = (30 × 100) / 3 = 1000 → 取 1024
5.3 环境准备
5.3.1 操作系统安装
推荐使用:
- CentOS 7/8 或 Rocky Linux 8
- Ubuntu 18.04/20.04/22.04
- Debian 10/11
最小化安装操作系统,安装后配置:
bash# 更新系统
yum update -y # CentOS/Rocky
apt update && apt upgrade -y # Ubuntu/Debian
# 安装基础工具
yum install -y vim wget curl net-tools chrony # CentOS/Rocky
apt install -y vim wget curl net-tools chrony # Ubuntu/Debian
5.3.2 主机名和 hosts
配置主机名:
bashhostnamectl set-hostname ceph-mon1
配置 /etc/hosts:
10.0.1.11 ceph-mon1
10.0.1.12 ceph-mon2
10.0.1.13 ceph-mon3
10.0.1.21 ceph-osd1
10.0.1.22 ceph-osd2
10.0.1.23 ceph-osd3
5.3.3 时间同步
Ceph 对时钟同步要求严格,时钟偏差超过 0.05 秒会导致 MON 异常。
配置 chrony:
编辑 /etc/chrony.conf:
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
启动服务:
bashsystemctl start chronyd
systemctl enable chronyd
检查时间同步状态:
bashchronyc sources
chronyc tracking
5.3.4 防火墙配置
Ceph 使用的端口:
- MON:6789(Ceph v12 及之前),3300(Ceph v13+)
- OSD:6800-7300
- MGR:6800-7300
- RGW:7480(默认)
允许 Ceph 端口:
bash# CentOS/Rocky
firewall-cmd --zone=public --add-port=6789/tcp --permanent
firewall-cmd --zone=public --add-port=3300/tcp --permanent
firewall-cmd --zone=public --add-port=6800-7300/tcp --permanent
firewall-cmd --reload
# Ubuntu/Debian
ufw allow 6789/tcp
ufw allow 3300/tcp
ufw allow 6800:7300/tcp
ufw reload
或关闭防火墙(测试环境):
bashsystemctl stop firewalld
systemctl disable firewalld
5.3.5 SELinux 配置
Ceph 与 SELinux 兼容性问题较多,建议关闭:
bashsed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
5.3.6 SSH 免密登录
配置部署节点到所有节点的 SSH 免密登录:
bashssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
ssh-copy-id root@ceph-mon1
ssh-copy-id root@ceph-mon2
ssh-copy-id root@ceph-mon3
ssh-copy-id root@ceph-osd1
ssh-copy-id root@ceph-osd2
ssh-copy-id root@ceph-osd3
5.3.7 磁盘准备
查看磁盘:
bashlsblk
确认数据盘未分区、未挂载。
如果磁盘已使用,清空数据:
bash# 风险提醒:此操作会清空磁盘所有数据
wipefs -a /dev/sdb
dd if=/dev/zero of=/dev/sdb bs=1M count=100
5.4 Ceph 部署
5.4.1 选择部署方式
Ceph 支持多种部署方式:
- cephadm:官方推荐,基于容器,支持 Ceph Octopus(v15)及以上
- ceph-deploy:传统部署工具,已弃用
- Rook:Kubernetes 原生,适合容器环境
- Ansible:适合大规模自动化部署
本文使用 cephadm 部署 Ceph Quincy(v17)。
5.4.2 安装 cephadm
在部署节点执行:
bash# CentOS/Rocky
curl --silent --remote-name --location https://github.com/ceph/ceph/raw/quincy/src/cephadm/cephadm
chmod +x cephadm
./cephadm add-repo --release quincy
./cephadm install
# Ubuntu/Debian
curl --silent --remote-name --location https://github.com/ceph/ceph/raw/quincy/src/cephadm/cephadm
chmod +x cephadm
apt install -y cephadm
安装 ceph-common(提供 ceph 命令):
bashcephadm install ceph-common
5.4.3 初始化集群
在第一个 MON 节点执行:
bashcephadm bootstrap --mon-ip 10.0.1.11 --cluster-network 10.0.2.0/24
参数说明:
--mon-ip:第一个 MON 的 IP 地址--cluster-network:集群网络 CIDR
初始化完成后,输出包含:
- Dashboard 访问地址
- 管理员密码
- ceph 配置文件路径
保存输出信息。
5.4.4 配置 SSH
cephadm 需要 SSH 访问所有节点:
bashssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-mon2
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-mon3
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd1
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd2
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd3
5.4.5 添加节点到集群
bashceph orch host add ceph-mon2 10.0.1.12 --labels _admin
ceph orch host add ceph-mon3 10.0.1.13 --labels _admin
ceph orch host add ceph-osd1 10.0.1.21
ceph orch host add ceph-osd2 10.0.1.22
ceph orch host add ceph-osd3 10.0.1.23
查看主机列表:
bashceph orch host ls
5.4.6 部署 MON
cephadm 会自动部署 MON,确保 3 个 MON:
bashceph orch apply mon 3
查看 MON 状态:
bashceph mon stat
ceph -s
5.4.7 部署 MGR
cephadm 会自动部署 MGR,确保 2 个 MGR:
bashceph orch apply mgr 2
查看 MGR 状态:
bashceph mgr stat
5.4.8 部署 OSD
方式一:自动发现并部署所有可用磁盘
bashceph orch apply osd --all-available-devices
cephadm 会扫描所有节点的未使用磁盘并创建 OSD。
方式二:手动指定磁盘
bashceph orch daemon add osd ceph-osd1:/dev/sdb
ceph orch daemon add osd ceph-osd1:/dev/sdc
ceph orch daemon add osd ceph-osd2:/dev/sdb
ceph orch daemon add osd ceph-osd2:/dev/sdc
ceph orch daemon add osd ceph-osd3:/dev/sdb
ceph orch daemon add osd ceph-osd3:/dev/sdc
方式三:使用 OSD 规格文件
创建 osd-spec.yaml:
yamlservice_type: osd
service_id: default_drive_group
placement:
host_pattern: 'ceph-osd*'
data_devices:
all: true
应用规格:
bashceph orch apply -i osd-spec.yaml
查看 OSD 状态:
bashceph osd stat
ceph osd tree
ceph osd df
5.4.9 启用 Dashboard
Dashboard 默认已启用,访问地址:
https://<mon-ip>:8443
登录用户名:admin,密码在初始化输出中。
如果需要修改密码:
bashceph dashboard ac-user-set-password admin <new-password>
5.4.10 检查集群状态
bashceph -s
输出示例:
cluster:
id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3
mgr: ceph-mon1(active), standbys: ceph-mon2
osd: 6 osds: 6 up, 6 in
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 6 GiB used, 1.2 TiB / 1.2 TiB avail
pgs: 1 active+clean
HEALTH_OK 表示集群健康。
5.5 创建存储池
5.5.1 创建块存储池
创建 3 副本的块存储池:
bashceph osd pool create rbd-pool 128 128
ceph osd pool application enable rbd-pool rbd
参数说明:
rbd-pool:池名称128:PG 数量(根据 OSD 数量调整)rbd:池类型标记
设置副本数:
bashceph osd pool set rbd-pool size 3
ceph osd pool set rbd-pool min_size 2
size 3:3 副本min_size 2:最少 2 副本可写
5.5.2 创建纠删码池
创建纠删码池:
bashceph osd erasure-code-profile set ec-profile k=4 m=2
ceph osd pool create ec-pool 128 128 erasure ec-profile
ceph osd pool application enable ec-pool rgw
参数说明:
k=4 m=2:4 个数据块,2 个校验块erasure:池类型为纠删码
5.5.3 查看存储池
bashceph osd pool ls
ceph osd pool ls detail
ceph osd pool stats
5.6 测试 RBD 块存储
5.6.1 创建 RBD 镜像
bashrbd create --size 10240 rbd-pool/test-image
创建 10GB 的 RBD 镜像。
查看镜像:
bashrbd ls rbd-pool
rbd info rbd-pool/test-image
5.6.2 映射 RBD 镜像
bashrbd map rbd-pool/test-image
查看映射:
bashrbd showmapped
输出示例:
id pool namespace image snap device
0 rbd-pool test-image - /dev/rbd0
5.6.3 格式化并挂载
bashmkfs.ext4 /dev/rbd0
mkdir -p /mnt/ceph-rbd
mount /dev/rbd0 /mnt/ceph-rbd
测试读写:
bashdd if=/dev/zero of=/mnt/ceph-rbd/testfile bs=1M count=1024
md5sum /mnt/ceph-rbd/testfile
卸载:
bashumount /mnt/ceph-rbd
rbd unmap /dev/rbd0
5.6.4 快照和克隆
创建快照:
bashrbd snap create rbd-pool/test-image@snap1
查看快照:
bashrbd snap ls rbd-pool/test-image
从快照克隆:
bashrbd snap protect rbd-pool/test-image@snap1
rbd clone rbd-pool/test-image@snap1 rbd-pool/test-clone
删除快照:
bashrbd snap unprotect rbd-pool/test-image@snap1
rbd snap rm rbd-pool/test-image@snap1
5.7 性能测试
5.7.1 OSD 性能测试
使用 ceph tell 测试单个 OSD 性能:
bashceph tell osd.0 bench
输出包括吞吐量和延迟。
5.7.2 RBD 性能测试
使用 rbd bench 测试:
bashrbd bench --io-type write rbd-pool/test-image --io-size 4096 --io-threads 16 --io-total 1G
参数说明:
--io-type:读写类型(write、read、readwrite)--io-size:IO 大小(字节)--io-threads:并发线程数--io-total:总 IO 量
5.7.3 RADOS 性能测试
使用 rados bench 测试:
bashrados bench -p rbd-pool 60 write --no-cleanup
rados bench -p rbd-pool 60 seq
rados bench -p rbd-pool 60 rand
参数说明:
60:测试时长(秒)write:写测试seq:顺序读测试rand:随机读测试--no-cleanup:不清理测试数据
清理测试数据:
bashrados -p rbd-pool cleanup
5.7.4 fio 性能测试
使用 fio 测试 RBD 性能:
安装 fio:
bashyum install -y fio # CentOS/Rocky
apt install -y fio # Ubuntu/Debian
测试脚本 rbd-fio.ini:
ini[global]
ioengine=rbd
clientname=admin
pool=rbd-pool
rbdname=test-image
rw=randwrite
bs=4k
iodepth=32
numjobs=4
runtime=60
time_based
group_reporting
[rbd-test]
执行测试:
bashfio rbd-fio.ini
5.8 监控告警
5.8.1 启用 Prometheus 模块
bashceph mgr module enable prometheus
Prometheus 指标接口:
http://<mgr-ip>:9283/metrics
5.8.2 配置 Prometheus
创建 prometheus.yml:
yamlglobal:
scrape_interval: 15s
scrape_configs:
- job_name: 'ceph'
static_configs:
- targets: ['<mgr-ip>:9283']
启动 Prometheus:
bashdocker run -d -p 9090:9090 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
5.8.3 配置 Grafana
启动 Grafana:
bashdocker run -d -p 3000:3000 grafana/grafana
访问 http://<ip>:3000,默认用户名/密码:admin/admin。
添加 Prometheus 数据源:
- URL:
http://<prometheus-ip>:9090
导入 Ceph Dashboard:
- Dashboard ID:2842(Ceph – Cluster)
- Dashboard ID:5336(Ceph – OSD)
- Dashboard ID:5342(Ceph – Pools)
5.8.4 告警规则
创建 Prometheus 告警规则 ceph-alerts.yml:
yamlgroups:
- name: ceph
rules:
- alert: CephHealthError
expr: ceph_health_status == 2
for: 5m
labels:
severity: critical
annotations:
summary: "Ceph cluster health is ERROR"
- alert: CephHealthWarning
expr: ceph_health_status == 1
for: 10m
labels:
severity: warning
annotations:
summary: "Ceph cluster health is WARNING"
- alert: CephOSDDown
expr: ceph_osd_up == 0
for: 5m
labels:
severity: warning
annotations:
summary: "Ceph OSD {{ $labels.ceph_daemon }} is down"
- alert: CephPoolFullWarning
expr: ceph_pool_percent_used > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Ceph pool {{ $labels.name }} usage > 80%"
5.9 数据迁移
5.9.1 迁移策略
迁移方式:
- 在线迁移:业务不停机,通过存储复制或快照迁移
- 离线迁移:业务停机,直接拷贝数据
迁移步骤:
- 在 Ceph 创建对应的 RBD 镜像
- 使用
dd或rsync拷贝数据 - 验证数据完整性
- 切换业务到 Ceph
5.9.2 块设备迁移
假设原始块设备为 /dev/sda1,迁移到 Ceph RBD:
创建 RBD 镜像:
bashrbd create --size <size_in_mb> rbd-pool/migrated-image
rbd map rbd-pool/migrated-image
拷贝数据:
bashdd if=/dev/sda1 of=/dev/rbd0 bs=4M status=progress
验证数据:
bashmd5sum /dev/sda1
md5sum /dev/rbd0
5.9.3 文件系统迁移
假设原始数据在 /data,迁移到 Ceph RBD:
创建并挂载 RBD:
bashrbd create --size <size_in_mb> rbd-pool/data-image
rbd map rbd-pool/data-image
mkfs.ext4 /dev/rbd0
mount /dev/rbd0 /mnt/ceph-data
同步数据:
bashrsync -avP /data/ /mnt/ceph-data/
验证数据:
bashdiff -r /data /mnt/ceph-data
切换挂载点:
bashumount /data
umount /mnt/ceph-data
mount /dev/rbd0 /data
5.10 故障处理
5.10.1 OSD down 故障
症状:
bashceph -s
显示 OSD down。
排查步骤:
- 检查 OSD 进程状态:
bashsystemctl status ceph-<fsid>@osd.0.service
- 查看 OSD 日志:
bashjournalctl -u ceph-<fsid>@osd.0.service -n 100
- 检查磁盘状态:
bashlsblk
smartctl -a /dev/sdb
- 如果磁盘故障,移除 OSD:
bashceph osd out osd.0
ceph osd down osd.0
ceph osd rm osd.0
ceph auth del osd.0
ceph osd crush remove osd.0
- 更换磁盘后重新添加 OSD。
5.10.2 PG 不健康
症状:
bashceph -s
显示 PG 状态异常(例如 degraded、undersized、incomplete)。
排查步骤:
- 查看 PG 详细状态:
bashceph pg dump
ceph pg <pg_id> query
- 如果是 OSD down 导致,等待 OSD 恢复或移除故障 OSD。
- 如果是配置问题,调整副本数或 PG 数。
5.10.3 集群空间不足
症状:
bashceph -s
显示 HEALTH_WARN 或 HEALTH_ERR,提示空间不足。
排查步骤:
- 查看空间使用:
bashceph df
ceph osd df
- 删除不需要的数据或扩容。
- 调整 full ratio:
bashceph osd set-full-ratio 0.90
ceph osd set-nearfull-ratio 0.85
风险提醒:不建议长期运行在高使用率,会影响性能和恢复速度。
5.10.4 MON 故障
症状:
bashceph -s
显示 MON 数量不足或无法连接。
排查步骤:
- 检查 MON 进程状态:
bashsystemctl status ceph-<fsid>@mon.<hostname>.service
- 查看 MON 日志:
bashjournalctl -u ceph-<fsid>@mon.<hostname>.service -n 100
- 检查时钟同步:
bashchronyc tracking
- 如果 MON 无法恢复,移除故障 MON 并添加新 MON。
六、常用命令
6.1 集群管理
bash# 查看集群状态
ceph -s
ceph health
ceph health detail
# 查看集群配置
ceph config dump
ceph config get <daemon> <option>
ceph config set <daemon> <option> <value>
# 查看集群使用情况
ceph df
ceph df detail
# 查看集群版本
ceph version
ceph versions
6.2 OSD 管理
bash# 查看 OSD 状态
ceph osd stat
ceph osd tree
ceph osd df
ceph osd df tree
# 查看 OSD 详细信息
ceph osd dump
ceph osd find <osd_id>
ceph osd metadata <osd_id>
# OSD 操作
ceph osd in <osd_id>
ceph osd out <osd_id>
ceph osd down <osd_id>
ceph osd rm <osd_id>
# 调整 OSD 权重
ceph osd crush reweight osd.<osd_id> <weight>
6.3 PG 管理
bash# 查看 PG 状态
ceph pg stat
ceph pg dump
ceph pg ls
ceph pg ls-by-osd <osd_id>
# 查看 PG 详细信息
ceph pg <pg_id> query
# PG 操作
ceph pg repair <pg_id>
ceph pg scrub <pg_id>
ceph pg deep-scrub <pg_id>
6.4 存储池管理
bash# 查看存储池
ceph osd pool ls
ceph osd pool ls detail
ceph osd pool stats
# 创建存储池
ceph osd pool create <pool_name> <pg_num> <pgp_num>
# 删除存储池
ceph osd pool rm <pool_name> <pool_name> --yes-i-really-really-mean-it
# 设置存储池参数
ceph osd pool set <pool_name> size <num>
ceph osd pool set <pool_name> min_size <num>
ceph osd pool set <pool_name> pg_num <num>
ceph osd pool set <pool_name> pgp_num <num>
# 获取存储池参数
ceph osd pool get <pool_name> all
6.5 RBD 管理
bash# 创建 RBD 镜像
rbd create --size <size_mb> <pool>/<image>
# 查看 RBD 镜像
rbd ls <pool>
rbd info <pool>/<image>
# 删除 RBD 镜像
rbd rm <pool>/<image>
# 映射 RBD 镜像
rbd map <pool>/<image>
rbd showmapped
# 取消映射
rbd unmap /dev/rbd<X>
# 调整大小
rbd resize --size <new_size_mb> <pool>/<image>
# 快照
rbd snap create <pool>/<image>@<snap_name>
rbd snap ls <pool>/<image>
rbd snap rm <pool>/<image>@<snap_name>
七、配置示例
7.1 ceph.conf 配置
ini[global]
fsid = a1b2c3d4-e5f6-7890-abcd-ef1234567890
mon_initial_members = ceph-mon1, ceph-mon2, ceph-mon3
mon_host = 10.0.1.11, 10.0.1.12, 10.0.1.13
public_network = 10.0.1.0/24
cluster_network = 10.0.2.0/24
# 认证
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
# OSD 配置
osd_pool_default_size = 3
osd_pool_default_min_size = 2
osd_pool_default_pg_num = 128
osd_pool_default_pgp_num = 128
# 性能优化
osd_max_backfills = 2
osd_recovery_max_active = 3
osd_recovery_op_priority = 1
[mon]
mon_allow_pool_delete = false
mon_osd_down_out_interval = 600
[osd]
osd_journal_size = 10240
osd_max_write_size = 512
osd_client_message_size_cap = 524288000
7.2 BlueStore 配置
ini[osd]
osd_objectstore = bluestore
bluestore_block_db_size = 10737418240 # 10GB DB
bluestore_block_wal_size = 1073741824 # 1GB WAL
bluestore_cache_size_hdd = 1073741824 # 1GB cache for HDD
bluestore_cache_size_ssd = 3221225472 # 3GB cache for SSD
7.3 CRUSH Map 配置
导出 CRUSH Map:
bashceph osd getcrushmap -o crushmap.bin
crushtool -d crushmap.bin -o crushmap.txt
编辑 CRUSH Map 实现机架感知:
# 定义机架
root default {
id -1
alg straw2
hash 0
rack rack1 {
id -2
alg straw2
hash 0
host ceph-osd1 {
id -3
alg straw2
hash 0
item osd.0 weight 1.0
item osd.1 weight 1.0
}
}
rack rack2 {
id -4
alg straw2
hash 0
host ceph-osd2 {
id -5
alg straw2
hash 0
item osd.2 weight 1.0
item osd.3 weight 1.0
}
}
}
# 规则:副本分布在不同机架
rule replicated_rule {
id 0
type replicated
min_size 1
max_size 10
step take default
step chooseleaf firstn 0 type rack
step emit
}
编译并注入 CRUSH Map:
bashcrushtool -c crushmap.txt -o crushmap-new.bin
ceph osd setcrushmap -i crushmap-new.bin
八、日志和指标观察方法
8.1 日志路径
容器化部署日志:
bashjournalctl -u ceph-<fsid>@mon.<hostname>.service
journalctl -u ceph-<fsid>@osd.<osd_id>.service
journalctl -u ceph-<fsid>@mgr.<hostname>.service
8.2 关键指标
bash# 集群健康状态
ceph health
# 集群使用率
ceph df
# OSD 使用率
ceph osd df
# PG 状态
ceph pg stat
# IOPS 和吞吐量
ceph osd pool stats
8.3 性能监控
Prometheus 关键指标:
ceph_health_status:集群健康状态(0=OK, 1=WARN, 2=ERR)ceph_osd_up:OSD 上线状态ceph_osd_in:OSD 服务状态ceph_pool_used_bytes:存储池使用量ceph_pool_write_bytes_total:写入字节数ceph_pool_read_bytes_total:读取字节数
九、排查路径
9.1 集群健康异常
排查路径:
- 查看健康状态:
ceph health detail - 查看具体告警信息
- 根据告警类型处理:
- OSD down:检查 OSD 进程和磁盘
- PG 异常:检查副本数和 OSD 状态
- 空间不足:清理数据或扩容
- 时钟偏差:检查 NTP 同步
9.2 性能慢
排查路径:
- 检查 OSD 负载:
ceph osd df - 检查网络带宽:
iftop、iperf - 检查磁盘性能:
iostat -x 1 - 检查 PG 分布:
ceph pg dump - 优化配置:调整 PG 数、副本策略、BlueStore 参数
9.3 数据恢复慢
排查路径:
- 查看恢复进度:
ceph -s - 调整恢复速率:
bashceph tell osd.* injectargs '--osd-max-backfills 4'
ceph tell osd.* injectargs '--osd-recovery-max-active 5'
- 检查网络带宽和磁盘性能
十、风险提醒
- 生产环境至少 3 个 MON 节点
- OSD 节点至少 3 个,保证数据冗余
- 修改 PG 数量会触发数据迁移,影响性能
- 删除存储池需要二次确认,防止误操作
- 定期备份 MON 数据和 CRUSH Map
- 升级前在测试环境验证
- 不要在集群使用率超过 80% 时扩容或修复
十一、验证方式
- 创建 RBD 镜像并读写测试
- 模拟 OSD 故障,验证自动恢复
- 性能测试达到预期指标
- Dashboard 可正常访问
- 监控告警正常工作
十二、回滚方案
- 保留原存储系统,迁移后并行运行一段时间
- 数据迁移前备份
- 业务切换采用灰度方式
- 准备快速回切脚本
十三、生产环境注意事项
- 选择业务低峰期部署和迁移
- 提前通知相关团队
- 准备应急预案
- 配置监控和告警
- 定期巡检和维护
- 定期演练故障恢复
十四、总结
Ceph 是功能强大的分布式存储系统,从单机到集群的迁移需要系统规划:
- 需求评估:容量、性能、可靠性
- 架构设计:节点、硬件、网络、存储池
- 环境准备:操作系统、时间同步、SSH、磁盘
- Ceph 部署:使用 cephadm 部署 MON、MGR、OSD
- 功能验证:创建存储池,测试 RBD
- 性能测试:使用 fio、rados bench 测试
- 数据迁移:使用 dd、rsync 迁移数据
- 监控告警:Prometheus + Grafana
- 故障处理:OSD down、PG 异常、空间不足
Ceph 的核心优势是高可靠、高扩展、统一存储,适合虚拟化、容器、对象存储等场景。成功落地需要合理规划、充分测试、持续优化。

本文链接:https://www.yunweipai.com/archives/49401




网友评论comments