Ceph分布式存储实战:块存储RBD、对象网关RGW与文件系统CephFS详解

一、前言

在前三篇文章中,我们分别介绍了Ceph的入门架构、集群部署、配置管理、存储池以及认证授权。本文将深入Ceph的三大存储接口:RBD块存储RGW对象存储CephFS文件系统。通过本文,你将掌握如何创建和使用RBD镜像、部署RADOS网关并提供S3/Swift兼容的对象存储、以及搭建POSIX兼容的共享文件系统。这些是Ceph生产环境中最常用的功能。


二、Ceph块存储(RBD)管理

2.1 RBD简介

RADOS Block Device(RBD)是Ceph提供的块存储接口,将存储池中的对象组合成虚拟块设备,支持:

  • 虚拟磁盘存储(用于虚拟机)
  • Linux内核挂载(krbd模块)
  • QEMU/KVM和OpenStack Cinder启动支持
  • 快照、克隆、精简配置

2.2 RBD数据写入流程

  1. 客户端创建Pool,指定PG数量
  2. 创建RBD镜像并挂载
  3. 用户写入的数据被切分为4MB大小的对象块(默认)
  4. 每个对象通过PG映射到一组OSD(主+从)
  5. 客户端直接与主OSD通信,主OSD将数据同步到从OSD
  6. OSD底层使用XFS文件系统存储对象文件

2.3 创建RBD池与镜像

# 创建存储池并初始化
ceph osd pool create images_pool 32 32
rbd pool init images_pool   # 等同于启用rbd应用类型

# 创建专用用户(推荐)
ceph auth get-or-create client.rbd mon 'profile rbd' osd 'profile rbd' -o /etc/ceph/ceph.client.rbd.keyring

# 创建1GB大小的RBD镜像
rbd create images_pool/webapp1 --size 1G

# 列出镜像
rbd ls images_pool

2.4 使用内核模块(krbd)挂载RBD

在客户端安装ceph-common,复制配置和密钥环:

# 客户端安装
dnf install -y ceph-common
# 从集群复制配置和keyring
scp /etc/ceph/ceph.conf /etc/ceph/ceph.client.rbd.keyring root@client:/etc/ceph/

# 映射镜像到块设备
rbd map images_pool/webapp1   # 生成 /dev/rbd0
# 格式化并挂载
mkfs.xfs /dev/rbd0
mkdir /mnt/webapp
mount /dev/rbd0 /mnt/webapp

持久化挂载:配置/etc/ceph/rbdmap/etc/fstab,启用rbdmap.service

2.5 RBD镜像管理命令

命令 功能
rbd info <pool>/<image> 查看镜像详情
rbd resize --size <size> <image> 调整大小(支持在线扩容)
rbd cp <src> <dst> 复制镜像
rbd mv <old> <new> 重命名(不支持跨池)
rbd trash mv <image> 移入回收站
rbd trash restore -p <pool> <id> 从回收站恢复
rbd rm <image> 永久删除

2.6 RBD镜像特性

格式2的RBD镜像支持以下可选特性(features):

特性 位值 说明
layering 1 支持快照和克隆
striping 2 分条v2
exclusive-lock 4 独占锁
object-map 8 对象映射(依赖exclusive-lock)
fast-diff 16 快速比较差异
deep-flatten 32 扁平化所有快照
journaling 64 日志(用于mirror)

默认启用:layering, exclusive-lock, object-map, fast-diff, deep-flatten。

# 禁用/启用特性
rbd feature disable images_pool/webapp1 object-map
rbd feature enable images_pool/webapp1 object-map

2.7 RBD快照与克隆

快照操作

# 创建快照(建议先卸载或冻结文件系统)
rbd snap create images_pool/webapp@snap1
# 列出快照
rbd snap ls images_pool/webapp
# 回滚快照
rbd snap rollback images_pool/webapp@snap1
# 删除快照
rbd snap rm images_pool/webapp@snap1
# 删除所有快照
rbd snap purge images_pool/webapp

克隆(需要先保护快照):

# 保护快照
rbd snap protect images_pool/webapp@snap1
# 创建克隆(可读写)
rbd clone images_pool/webapp@snap1 images_pool/webapp-clone
# 查看克隆关系
rbd children images_pool/webapp@snap1
# 扁平化克隆(脱离父镜像)
rbd flatten images_pool/webapp-clone

