Ceph常用的三种存储操作

Ceph常用操作

以下实验将重点演示Ceph的三种核心存储类型(块存储RBD、文件存储CephFS、对象存储RGW)的配置与使用,基于已部署的3节点cephadm集群(6个OSD)。

前提条件

  • 已完成3节点Ceph集群部署(状态HEALTH_OK)。

  • 所有节点已安装ceph-common工具(apt install -y ceph-common)。

一、块存储(RBD)操作

RBD(RADOS Block Device)提供块级存储,类似本地磁盘,适合虚拟机、容器等场景。

复制代码
 ### 1. 创建RBD存储池与镜像
 # 1. 创建RBD存储池(pg数:6 OSD × 10 = 60 → 取64)
 ceph osd pool create rbd-pool 64 64
 rbd pool init rbd-pool      # 初始化RBD功能
 # 2. 在rdb-pool池创建一个10GB的镜像
 rbd create test-image --size 10G --pool rdb-pool
 # 3. 查看镜像信息
 rbd ls rbd-pool             # 列出池内所有镜像
 # 查看镜像
 rbd ls --pool rdb-pool      # 应显示test-image
 ​
 ### 2. 映射RBD镜像到本地并使用
 # 1. 映射镜像到本地设备(需root权限)
 rbd map rbd-pool/test-image
 # 2. 查看映射结果(应显示/dev/rbd0)
 rbd showmapped
 # 3. 格式化并挂载
 mkfs.ext4 /dev/rbd0
 mkdir /rbd-test
 mount /dev/rbd0 /rbd-test
 # 4. 测试读写
 echo "RBD block test" > /rbd-test/test.txt
 cat /rbd-test/test.txt  # 验证内容
 ​
 # 或者换一种方法测试写入数据(dd容易覆盖掉原本的东西,慎用!!!)
 dd if=/dev/zero of=/rbd-test/test.txt bs=1G count=5  # 写入5GB文件
 # 验证数据
 ls -lh /rbd-test/test.txt  # 应显示5GB文件
 df -h /rbd-test  # 查看挂载空间
 ​
 ### 3. 镜像快照与克隆(高级功能)
 # 1. 创建快照
 rbd snap create rbd-pool/test-image@v1
 # 2. 查看快照
 rbd snap ls rbd-pool/test-image
 # 3. 保护快照(防止删除,用于克隆)
 rbd snap protect rbd-pool/test-image@v1
 # 4. 从快照克隆新镜像
 rbd clone rbd-pool/test-image@v1 rbd-pool/clone-image
 # 5. 查看克隆镜像
 rbd ls rbd-pool
 ​
 ### 4. 清理操作
 umount /rbd-test
 rbd unmap /dev/rbd0
 # 需要先删除克隆子镜像
 rbd rm rdb-pool/clone-image
 # 检查并卸载RDB设备
 rbd unmap /dev/rbd0
 # 检查挂载点,确保/rbd-test已成功卸载(即无输出)
 mount | grep rbd-test
 # 取消快照保护
 rbd snap unprotect rdb-pool/test-image@v1
 # 删除镜像
 rbd snap rm rdb-pool/test-image@v1
 rbd rm rdb-pool/test-image
 # 查看池里是否还有残留
 rbd ls rdb-pool
 ​
 ###清理实验环境(可选)
 若需删除集群,在server-21执行:
 # 停止所有ceph服务
 cephadm rm-cluster --fsid $(ceph fsid) --force
 # 在其他节点清理残留(server-22和server-23)
 rm -rf /var/lib/ceph /etc/ceph

二、文件存储(CephFS)操作

CephFS提供POSIX兼容的文件系统,支持多节点共享读写,适合需要共享文件的场景(如NFS替代)。

