一、Ceph 概述

1.1 什么是 Ceph

  • 开源、分布式、软件定义存储(SDS)
  • 极高可用性、扩展性、易用性,用于存储海量数据
  • 可部署在通用服务器(x86 或 ARM)上,支持异构集群

1.2 Ceph 技术优势

  • RADOS 系统将所有数据作为对象存储在存储池中
  • 去中心化:客户端使用 CRUSH 算法 自行计算对象存储位置,直接读写
  • 集群自动扩展、数据再平衡、数据恢复

1.3 Ceph 使用场景

  • 云平台后端存储(OpenStack、Kubernetes)
  • 块存储(虚拟机镜像)
  • 对象存储(S3/Swift 兼容)
  • 文件存储(POSIX 兼容)

1.4 Ceph 历史与版本

  • 2003 年由 Sage Weil 在加州大学圣克鲁兹分校开始开发
  • 2012 年成立 Inktank 公司,2014 年被 Red Hat 收购
  • 版本命名:Argonaut, Bobtail, … Pacific, Quincy, Reef 等
  • LTS 版本:Firefly, Jewel, Luminous, Nautilus, Octopus, Pacific, Quincy
  • 版本格式:x.y.zx.2.z 为稳定版

二、Ceph 架构

2.1 核心组件

组件 功能
MON 维护集群状态映射,提供仲裁
OSD 存储数据,处理复制、恢复、再平衡
MGR 提供 Dashboard 和 REST API,收集运行时指标
MDS 为 CephFS 存储元数据(仅文件存储需要)

2.2 访问方式

接口 说明
librados 原生 API,性能最佳
RBD 块设备,支持 KVM/QEMU/OpenStack
RGW 对象存储,兼容 S3 和 Swift
CephFS POSIX 兼容文件系统

2.3 RADOS 核心概念

  • Pool:逻辑分区,包含多个 PG
  • PG (Placement Group):对象集合的容器,映射到 OSD
  • CRUSH:伪随机算法,计算对象到 OSD 的映射

2.4 数据读写流程

写入流程

  1. Client 从 MON 获取 cluster map
  2. Client 计算对象的 PG 和主 OSD
  3. Client 向主 OSD 发送写入请求
  4. 主 OSD 写入本地,并向副本 OSD 发送写入
  5. 副本 OSD 完成后,主 OSD 向 Client 确认

读取流程

  1. Client 获取 cluster map
  2. Client 计算主 OSD 位置
  3. 直接向主 OSD 发送读取请求

三、Ceph 部署(cephadm)

3.1 推荐部署方式

  • cephadm(容器化,支持 Octopus+)
  • Rook(K8s 部署,支持 Nautilus+)

3.2 硬件规格(生产最小)

组件 CPU 内存 磁盘
OSD ≥1 核 4G 整块硬盘
MON ≥2 核 2-4G 60G
MDS ≥2 核 ≥2G -

3.3 部署步骤(示例)

# 1. 配置主机名解析、关闭 SELinux/防火墙、安装 cephadm
dnf install -y cephadm

# 2. 引导集群(在第一个节点)
cephadm bootstrap --mon-ip 192.168.108.11 \
  --allow-fqdn-hostname \
  --initial-dashboard-user admin \
  --initial-dashboard-password laogao@123

# 3. 添加其他节点
ceph cephadm get-pub-key > ~/ceph.pub
ssh-copy-id -f -i ~/ceph.pub root@ceph2
ceph orch host add ceph2.laogao.cloud

# 4. 添加 OSD
ceph orch apply osd --all-available-devices

3.4 常用管理命令

# 查看集群状态
ceph status / ceph -s

# 查看服务列表
ceph orch ls

# 查看进程
ceph orch ps

# 重启/删除服务
ceph orch daemon restart <service_name>
ceph orch daemon rm <service_name> --force

3.5 Dashboard 访问

  • URL: https://<host>:8443
  • 默认用户/密码:admin / 设置的密码

四、Ceph 配置管理

4.1 配置来源及优先级

  1. 编译默认值
  2. 集中配置数据库(MON 维护)
  3. 本地配置文件 /etc/ceph/ceph.conf
  4. 环境变量
  5. 命令行参数

较新设置覆盖较早设置,配置文件覆盖数据库设置。

4.2 配置文件格式

[global]
    fsid = xxxxx
    mon_host = [v2:192.168.108.11:3300/0]
[mon]
    mon_allow_pool_delete = false
[osd]
    osd_memory_target = 4G

4.3 集中配置数据库管理

# 列出所有可配置项
ceph config ls

# 查看帮助
ceph config help <key>

# 查看所有生效配置(含默认值)
ceph config show-with-defaults <daemon>

