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.pyimport boto3from botocore.client import Configimport argparsedef 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 osdef 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 协议的开源对象存储服务器,主打轻量、易用和云原生特性,常用于存储海量非结构化数据(如图片、视频、日志等)。
核心特点
S3 协议兼容:完全兼容 Amazon S3 API,支持各类 S3 工具(如
s3cmd、AWS CLI)和客户端,迁移成本低。轻量高效:单二进制文件部署,无依赖;读写性能优异,支持海量小文件和大文件存储。
开源免费:基于 Apache 2.0 协议开源,可自由部署在私有环境,无需担心商用授权问题。
云原生适配:支持容器化部署(Docker、K8s),可弹性扩展,适配分布式架构。
数据安全:支持服务器端加密、SSL/TLS 传输加密、访问权限控制(IAM)等安全特性。
典型应用场景
企业私有云存储:搭建内部对象存储服务,存储业务数据、备份文件等。
AI / 大数据存储:存储训练数据、模型文件、日志等海量非结构化数据。
应用后端存储:作为 APP、网站的附件存储服务(如用户头像、上传文件)。
边缘计算存储:因轻量特性,可部署在边缘节点,存储本地采集的数据。
基础架构
单节点模式:单服务器部署,适合测试或小规模场景。
分布式模式:多服务器组成集群,通过 “纠删码”(Erasure Code)实现数据冗余和高可用,支持横向扩展。
与 Ceph RGW 的区别
| 对比维度 | MinIO | Ceph RGW |
|---|---|---|
| 定位 | 专注对象存储,轻量易用 | 统一存储(块、文件、对象)的一部分,功能复杂 |
| 部署难度 | 极简(单二进制 / 容器) | 复杂(需部署整个 Ceph 集群) |
| 性能 | 针对对象存储优化,小文件性能突出 | 兼顾多存储类型,对象存储性能略逊于 MinIO |
| 适用场景 | 快速搭建对象存储、轻量场景 | 企业级复杂存储需求,需统一管理多种存储 |
简单来说,MinIO 是 “专精对象存储的轻骑兵”,适合需要快速搭建兼容 S3 的对象存储服务的场景;而 Ceph RGW 是 “全能存储集群的一部分”,适合需要统一管理块、文件、对象存储的复杂架构。