复制代码
 ### 1. 创建CephFS存储池与文件系统
 ### CephFS需要两个池:一个用于数据(data),一个用于元数据(metadata)。
 # 1. 创建元数据池和数据池
 ceph osd pool create cephfs-meta 32 32  # 元数据池(pg数较小)
 ceph osd pool create cephfs-data 64 64  # 数据池
 # 2. 创建CephFS文件系统(关联两个池)
 ceph fs new myfs cephfs-meta cephfs-data
 # 3. 查看文件系统状态
 ceph fs ls            # 显示myfs
 ceph fs status myfs   # 详细状态
 ​
 ### 2. 部署MDS(元数据服务器,CephFS必需)
 # 部署2个MDS(高可用,分布在两个节点)
 ceph orch apply mds myfs --placement="server-22,server-23"
 # 查看MDS状态(先是2个starting,后来是2个running)
 ceph orch ps --daemon_type=mds
 # 确认MDS状态(确保1个active,1个standby)
 ceph fs status myfs
 ​
 ### 3. 挂载CephFS到本地(这时候开一台不在Ceph集群里的机器用来访问共享目录)
 # 1. 创建挂载点(192.168.221.21和192.168.221.10都创)
 mkdir -p /mnt/cephfs
 # 2. 获取Ceph管理员密钥(在192.168.221.21上操作,用于挂载认证)
 ceph auth get client.admin -o /etc/ceph/admin.keyring
 -------------中间是Ceph集群以外的机器验证需要多做的步骤-----------------
 scp /etc/ceph/admin.keyring root@192.168.221.10:/root
 # 3. 挂载(指定monitor地址和密钥)(192.168.221.10操作)
 cd
 ls
 rm root@ceph21 -rf          #没有的话可以不删
 systemctl stop docker
 apt install ceph
 ---------------------------------------------------------------------
 cat /etc/ceph/admin.keyring
 mount -t ceph 192.168.221.21:6789,192.168.221.22:6789,192.168.221.23:6789:/ /mnt/cephfs -o name=admin,secret=(这里需要放/etc/ceph/admin.keyring这个文件里面的key)
 # 4. 验证挂载
 df -h /mnt/cephfs
 ​
 ### 4. 清理操作
 # 卸载挂载点
 umount /mnt/cephfs  # 内核驱动挂载
 # 或
 fusermount -u /mnt/cephfs  # FUSE挂载
 # 跟之前一样需要临时开启删除池的权限
 # 如需删除文件系统(谨慎操作)
 ceph fs rm myfs --yes-i-really-mean-it
 ceph osd pool rm cephfs-data cephfs-data --yes-i-really-really-mean-it
 ceph osd pool rm cephfs-meta cephfs-meta --yes-i-really-really-mean-it

挂载完之后,点开池可以看到:

点开文件系统可以看到:

三、对象存储(RGW)操作

RGW(RADOS Gateway)提供S3兼容的对象存储服务,适合存储图片、文档等非结构化数据。

