Ceph分布式存储实战:块存储RBD、对象网关RGW与文件系统CephFS详解
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数据写入流程
- 客户端创建Pool,指定PG数量
- 创建RBD镜像并挂载
- 用户写入的数据被切分为4MB大小的对象块(默认)
- 每个对象通过PG映射到一组OSD(主+从)
- 客户端直接与主OSD通信,主OSD将数据同步到从OSD
- OSD底层使用XFS文件系统存储对象文件
2.3 创建RBD池与镜像
# 创建存储池并初始化ceph osd pool create images_pool3232rbd 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--size1G# 列出镜像rbdlsimages_pool2.4 使用内核模块(krbd)挂载RBD
在客户端安装ceph-common,复制配置和密钥环:
# 客户端安装dnfinstall-yceph-common# 从集群复制配置和keyringscp/etc/ceph/ceph.conf /etc/ceph/ceph.client.rbd.keyring root@client:/etc/ceph/# 映射镜像到块设备rbd map images_pool/webapp1# 生成 /dev/rbd0# 格式化并挂载mkfs.xfs /dev/rbd0mkdir/mnt/webappmount/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 featureenableimages_pool/webapp1 object-map2.7 RBD快照与克隆
快照操作:
# 创建快照(建议先卸载或冻结文件系统)rbd snap create images_pool/webapp@snap1# 列出快照rbd snaplsimages_pool/webapp# 回滚快照rbd snap rollback images_pool/webapp@snap1# 删除快照rbd snaprmimages_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导出与导入
# 导出到文件rbdexportimages_pool/webapp webapp.img# 从文件导入rbdimportwebapp.img images_pool/webapp-backup# 通过管道跨集群复制rbdexportimages_pool/webapp -|sshremote"rbd import - images_pool/webapp"# 仅导出增量变化rbd export-diff --from-snap snap1 rbd/data@snap2 diff.bin# 导入增量rbd import-diff diff.bin rbd/data2.9 RBD镜像跨集群同步(RBD Mirror)
Ceph支持在两个集群之间异步复制RBD镜像,用于灾备。两种模式:
- 单向(active-passive):主集群可读写,备集群只读
- 双向(active-active):两个集群均可读写,需双方向同步
配置要点:
- 两个集群创建同名池,启用
journaling特性 - 在池上启用mirror:
rbd mirror pool enable rbd pool - 在主集群生成引导token:
rbd mirror pool peer bootstrap create --site-name prod rbd > token - 在备集群导入token并部署rbd-mirror守护进程
- 验证状态:
rbd mirror pool status、rbd 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:rgwservice_id:webappplacement:count:3hosts:-ceph1-ceph2-ceph3spec: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 usersuspend--uid=operator radosgw-admin userenable--uid=operator# 删除用户(同时删除数据)radosgw-admin userrm--uid=operator --purge-data3.4 使用AWS CLI访问RGW
# 安装awsclipip3installawscli# 配置凭据(endpoint指向RGW节点)aws configure AWS Access Key ID:12345AWS Secret Access Key:67890# 创建bucketaws--endpoint=http://ceph1:8080 s3 mb s3://mybucket# 上传文件aws--endpoint=http://ceph1:8080 s3cpfile.txt s3://mybucket/# 列出对象aws--endpoint=http://ceph1:8080 s3lss3://mybucket/# 下载对象aws--endpoint=http://ceph1:8080 s3cps3://mybucket/file.txt ./# 删除bucket(需先清空)aws--endpoint=http://ceph1:8080 s3rms3://mybucket--recursiveaws--endpoint=http://ceph1:8080 s3 rb s3://mybucket3.5 使用Swift客户端访问RGW
# 安装python-swiftclientpip3installpython-swiftclient# 创建子用户(Swift需要)radosgw-admin subuser create--uid=operator--subuser=operator:swift--access=full# 设置环境变量exportST_AUTH=http://ceph1:8080/auth/1.0exportST_USER=operator:swiftexportST_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 mycontainer3.6 配额管理
# 用户配额(最大对象数)radosgw-adminquotaenable--quota-scope=user--uid=operator radosgw-adminquotaset--quota-scope=user--uid=operator --max-objects=1024# 桶配额(最大容量)radosgw-adminquotaenable--quota-scope=bucket--bucket=mybucket radosgw-adminquotaset--quota-scope=bucket--bucket=mybucket --max-size=10G# 全局配额(影响所有用户/桶)radosgw-admin globalquotaset--quota-scope user --max-objects=2048radosgw-admin globalquotaenable--quota-scope user radosgw-admin period update--commit3.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_meta3232ceph osd pool create cephfs_data3232# 设置元数据池副本数(建议更高)ceph osd poolsetcephfs_meta size3# 创建文件系统ceph fs new myfs cephfs_meta cephfs_data# 部署MDS服务ceph orch apply mds myfs--placement="3 ceph1 ceph2 ceph3"方式二:卷部署(推荐)
# 一行命令创建文件系统,自动创建池和MDSceph 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-commondnfinstall-yceph-common# 复制ceph.conf和client密钥环scproot@ceph1:/etc/ceph/ceph.conf /etc/ceph/scproot@ceph1:/etc/ceph/ceph.client.myuser.keyring /etc/ceph/# 挂载mount-tceph ceph1,ceph2,ceph3:/ /mnt/myfs-oname=myuser# 挂载子目录mount-tceph ceph1:/subdir /mnt/sub-oname=myuser,fs=myfs永久挂载(/etc/fstab):
ceph1,ceph2,ceph3:/ /mnt/myfs ceph name=myuser,_netdev 0 0FUSE挂载:
dnfinstall-yceph-fuse ceph-fuse-nclient.myuser /mnt/myfs# 挂载子目录ceph-fuse-nclient.myuser-r/subdir /mnt/sub4.5 CephFS快照管理
快照存储在目录下的.snap隐藏目录中。
# 启用快照功能(默认启用)ceph fssetmyfs allow_new_snapstrue# 创建快照(需要用户有's'权限)mkdir/mnt/myfs/.snap/snap1# 恢复文件cp/mnt/myfs/.snap/snap1/deleted_file /mnt/myfs/# 删除快照rmdir/mnt/myfs/.snap/snap14.6 配额管理
使用setfattr设置目录配额:
# 设置目录最大容量10GBsetfattr-nceph.quota.max_bytes-v10000000000/mnt/myfs/dir# 设置最大文件数1000setfattr-nceph.quota.max_files-v1000/mnt/myfs/dir# 查看配额getfattr-nceph.quota.max_bytes /mnt/myfs/dir4.7 CephFS镜像(Mirror)
CephFS支持跨集群异步镜像(基于快照)。配置要点:
- 源集群和目标集群均需启用CephFS
- 部署cephfs-mirror守护进程
- 在目标集群创建引导token,源集群导入
- 指定需要镜像的目录
五、总结
本文详细介绍了Ceph的三大存储接口:
| 接口 | 访问方式 | 典型场景 | 关键特性 |
|---|---|---|---|
| RBD | 块设备(内核/QEMU) | 虚拟机磁盘、数据库 | 快照、克隆、精简配置、跨集群镜像 |
| RGW | S3/Swift API | 对象存储、备份、静态网站 | 多站点复制、用户配额、兼容公有云API |
| CephFS | POSIX文件系统 | 共享存储、HPC、容器持久化 | MDS多活、快照、配额、跨集群镜像 |
通过掌握这三种存储方式,你可以利用Ceph构建统一的云存储平台,满足不同应用的存储需求。
