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 协议的开源对象存储服务器,主打轻量、易用和云原生特性,常用于存储海量非结构化数据(如图片、视频、日志等)。
核心特点
-
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 是 "全能存储集群的一部分",适合需要统一管理块、文件、对象存储的复杂架构。