复制代码
 ### 1. 部署RGW服务
 # 1. 部署RGW实例(2个节点,高可用)
 ceph orch apply rgw myrgw --placement="server-21,server-22"
 # 2. 查看RGW状态(确认运行正常,显示running,如果没有可能是慢,多试两次)
 ceph orch ps --daemon_type=rgw
 ​
 ### 2. 配置RGW访问(S3兼容接口)
 #### 2.1 创建S3用户
 # 1. 创建RGW用户(用于S3认证)
 radosgw-admin user create --uid="zhangsan" --display-name="zhangsan"
 # 2. 记录输出中的access_key和secret_key(后续访问需要)
 # 示例输出:
 # {
             "user": "zhangsan",
             "access_key": "MAM6H3O4BV9PPFG19VBG",
             "secret_key": "8ULkmuNgncZxJEuV0MN9nPWG1o9CxtTtN6imnxXR"
    }
 ​
 #### 2.2 配置RGW访问地址
 RGW默认监听`7480`端口,需确认节点端口可访问:
 # 查看RGW监听地址(在server-21或22执行,应显示0.0.0.0:7480)
 netstat -tulpn | grep 7480
 # 如果这个时候没有显示,可能是默认80端口了,用80端口访问一下,如果显示XML就需要修改 RGW 端口(默认 7480)
 ​
 ​
 ​
 RGW(对象存储网关)默认端口为 7480,修改方式简单。
 步骤:
 修改 ceph.conf:在 RGW 配置段(如 [client.rgw.<实例名>])添加:
 ini
 [client.rgw.server-21]  # 实例名格式:rgw.<主机名>
 rgw_frontends = "civetweb port=新端口号"  # 例如 port=8080
 重启 RGW 服务:
 bash
 systemctl restart ceph-rgw@rgw.server-21  # 实例名需与配置一致
 验证:
 bash
 curl http://localhost:新端口号  # 应返回 XML 格式的错误信息(未认证)
 ​
 ​
 ​
 步骤 1:手动创建 RGW 规格文件
 # 直接新建 rgw-spec.yaml 文件,内容根据你的集群信息填写:
 vim rgw-spec.yaml
 # 文件内容模板(需替换以下参数):
 service_type: rgw
 service_id: myrgw  # 与现有 RGW 服务 ID 一致(即 rgw.myrgw 中的 myrgw)
 placement:
   hosts:
     - server-21  # RGW 运行的节点1
     - server-22  # RGW 运行的节点2(与集群状态中的 2 个 daemons 对应)
 port: 7480  # 你需要设置的端口号(如默认7480或其他端口)
 # 确保 service_id: myrgw 与现有服务 ID 一致(从 ceph orch ls --service-type rgw 中 NAME 列的 rgw.myrgw 提取)。
 ​
 步骤 2:先删除现有 RGW 服务(避免冲突)
 # 由于无法直接更新配置,需先删除现有 RGW 服务:
 ceph orch rm rgw.myrgw --force
 # 执行后等待几秒,确认服务已删除:
 ceph orch ls --service-type rgw  # 应无输出或显示 "stopped"
 ​
 步骤 3:用新规格文件重新部署 RGW
 # 使用手动创建的 rgw-spec.yaml 重新部署 RGW,应用端口配置:
 ceph orch apply -i rgw-spec.yaml
 ​
 步骤 4:验证端口是否生效
 # 查看 RGW 服务状态:
 ceph orch ls --service-type rgw
 输出中 PORTS 列应显示为 ?:7480(或你设置的端口),RUNNING 列显示 2/2(表示 2 个实例正常运行)。
 # 检查容器端口映射:
 cephadm ls | grep -A 10 "rgw.myrgw"
 确认 ports 字段包含设置的端口(如 0.0.0.0:7480->7480/tcp)。
 # 测试端口访问:在 RGW 节点执行:
 curl http://localhost:7480
 若返回 XML 格式的错误信息(如 AccessDenied),说明端口已正常监听。
 ​
 访问地址:
 `http://192.168.221.21:7480`(server-21的RGW)、`http://192.168.221.22:7480`(server-22的RGW)。
 能访问到白色的一个xml文件就是对的
 ​
 ### 3. 使用s3cmd工具操作对象存储
 #### 3.1 安装s3cmd
 apt install -y s3cmd
 #### 3.2 配置s3cmd
 s3cmd --configure
 按提示输入:
 - Access Key:步骤2.1中的access_key
 - Secret Key:步骤2.1中的secret_key
 - Default Region:CN(或者默认回车)
 - S3 Endpoint:输入192.168.221.21:7480(或192.168.221.22:7480)
 - DNS-style bucket+hostname:port template:(记得和上面这个IP一样)
 输入%(bucket)s.192.168.221.21:7480
 - 其他选项默认(回车),最后输入`y`保存配置(默认保存到~/.s3cfg)。
 vim ~/.s3cfg
 最后一行加入
 signature_v2 = True
 ​
 #### 3.3 测试对象存储操作
 # 1. 创建bucket(类似文件夹)
 s3cmd mb s3://mybucket
 ----------------到这里前面都一样,下面是Python脚本上传方法----------------
 # 安装模块
 apt install python3-pip
 pip install boto3
 # 编写第一个脚本
 vim rgw_upload.py
 ​
 import boto3
 from botocore.client import Config
 import argparse
 ​
 def upload_file():
     parser = argparse.ArgumentParser()
     parser.add_argument('--local-file', required=True)
     parser.add_argument('--rgw-endpoint', required=True)
     parser.add_argument('--access-key', required=True)
     parser.add_argument('--secret-key', required=True)
     parser.add_argument('--bucket-name', required=True)
     parser.add_argument('--object-name', required=True)
     args = parser.parse_args()
 ​
     # 配置连接 RGW(包含端口)
     s3 = boto3.client(
         's3',
         endpoint_url=args.rgw_endpoint,
         aws_access_key_id=args.access_key,
         aws_secret_access_key=args.secret_key,
         config=Config(signature_version='s3v4'),  # 兼容模式
         region_name='us-east-1'
     )
 ​
     # 检查并创建存储桶
     try:
         s3.head_bucket(Bucket=args.bucket_name)
     except:
         s3.create_bucket(Bucket=args.bucket_name)
 ​
     # 上传文件
     with open(args.local_file, 'rb') as f:
         s3.upload_fileobj(f, args.bucket_name, args.object_name)
     print(f"上传成功:s3://{args.bucket_name}/{args.object_name}")
 ​
 if __name__ == '__main__':
     upload_file()
 ​
 # 编写第二个脚本
 vim rgw_operate.py
 import boto3
 from botocore.client import Config
 import argparse
 import os
 ​
 def operate():
     parser = argparse.ArgumentParser()
     # 基础参数
     parser.add_argument('--action', required=True, help='操作类型:list 或 download')
     parser.add_argument('--rgw-endpoint', required=True)
     parser.add_argument('--access-key', required=True)
     parser.add_argument('--secret-key', required=True)
     parser.add_argument('--bucket-name', required=True)
     # 新增下载所需的参数
     parser.add_argument('--object-name', help='要下载的文件名(仅 download 时需要)')
     parser.add_argument('--local-path', help='本地保存路径(仅 download 时需要)')
     args = parser.parse_args()
 ​
     # 配置连接 RGW(s3v4 签名)
     s3 = boto3.client(
         's3',
         endpoint_url=args.rgw_endpoint,
         aws_access_key_id=args.access_key,
         aws_secret_access_key=args.secret_key,
         config=Config(signature_version='s3v4'),
         region_name='us-east-1'
     )
 ​
     # 执行操作
     if args.action == 'list':
         # 列出文件(复用之前的逻辑)
         try:
             response = s3.list_objects_v2(Bucket=args.bucket_name)
             if 'Contents' in response:
                 print(f"存储桶 {args.bucket_name} 中的文件:")
                 for obj in response['Contents']:
                     print(f"- {obj['Key']}(大小:{obj['Size']} bytes)")
             else:
                 print(f"存储桶 {args.bucket_name} 为空")
         except Exception as e:
             print(f"列出文件失败:{str(e)}")
 ​
     elif args.action == 'download':
         # 下载文件(新增逻辑)
         if not args.object_name or not args.local_path:
             print("错误:下载操作需要 --object-name 和 --local-path 参数")
             return
         # 拼接本地文件路径
         local_file = os.path.join(args.local_path, args.object_name)
         try:
             s3.download_file(args.bucket_name, args.object_name, local_file)
             print(f"文件已下载到:{local_file}")
         except Exception as e:
             print(f"下载失败:{str(e)}")
 ​
     else:
         print(f"不支持的操作:{args.action}(支持 list 或 download)")
 ​
 if __name__ == '__main__':
     operate()
     
 ### 执行命令
 前提你本地有a.txt这个文档,以及修改自己的ip,还有key,以及存储桶名。
 # 上传文件
 python3 rgw_upload.py \
   --local-file "./a.txt" \
   --rgw-endpoint "http://192.168.5.12" \
   --access-key "LISYZY2CM22F36OBT29J" \
   --secret-key "r4SK1arDX4Vk3B3s7D8cEz0tclSMKrnkWLeESmNJ" \
   --bucket-name "mybucket" \
   --object-name "a.txt"
   
 # 查看文件
 python3 rgw_operate.py \
   --action list \
   --rgw-endpoint "http://192.168.5.12:80" \
   --access-key "LISYZY2CM22F36OBT29J" \
   --secret-key "r4SK1arDX4Vk3B3s7D8cEz0tclSMKrnkWLeESmNJ" \
   --bucket-name "mybucket"
   
 # 下载文件
 python3 rgw_operate.py \
   --action download \
   --rgw-endpoint "http://192.168.5.12" \
   --access-key "LISYZY2CM22F36OBT29J" \
   --secret-key "r4SK1arDX4Vk3B3s7D8cEz0tclSMKrnkWLeESmNJ" \
   --bucket-name "mybucket" \
   --object-name "a.txt" \
   --local-path "/tmp/"
 -----------------------------------------------------------------------
 # 2. 上传本地文件到bucket
 echo "RGW object test" > test.obj
 s3cmd put test.obj s3://mybucket/
 # 3. 列出bucket中的对象
 s3cmd ls s3://mybucket/
 # 4. 下载对象
 s3cmd get s3://mybucket/test.obj downloaded.obj
 cat downloaded.obj  # 验证内容
 # 5. 删除对象和bucket
 s3cmd rm s3://mybucket/test.obj
 s3cmd rb s3://mybucket
 ​
 ### 4. 清理操作
 # 删除RGW用户
 radosgw-admin user rm --uid="s3user"
 # 停止RGW服务(如需)
 ceph orch rm rgw.myrgw