# 获取/设置配置
ceph config get <daemon> <key>
ceph config set <daemon> <key> <value>

# 删除配置(恢复默认)
ceph config rm <daemon> <key>

# 查看配置历史
ceph config log [num]

4.4 运行时临时修改

# 使用 tell 命令(重启后失效)
ceph tell <daemon> config set <key> <value>

# 使用 daemon 命令(本地,不依赖 MON)
ceph daemon <daemon> config set <key> <value>

4.5 网络配置

[global]
    public_network = 192.168.108.0/24
    cluster_network = 192.168.101.0/24   # 可选,分离后端流量

4.6 常用端口

服务 端口
MON 3300, 6789
OSD 6800-7300
MGR (Dashboard) 8443
RGW 80
Prometheus 9095
Grafana 3000

五、存储池(Pool)管理

5.1 池的类型

  • Replicated Pool:副本池,默认 size=3,性能好,空间占用大
  • Erasure Code Pool:纠删码池,节省空间,消耗 CPU

5.2 创建池

# 副本池
ceph osd pool create mypool 32 32 replicated

# 纠删码池
ceph osd pool create myecpool 32 32 erasure

5.3 PG 数量建议

OSD 数量 建议 PG 总数
<5 128
5-10 512
10-50 4096
>50 使用官方工具计算

5.4 池管理命令

# 列出池
ceph osd pool ls
ceph osd pool ls detail

# 查看池使用情况
ceph df

# 设置池配额
ceph osd pool set-quota mypool max_objects 10000
ceph osd pool set-quota mypool max_bytes 10G

# 设置池属性
ceph osd pool set mypool size 3          # 副本数
ceph osd pool set mypool nodelete true   # 禁止删除

# 删除池(需先允许删除)
ceph config set mon mon_allow_pool_delete true
ceph osd pool rm mypool mypool --yes-i-really-really-mean-it

5.5 应用类型标记

ceph osd pool application enable mypool rbd
ceph osd pool application enable mypool cephfs
ceph osd pool application enable mypool rgw

5.6 对象操作(rados 命令)

# 上传对象
rados -p mypool put myobj /path/to/file

# 下载对象
rados -p mypool get myobj /path/to/output

# 列出对象
rados -p mypool ls

# 删除对象
rados -p mypool rm myobj

# 查看对象位置
ceph osd map mypool myobj

5.7 命名空间

  • 在同一池中逻辑隔离对象
  • 仅支持 librados 应用,RBD/RGW 不支持
rados -p mypool -N myns put obj file
rados -p mypool -N myns ls

5.8 池快照

ceph osd pool mksnap mypool mysnap
ceph osd pool rmsnap mypool mysnap

六、认证与授权(Cephx)

6.1 用户类型

  • client.<name>:客户端用户
  • osd.<id>mgr.<host>:守护进程用户

6.2 用户管理

# 列出用户
ceph auth list

# 获取用户信息
ceph auth get client.admin

# 创建用户
ceph auth add client.myuser mon 'allow r' osd 'allow rw pool=mypool'

# 使用 get-or-create
ceph auth get-or-create client.myuser mon 'allow r' osd 'allow rw pool=mypool' -o keyring

# 删除用户
ceph auth del client.myuser

# 导出/导入
ceph auth export client.myuser -o myuser.keyring
ceph auth import -i myuser.keyring

6.3 能力(Capabilities)

权限 说明
r
w
x 执行(类方法)
* 全部
class-read 读类方法
class-write 写类方法

示例:

# 限制到特定池
ceph auth caps client.myuser osd 'allow rw pool=mypool'

# 限制到命名空间
ceph auth caps client.myuser osd 'allow rw namespace=my-ns'

# 限制到对象前缀
ceph auth caps client.myuser osd 'allow rw object_prefix myprefix'

七、块存储(RBD)

7.1 创建和使用 RBD 镜像

# 创建池并初始化
ceph osd pool create rbd_pool 32 32
rbd pool init rbd_pool

# 创建镜像
rbd create --size 10G rbd_pool/myimage

# 列出镜像
rbd ls rbd_pool

# 查看镜像信息
rbd info rbd_pool/myimage

# 映射到本地块设备(客户端)
rbd map rbd_pool/myimage
# 或
rbd device map rbd_pool/myimage

# 查看映射
rbd showmapped

# 格式化并挂载
mkfs.xfs /dev/rbd0
mount /dev/rbd0 /mnt

# 取消映射
umount /mnt
rbd unmap /dev/rbd0

7.2 镜像功能(Features)

常用功能:layering, exclusive-lock, object-map, fast-diff, deep-flatten, journaling

# 禁用/启用功能
rbd feature disable rbd_pool/myimage object-map
rbd feature enable rbd_pool/myimage object-map

