当前位置: 首页 > news >正文

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 64rbd 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/rbd0mkdir /rbd-testmount /dev/rbd0 /rbd-test# 4. 测试读写echo "RBD block test" > /rbd-test/test.txtcat /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-testrbd 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@v1rbd 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            # 显示myfsceph 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操作)cdlsrm root@ceph21 -rf          #没有的话可以不删systemctl stop dockerapt install ceph---------------------------------------------------------------------cat /etc/ceph/admin.keyringmount -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-itceph osd pool rm cephfs-data cephfs-data --yes-i-really-really-mean-itceph 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 服务:bashsystemctl restart ceph-rgw@rgw.server-21  # 实例名需与配置一致验证:bashcurl http://localhost:新端口号  # 应返回 XML 格式的错误信息(未认证)​​​步骤 1:手动创建 RGW 规格文件# 直接新建 rgw-spec.yaml 文件,内容根据你的集群信息填写:vim rgw-spec.yaml# 文件内容模板(需替换以下参数):service_type: rgwservice_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 安装s3cmdapt install -y s3cmd#### 3.2 配置s3cmds3cmd --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-pippip install boto3# 编写第一个脚本vim rgw_upload.py​import boto3from botocore.client import Configimport 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.pyimport boto3from botocore.client import Configimport argparseimport 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. 上传本地文件到bucketecho "RGW object test" > test.objs3cmd put test.obj s3://mybucket/# 3. 列出bucket中的对象s3cmd ls s3://mybucket/# 4. 下载对象s3cmd get s3://mybucket/test.obj downloaded.objcat downloaded.obj  # 验证内容# 5. 删除对象和buckets3cmd rm s3://mybucket/test.objs3cmd 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 的区别

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

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

http://www.dtcms.com/a/568510.html

相关文章:

  • 【前端】从零开始搭建现代前端框架:React 19、Vite、Tailwind CSS、ShadCN UI 完整实战教程-第1章:项目概述与技术栈介绍
  • react使用ag-grid及常用api笔记
  • MiniEngine学习笔记 : CommandListManager
  • 人工智能讲师数据治理讲师叶梓《数字化转型与大模型技术应用培训提纲》
  • 1.7.课设实验-数据结构-二叉树-文件夹创建系统
  • 互联网大学生创新创业项目计划书seo网址查询
  • 同时打开两个浏览器页面,关闭 A 页面的时候,要求 B 页面同时关闭,怎么实现?
  • 什么是react?
  • Arbess零基础学习 - 使用Arbess+GitLab实现 React.js 项目自动化构建/主机部署
  • 从事网站开发需要的证书网页设计免费网站推荐
  • 任何数据结构的构造或初始化,都应指定大小,避免数据结构无限增长吃光内存【示例】
  • 【开题答辩实录分享】以《基于java的宿舍楼洗衣机预约管理系统》为例进行答辩实录分享
  • 如何在iPhone 17/16/15上显示电池百分比
  • 网站换主机引擎网站推广法
  • 【普中STM32F1xx开发攻略--标准库版】-- 第 13 章 STM32 位带操作
  • MySQL绿色版完整教程:下载、安装、配置与远程访问
  • 集合(开发重点)
  • 如何通过第三方API接口获取拼多多店铺信息?
  • ⸢ 拾贰 ⸥⤳ 实战攻防演练:红蓝对抗 有效性检验
  • Flutter 与 Native的比较
  • 做网站要用到什么泰安有哪些景点
  • Java EE - Thread类的基本使用
  • 社会真相社会现实丛林社会强者思维社会关系价值交换社会法则社会圈子社会阶层电子书籍PDF
  • 轻量化的网络模型:SqueezeNet 详解与复现(已解决)
  • Adobe Acrobat DC PDF如何批量文本替换
  • 帝国cms 微信小程序获取手机号码的api接口
  • 南昌网站搭建服务免费涨1000粉丝网站
  • linux USB摄像头不停掉线问题
  • 本地开发调试企业微信回调接口不顺畅?利用 CPolar 实现内网穿透,快速建立公网访问通道
  • 金融数仓项目介绍