克隆后的镜像与父镜像有相同文件系统UUID,需修改UUID(如xfs_admin -U)才能同时挂载。

2.8 RBD导出与导入

# 导出到文件
rbd export images_pool/webapp webapp.img
# 从文件导入
rbd import webapp.img images_pool/webapp-backup
# 通过管道跨集群复制
rbd export images_pool/webapp - | ssh remote "rbd import - images_pool/webapp"
# 仅导出增量变化
rbd export-diff --from-snap snap1 rbd/data@snap2 diff.bin
# 导入增量
rbd import-diff diff.bin rbd/data

2.9 RBD镜像跨集群同步(RBD Mirror)

Ceph支持在两个集群之间异步复制RBD镜像,用于灾备。两种模式:

  • 单向(active-passive):主集群可读写,备集群只读
  • 双向(active-active):两个集群均可读写,需双方向同步

配置要点:

  1. 两个集群创建同名池,启用journaling特性
  2. 在池上启用mirror:rbd mirror pool enable rbd pool
  3. 在主集群生成引导token:rbd mirror pool peer bootstrap create --site-name prod rbd > token
  4. 在备集群导入token并部署rbd-mirror守护进程
  5. 验证状态:rbd mirror pool statusrbd mirror image status

三、Ceph对象存储(RGW)管理

3.1 RGW简介

RADOS Gateway(RGW)是构建在librados之上的对象存储接口,兼容:

  • Amazon S3 API:使用存储桶(bucket)和对象
  • OpenStack Swift API:使用容器(container)和对象

RGW守护进程(radosgw)提供HTTP/HTTPS服务,支持多站点部署和负载均衡。

3.2 RGW部署

使用Ceph编排器部署RGW服务:

# 创建realm(域)
radosgw-admin realm create --rgw-realm=webapp --default

# 创建zonegroup(区域组)
radosgw-admin zonegroup create --rgw-realm=webapp --rgw-zonegroup=video --master --default

# 创建zone(区域)
radosgw-admin zone create --rgw-realm=webapp --rgw-zonegroup=video --rgw-zone=storage1 --master --default

# 提交配置
radosgw-admin period update --commit

# 部署RGW服务(3个实例,端口8080)
ceph orch apply rgw webapp --placement="3 ceph1 ceph2 ceph3" --realm=webapp --zone=storage1 --port=8080

使用YAML服务规格文件:

service_type: rgw
service_id: webapp
placement:
  count: 3
  hosts:
    - ceph1
    - ceph2
    - ceph3
spec:
  rgw_frontend_port: 8080

应用:ceph orch apply -i rgw_service.yaml

3.3 RGW用户管理

# 创建S3用户
radosgw-admin user create --uid=operator --display-name="S3 Operator" --access-key=12345 --secret-key=67890

# 列出用户
radosgw-admin user list

# 查看用户信息
radosgw-admin user info --uid=operator

# 生成新密钥
radosgw-admin key create --uid=operator --gen-secret

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

# 删除用户(同时删除数据)
radosgw-admin user rm --uid=operator --purge-data

3.4 使用AWS CLI访问RGW

# 安装awscli
pip3 install awscli

# 配置凭据(endpoint指向RGW节点)
aws configure
AWS Access Key ID: 12345
AWS Secret Access Key: 67890

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

# 上传文件
aws --endpoint=http://ceph1:8080 s3 cp file.txt s3://mybucket/

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

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

# 删除bucket(需先清空)
aws --endpoint=http://ceph1:8080 s3 rm s3://mybucket --recursive
aws --endpoint=http://ceph1:8080 s3 rb s3://mybucket

3.5 使用Swift客户端访问RGW

# 安装python-swiftclient
pip3 install python-swiftclient

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

# 设置环境变量
export ST_AUTH=http://ceph1:8080/auth/1.0
export ST_USER=operator:swift
export ST_KEY=<secret_key>

# 创建容器
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

3.6 配额管理

# 用户配额(最大对象数)
radosgw-admin quota enable --quota-scope=user --uid=operator
radosgw-admin quota set --quota-scope=user --uid=operator --max-objects=1024