7.3 快照与克隆

# 创建快照
rbd snap create rbd_pool/myimage@snap1

# 保护快照
rbd snap protect rbd_pool/myimage@snap1

# 基于快照克隆
rbd clone rbd_pool/myimage@snap1 rbd_pool/myclone

# 查看克隆关系
rbd children rbd_pool/myimage@snap1

# 扁平化(脱离父级)
rbd flatten rbd_pool/myclone

# 删除快照(需先取消保护)
rbd snap unprotect rbd_pool/myimage@snap1
rbd snap rm rbd_pool/myimage@snap1

7.4 导出与导入

# 导出镜像到文件
rbd export rbd_pool/myimage /tmp/myimage.img

# 从文件导入
rbd import /tmp/myimage.img rbd_pool/myimage2

# 增量导出
rbd export-diff rbd_pool/myimage@snap1 /tmp/diff
rbd import-diff /tmp/diff rbd_pool/myimage

7.5 RBD 镜像(Mirroring)

  • 支持单向(active-passive)和双向(active-active)
  • 需要开启 journaling 功能
# 启用池镜像
rbd mirror pool enable rbd_pool pool

# 创建引导 token(主集群)
rbd mirror pool peer bootstrap create --site-name primary rbd_pool > token

# 导入 token(备集群)
rbd mirror pool peer bootstrap import --site-name secondary --direction rx-only rbd_pool token

# 部署 rbd-mirror 进程
ceph orch apply rbd-mirror --placement=host1

# 查看状态
rbd mirror pool status rbd_pool
rbd mirror image status rbd_pool/myimage

八、对象存储(RGW)

8.1 架构组件

  • Realm:全局命名空间,包含多个 Zonegroup
  • Zonegroup:包含一个或多个 Zone
  • Zone:包含一个或多个 RGW 实例,关联一个 Ceph 集群
  • Period:记录配置变更的版本

8.2 部署 RGW

# 创建 realm
radosgw-admin realm create --rgw-realm=myrealm --default

# 创建 zonegroup
radosgw-admin zonegroup create --rgw-realm=myrealm --rgw-zonegroup=myzonegroup --master --default

# 创建 zone
radosgw-admin zone create --rgw-realm=myrealm --rgw-zonegroup=myzonegroup --rgw-zone=myzone --master --default

# 更新 period
radosgw-admin period update --rgw-realm=myrealm --commit

# 部署 RGW 服务
ceph orch apply rgw myrealm --placement="3 host1 host2 host3" --realm=myrealm --zone=myzone --port=8080

8.3 用户管理

# 创建 S3 用户
radosgw-admin user create --uid=s3user --display-name="S3 User" --access-key=AKIA... --secret-key=...

# 创建子用户(Swift)
radosgw-admin subuser create --uid=swiftuser --subuser=swiftuser:swift --access=full

# 生成 Swift key
radosgw-admin key create --subuser=swiftuser:swift --key-type=swift --gen-secret

# 启用/禁用用户
radosgw-admin user suspend --uid=s3user
radosgw-admin user enable --uid=s3user

# 删除用户
radosgw-admin user rm --uid=s3user --purge-data

8.4 S3 客户端使用(awscli)

# 配置
aws configure set aws_access_key_id AKIA...
aws configure set aws_secret_access_key ...

# 创建 bucket
aws --endpoint=http://rgw-host:8080 s3 mb s3://mybucket

# 上传对象
aws s3 cp file.txt s3://mybucket/ --endpoint=http://rgw-host:8080

# 列出对象
aws s3 ls s3://mybucket/ --endpoint=http://rgw-host:8080

# 下载对象
aws s3 cp s3://mybucket/file.txt . --endpoint=http://rgw-host:8080

# 删除 bucket
aws s3 rb s3://mybucket --force --endpoint=http://rgw-host:8080

8.5 Swift 客户端使用

# 环境变量
export ST_AUTH=http://rgw-host:8080/auth/1.0
export ST_USER=swiftuser:swift
export ST_KEY=secret

# 创建容器
swift post mycontainer

# 上传对象
swift upload mycontainer file.txt

# 列出
swift list
swift list mycontainer

# 下载
swift download mycontainer file.txt

# 删除
swift delete mycontainer file.txt
swift delete mycontainer

8.6 配额管理

# 用户配额(对象数量)
radosgw-admin quota enable --quota-scope=user --uid=s3user
radosgw-admin quota set --quota-scope=user --uid=s3user --max-objects=1000

# Bucket 配额(容量)
radosgw-admin quota enable --quota-scope=bucket --bucket=mybucket
radosgw-admin quota set --quota-scope=bucket --bucket=mybucket --max-size=10G

