首页 运维干货从单机到集群:分布式存储 Ceph 落地之路

从单机到集群:分布式存储 Ceph 落地之路

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

一、问题背景

传统存储架构面临的挑战:

  • 容量扩展困难:单机存储容量有限,扩容需要停机或数据迁移
  • 性能瓶颈:单机 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 算法实现数据分布:

  1. 数据分片:文件被切分为多个 Object
  2. Object 到 PG:Object 通过哈希映射到 PG
  3. PG 到 OSD:PG 通过 CRUSH 算法映射到 OSD 集合
  4. 数据写入:数据写入主 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 部署 → 功能验证
→ 性能测试 → 数据迁移 → 业务切换 → 监控告警 → 持续优化

关键步骤:

  1. 评估存储需求和规模
  2. 设计 Ceph 集群架构
  3. 准备硬件和网络
  4. 安装和配置操作系统
  5. 部署 Ceph 集群
  6. 创建存储池和测试
  7. 性能测试和优化
  8. 迁移数据到 Ceph
  9. 切换业务到 Ceph
  10. 配置监控和告警
  11. 持续优化和维护

五、实战步骤

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 副本 HDD512
rbd-ssd虚拟机磁盘(高性能)3 副本 SSD256
rgw-data对象存储数据纠删码 4+21024
cephfs-data文件系统数据3 副本 HDD512
cephfs-metadata文件系统元数据3 副本 SSD64

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 迁移策略

迁移方式:

  • 在线迁移:业务不停机,通过存储复制或快照迁移
  • 离线迁移:业务停机,直接拷贝数据

迁移步骤:

  1. 在 Ceph 创建对应的 RBD 镜像
  2. 使用 dd 或 rsync 拷贝数据
  3. 验证数据完整性
  4. 切换业务到 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。

排查步骤:

  1. 检查 OSD 进程状态:
   bashsystemctl status ceph-<fsid>@osd.0.service
  1. 查看 OSD 日志:
   bashjournalctl -u ceph-<fsid>@osd.0.service -n 100
  1. 检查磁盘状态:
   bashlsblk
smartctl -a /dev/sdb
  1. 如果磁盘故障,移除 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
  1. 更换磁盘后重新添加 OSD。

5.10.2 PG 不健康

症状:

   bashceph -s

显示 PG 状态异常(例如 degradedundersizedincomplete)。

排查步骤:

  1. 查看 PG 详细状态:
   bashceph pg dump
ceph pg <pg_id> query
  1. 如果是 OSD down 导致,等待 OSD 恢复或移除故障 OSD。
  2. 如果是配置问题,调整副本数或 PG 数。

5.10.3 集群空间不足

症状:

   bashceph -s

显示 HEALTH_WARN 或 HEALTH_ERR,提示空间不足。

排查步骤:

  1. 查看空间使用:
   bashceph df
ceph osd df
  1. 删除不需要的数据或扩容。
  2. 调整 full ratio:
   bashceph osd set-full-ratio 0.90
ceph osd set-nearfull-ratio 0.85

风险提醒:不建议长期运行在高使用率,会影响性能和恢复速度。

5.10.4 MON 故障

症状:

   bashceph -s

显示 MON 数量不足或无法连接。

排查步骤:

  1. 检查 MON 进程状态:
   bashsystemctl status ceph-<fsid>@mon.<hostname>.service
  1. 查看 MON 日志:
   bashjournalctl -u ceph-<fsid>@mon.<hostname>.service -n 100
  1. 检查时钟同步:
   bashchronyc tracking
  1. 如果 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 集群健康异常

排查路径:

  1. 查看健康状态:ceph health detail
  2. 查看具体告警信息
  3. 根据告警类型处理:
    • OSD down:检查 OSD 进程和磁盘
    • PG 异常:检查副本数和 OSD 状态
    • 空间不足:清理数据或扩容
    • 时钟偏差:检查 NTP 同步

9.2 性能慢

排查路径:

  1. 检查 OSD 负载:ceph osd df
  2. 检查网络带宽:iftopiperf
  3. 检查磁盘性能:iostat -x 1
  4. 检查 PG 分布:ceph pg dump
  5. 优化配置:调整 PG 数、副本策略、BlueStore 参数

9.3 数据恢复慢

排查路径:

  1. 查看恢复进度:ceph -s
  2. 调整恢复速率:
   bashceph tell osd.* injectargs '--osd-max-backfills 4'
ceph tell osd.* injectargs '--osd-recovery-max-active 5'
  1. 检查网络带宽和磁盘性能

十、风险提醒

  • 生产环境至少 3 个 MON 节点
  • OSD 节点至少 3 个,保证数据冗余
  • 修改 PG 数量会触发数据迁移,影响性能
  • 删除存储池需要二次确认,防止误操作
  • 定期备份 MON 数据和 CRUSH Map
  • 升级前在测试环境验证
  • 不要在集群使用率超过 80% 时扩容或修复

十一、验证方式

  • 创建 RBD 镜像并读写测试
  • 模拟 OSD 故障,验证自动恢复
  • 性能测试达到预期指标
  • Dashboard 可正常访问
  • 监控告警正常工作

十二、回滚方案

  • 保留原存储系统,迁移后并行运行一段时间
  • 数据迁移前备份
  • 业务切换采用灰度方式
  • 准备快速回切脚本

十三、生产环境注意事项

  • 选择业务低峰期部署和迁移
  • 提前通知相关团队
  • 准备应急预案
  • 配置监控和告警
  • 定期巡检和维护
  • 定期演练故障恢复

十四、总结

Ceph 是功能强大的分布式存储系统,从单机到集群的迁移需要系统规划:

  1. 需求评估:容量、性能、可靠性
  2. 架构设计:节点、硬件、网络、存储池
  3. 环境准备:操作系统、时间同步、SSH、磁盘
  4. Ceph 部署:使用 cephadm 部署 MON、MGR、OSD
  5. 功能验证:创建存储池,测试 RBD
  6. 性能测试:使用 fio、rados bench 测试
  7. 数据迁移:使用 dd、rsync 迁移数据
  8. 监控告警:Prometheus + Grafana
  9. 故障处理:OSD down、PG 异常、空间不足

Ceph 的核心优势是高可靠、高扩展、统一存储,适合虚拟化、容器、对象存储等场景。成功落地需要合理规划、充分测试、持续优化。

从单机到集群:分布式存储 Ceph 落地之路插图

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

网友评论comments

发表回复

您的电子邮箱地址不会被公开。

暂无评论

Copyright © 2012-2022 YUNWEIPAI.COM - 运维派 京ICP备16064699号-6
扫二维码
扫二维码
返回顶部