总结

本实验完成了Ceph三种核心存储的操作:

  • RBD:块存储,通过映射为本地磁盘使用,支持快照和克隆。

  • CephFS:文件系统,支持多节点共享,POSIX兼容。

  • RGW:对象存储,S3兼容,适合非结构化数据存储。

可根据业务场景选择合适的存储类型,例如:Kubernetes持久化存储用RBD,共享文件用CephFS,海量图片存储用RGW。


MinIO

MinIO 是一款高性能、兼容 S3 协议的开源对象存储服务器,主打轻量、易用和云原生特性,常用于存储海量非结构化数据(如图片、视频、日志等)。

核心特点

  1. S3 协议兼容 :完全兼容 Amazon S3 API,支持各类 S3 工具(如 s3cmd、AWS CLI)和客户端,迁移成本低。

  2. 轻量高效:单二进制文件部署,无依赖;读写性能优异,支持海量小文件和大文件存储。

  3. 开源免费:基于 Apache 2.0 协议开源,可自由部署在私有环境,无需担心商用授权问题。

  4. 云原生适配:支持容器化部署(Docker、K8s),可弹性扩展,适配分布式架构。

  5. 数据安全:支持服务器端加密、SSL/TLS 传输加密、访问权限控制(IAM)等安全特性。

典型应用场景

  • 企业私有云存储:搭建内部对象存储服务,存储业务数据、备份文件等。

  • AI / 大数据存储:存储训练数据、模型文件、日志等海量非结构化数据。

  • 应用后端存储:作为 APP、网站的附件存储服务(如用户头像、上传文件)。

  • 边缘计算存储:因轻量特性,可部署在边缘节点,存储本地采集的数据。