# 全局配额
radosgw-admin global quota set --quota-scope=user --max-objects=5000
radosgw-admin global quota enable --quota-scope=user
radosgw-admin period update --commit

九、文件存储(CephFS)

9.1 核心概念

  • MDS:元数据服务器,支持 active/standby 多活
  • 需要两个池:metadata pool 和 data pool
  • 支持内核挂载(krbd)和 FUSE 挂载

9.2 部署 CephFS

# 方法1:手动创建池和文件系统
ceph osd pool create cephfs_data 32
ceph osd pool create cephfs_metadata 32
ceph fs new myfs cephfs_metadata cephfs_data

# 方法2:volume 方式(推荐)
ceph fs volume create myfs --placement="3 host1 host2 host3"

# 部署 MDS
ceph orch apply mds myfs --placement="3 host1 host2 host3"

9.3 挂载 CephFS

内核挂载

# 安装 ceph-common
dnf install -y ceph-common

# 复制配置和 keyring
scp /etc/ceph/ceph.conf client:/etc/ceph/
scp /etc/ceph/ceph.client.admin.keyring client:/etc/ceph/

# 挂载
mount.ceph mon1,mon2,mon3:/ /mnt/cephfs -o name=admin

# 或使用 mount 命令
mount -t ceph mon1:6789,mon2:6789:/ /mnt/cephfs -o name=admin,secretfile=/etc/ceph/admin.secret

# 挂载子目录
mount -t ceph mon1:/subdir /mnt/cephfs -o name=admin

FUSE 挂载

# 安装 ceph-fuse
dnf install -y ceph-fuse

# 挂载
ceph-fuse -n client.admin /mnt/cephfs

# 挂载子目录
ceph-fuse -n client.admin -r /subdir /mnt/cephfs

9.4 用户授权

# 为指定路径授权
ceph fs authorize myfs client.myuser / rw

# 更细粒度
ceph fs authorize myfs client.myuser / r /dir2 rw /dir3 rwps

9.5 快照

# 启用快照(默认启用)
ceph fs set myfs allow_new_snaps true

# 创建快照(在 .snap 目录下创建子目录)
mkdir /mnt/cephfs/.snap/snap1

# 恢复文件
cp /mnt/cephfs/.snap/snap1/file /restore/

# 删除快照
rmdir /mnt/cephfs/.snap/snap1

9.6 CephFS 镜像(Mirroring)

  • 支持异步复制,基于快照实现
  • 需要 Pacific v16.2.0+
# 源集群部署 cephfs-mirror
ceph orch apply cephfs-mirror host1

# 目标集群创建用户
ceph fs authorize cephfs client.cephfs-mirror / rwps

# 源集群启用 mirror 模块和功能
ceph mgr module enable mirroring
ceph fs snapshot mirror enable myfs

# 目标集群生成引导 token
ceph fs snapshot mirror peer_bootstrap create myfs client.cephfs-mirror backup

# 源集群导入 token
ceph fs snapshot mirror peer_bootstrap import myfs <token>

# 添加需要镜像的目录
ceph fs snapshot mirror add myfs /path

十、常用运维命令速查

10.1 集群状态

ceph -s
ceph health detail
ceph status
ceph df
ceph osd tree
ceph pg stat

10.2 服务管理

ceph orch ps
ceph orch ls
ceph orch restart <service>
ceph orch daemon restart <daemon>
ceph orch host ls
ceph orch host add <hostname> <ip>

10.3 OSD 管理

ceph osd out osd.0
ceph osd in osd.0
ceph osd rm osd.0
ceph orch device zap <host> <device> --force
ceph orch osd rm <osd-id> --zap

10.4 MON 管理

ceph mon stat
ceph mon dump
ceph quorum_status
ceph mon add <name> <ip>
ceph mon remove <name>

10.5 日志查看

ceph log last [num]
ceph log <message>
ceph orch logs <daemon>

十一、最佳实践与注意事项

  1. 集群规模:生产环境至少 3 个 MON、3 个 MGR,OSD 数量根据容量规划
  2. 网络:推荐分离 public 和 cluster 网络,启用 jumbo frame(MTU 9000)
  3. PG 数量:避免过多或过少,使用 pg_autoscaler 模块自动调整
  4. 监控:启用 Prometheus + Grafana,开启 Dashboard
  5. 备份:使用 RBD 导出、RGW 多站点、CephFS 镜像等机制
  6. 安全:启用 Cephx,限制用户权限,防火墙按需开放端口
  7. 升级:先升级 MON,再 MGR,最后 OSD,注意版本兼容性
  8. 故障处理:定期检查 ceph health,及时处理 WARN/ERR 状态
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