《ceph分布式存储》
·
一、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.z,x.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 数据读写流程
写入流程:
- Client 从 MON 获取 cluster map
- Client 计算对象的 PG 和主 OSD
- Client 向主 OSD 发送写入请求
- 主 OSD 写入本地,并向副本 OSD 发送写入
- 副本 OSD 完成后,主 OSD 向 Client 确认
读取流程:
- Client 获取 cluster map
- Client 计算主 OSD 位置
- 直接向主 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 配置来源及优先级
- 编译默认值
- 集中配置数据库(MON 维护)
- 本地配置文件
/etc/ceph/ceph.conf - 环境变量
- 命令行参数
较新设置覆盖较早设置,配置文件覆盖数据库设置。
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>
十一、最佳实践与注意事项
- 集群规模:生产环境至少 3 个 MON、3 个 MGR,OSD 数量根据容量规划
- 网络:推荐分离 public 和 cluster 网络,启用 jumbo frame(MTU 9000)
- PG 数量:避免过多或过少,使用
pg_autoscaler模块自动调整 - 监控:启用 Prometheus + Grafana,开启 Dashboard
- 备份:使用 RBD 导出、RGW 多站点、CephFS 镜像等机制
- 安全:启用 Cephx,限制用户权限,防火墙按需开放端口
- 升级:先升级 MON,再 MGR,最后 OSD,注意版本兼容性
- 故障处理:定期检查
ceph health,及时处理 WARN/ERR 状态
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)