基础架构

  • 单节点模式:单服务器部署,适合测试或小规模场景。

  • 分布式模式:多服务器组成集群,通过 "纠删码"(Erasure Code)实现数据冗余和高可用,支持横向扩展。

与 Ceph RGW 的区别

对比维度 MinIO Ceph RGW
定位 专注对象存储,轻量易用 统一存储(块、文件、对象)的一部分,功能复杂
部署难度 极简(单二进制 / 容器) 复杂(需部署整个 Ceph 集群)
性能 针对对象存储优化,小文件性能突出 兼顾多存储类型,对象存储性能略逊于 MinIO
适用场景 快速搭建对象存储、轻量场景 企业级复杂存储需求,需统一管理多种存储

简单来说,MinIO 是 "专精对象存储的轻骑兵",适合需要快速搭建兼容 S3 的对象存储服务的场景;而 Ceph RGW 是 "全能存储集群的一部分",适合需要统一管理块、文件、对象存储的复杂架构。

相关推荐
星哥说事5 小时前
分布式存储:Ceph、GlusterFS、MinIO架构与部署
分布式·ceph·架构
橙-极纪元7 小时前
文件存储服务有哪些?他们优缺点分别是什么?FastDFS、MinIO、Ceph、HDFS、MooseFS、TFS、七牛云、阿里云 OSS
hdfs·minio·七牛云·tfs·fastdfs·阿里云 oss·文件存储服务
分布式存储与RustFS9 天前
RustFS:MinIO的“平替”还是“乱杀”?
python·rust·对象存储·minio·存储·企业存储·rustfs
Empty_7779 天前
Ceph分布式存储
分布式·ceph
Yyyy48211 天前
Ubuntu22.04LTS基于cephadm快速部署Ceph Reef(18.2.X)集群
linux·服务器·ceph
Q飞了12 天前
分布式存储Ceph与OpenStack、RAID的关系
分布式·ceph·openstack
sky北城12 天前
详解 Ceph 存储——CRUSH 算法
ceph
magic3341656315 天前
Springboot整合MinIO文件服务(windows版本)
windows·spring boot·后端·minio·文件对象存储
分布式存储与RustFS16 天前
存算一体架构的先行者:RustFS在异构计算环境下的探索与实践
大数据·人工智能·物联网·云原生·对象存储·minio·rustfs