# 桶配额(最大容量)
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=2048
radosgw-admin global quota enable --quota-scope user
radosgw-admin period update --commit

3.7 多站点RGW

Ceph RGW支持多站点主动-主动复制,通过Realm(域)、Zonegroup(区域组)、Zone(区域)三层结构实现。配置流程略(详见实验手册)。


四、Ceph文件系统(CephFS)管理

4.1 CephFS简介

CephFS是一个兼容POSIX的分布式文件系统,构建在RADOS之上。特点:

  • 支持多活MDS(元数据服务器)提高元数据性能
  • 支持备用MDS实现高可用
  • 支持快照、配额、ACL
  • 客户端可通过内核驱动(kernel)或FUSE挂载

4.2 部署CephFS

方式一:手动部署

# 创建元数据池和数据池
ceph osd pool create cephfs_meta 32 32
ceph osd pool create cephfs_data 32 32

# 设置元数据池副本数(建议更高)
ceph osd pool set cephfs_meta size 3

# 创建文件系统
ceph fs new myfs cephfs_meta cephfs_data

# 部署MDS服务
ceph orch apply mds myfs --placement="3 ceph1 ceph2 ceph3"

方式二:卷部署(推荐)

# 一行命令创建文件系统,自动创建池和MDS
ceph fs volume create myfs --placement="3 ceph1 ceph2 ceph3"

4.3 授权客户端访问

# 创建客户端用户并授权(/目录完全控制)
ceph fs authorize myfs client.myuser / rwps

# 限制到子目录
ceph fs authorize myfs client.restricted / r /subdir rw

授权选项:

  • r:读
  • w:写
  • p:允许设置布局和配额
  • s:允许创建快照

4.4 挂载CephFS

内核挂载(krbd风格)

# 客户端安装ceph-common
dnf install -y ceph-common

# 复制ceph.conf和client密钥环
scp root@ceph1:/etc/ceph/ceph.conf /etc/ceph/
scp root@ceph1:/etc/ceph/ceph.client.myuser.keyring /etc/ceph/

# 挂载
mount -t ceph ceph1,ceph2,ceph3:/ /mnt/myfs -o name=myuser
# 挂载子目录
mount -t ceph ceph1:/subdir /mnt/sub -o name=myuser,fs=myfs

永久挂载(/etc/fstab):

ceph1,ceph2,ceph3:/ /mnt/myfs ceph name=myuser,_netdev 0 0

FUSE挂载

dnf install -y ceph-fuse
ceph-fuse -n client.myuser /mnt/myfs
# 挂载子目录
ceph-fuse -n client.myuser -r /subdir /mnt/sub

4.5 CephFS快照管理

快照存储在目录下的.snap隐藏目录中。

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

# 创建快照(需要用户有's'权限)
mkdir /mnt/myfs/.snap/snap1

# 恢复文件
cp /mnt/myfs/.snap/snap1/deleted_file /mnt/myfs/

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

4.6 配额管理

使用setfattr设置目录配额:

# 设置目录最大容量10GB
setfattr -n ceph.quota.max_bytes -v 10000000000 /mnt/myfs/dir
# 设置最大文件数1000
setfattr -n ceph.quota.max_files -v 1000 /mnt/myfs/dir
# 查看配额
getfattr -n ceph.quota.max_bytes /mnt/myfs/dir

4.7 CephFS镜像(Mirror)

CephFS支持跨集群异步镜像(基于快照)。配置要点:

  1. 源集群和目标集群均需启用CephFS
  2. 部署cephfs-mirror守护进程
  3. 在目标集群创建引导token,源集群导入
  4. 指定需要镜像的目录

五、总结

本文详细介绍了Ceph的三大存储接口:

接口 访问方式 典型场景 关键特性
RBD 块设备(内核/QEMU) 虚拟机磁盘、数据库 快照、克隆、精简配置、跨集群镜像
RGW S3/Swift API 对象存储、备份、静态网站 多站点复制、用户配额、兼容公有云API
CephFS POSIX文件系统 共享存储、HPC、容器持久化 MDS多活、快照、配额、跨集群镜像

通过掌握这三种存储方式,你可以利用Ceph构建统一的云存储平台,满足不同应用的存储需求。

Logo

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

更多推荐