1、简介
Ceph 是一个开源分布式存储系统,支持块存储(RBD)、文件存储(CephFS)和对象存储三大类型。Ceph RGW(Rados Gateway)是 Ceph 提供的对象存储接口服务,兼容 Amazon S3 和 OpenStack Swift API,使得 Ceph 集群不仅能作为底层存储,还能通过标准接口为用户和应用提供对象存储服务。
RGW 对象存储架构核心概念包括 Realm、ZoneGroup、Zone 和 RGW 实例四个层次,能够支持多地域、多副本、高可用和灵活的访问控制,满足企业级云存储需求。
2、特点
- 多层级管理:通过 Realm、ZoneGroup、Zone 的分层管理,实现灵活的多地域部署和数据复制。
- 高可用性和容灾:跨 ZoneGroup 的数据复制与同步保障数据的高可靠性。
- 兼容性强:支持 S3、Swift 标准接口,方便接入各种云原生应用和工具。
- 可扩展性强:RGW 可以水平扩展,支持数以万计的并发请求。
- 细粒度权限控制:支持用户和子用户管理,访问策略灵活。
- 集成 Kubernetes:支持使用 Ceph Orchestrator 统一管理 RGW 部署和升级。
3、使用场景
- 企业私有云存储利用 Ceph RGW 构建私有云对象存储,满足企业对数据安全和性能的双重需求。
- 备份与归档通过多 ZoneGroup 配置实现跨数据中心的数据备份与异地容灾。
- 大数据与AI训练数据存储高性能、高并发的对象存储服务,适合存储大规模训练数据和日志文件。
- 云原生应用的持久化存储兼容 S3 的存储后端,支持 Kubernetes 环境下的云原生应用访问对象存储。
- 混合云存储与公有云存储接口兼容,方便实现本地和云端数据同步与迁移。
4、架构说明
你需要先用
radosgw-admin
创建 Realm → ZoneGroup → Zone,然后再部署 RGW
Ceph RGW对象存储架构
Realm
└── ZoneGroup
└── Zone
└── RGW (Rados Gateway, 即对象网关服务)
结构说明
- Realm(领域)
- 顶层逻辑实体,类似一个大业务范围或地理区域的划分。
- 用于管理多个 ZoneGroup,支持全局复制和数据同步策略。
- ZoneGroup(区域组)
- Realm 下的一个区域集合。
- 负责定义数据的复制和同步策略,保障数据的高可用性和容灾能力。
- ZoneGroup 内的 Zone 之间会根据策略进行数据同步。
- Zone(区域)
- ZoneGroup 里的具体区域单元,可以是一个数据中心或逻辑分区。
- 每个 Zone 运行一个或多个 RGW 实例,处理该区域的对象存储请求。
- Zone 内的 RGW 实例通常配置负载均衡,保障请求高效处理。
- RGW(Rados Gateway)
- 对象存储的访问入口,兼容 S3 和 Swift API。
- 负责处理客户端请求、鉴权、访问控制以及数据的读写。
- RGW 运行在 Ceph 集群节点上,直接与底层存储交互。
5、创建RGW
创建 Realm
radosgw-admin realm create --rgw-realm=myrealm --default
创建 ZoneGroup
radosgw-admin zonegroup create --rgw-zonegroup=myzonegroup --master --default
创建 Zone
radosgw-admin zone create --rgw-zonegroup=myzonegroup --rgw-zone=myzone --master --default
同步配置
radosgw-admin period update --commit
再部署 RGW
ceph orch apply rgw myrealm --realm=myrealm --zonegroup=myzonegroup --zone=myzone --placement="1 ceph-01" --port=8080
myrealm
:RGW 的 Realm 名称(类似逻辑隔离空间)。myzonegroup
:ZoneGroup 名称(区域组)。myzone
:Zone 名称(具体存储区域)。--placement
:指定运行 RGW 的节点,这里是在ceph-01
上。
如果不想手动配置 Realm / ZoneGroup / Zone,可以直接:
ceph orch apply rgw default default default --placement="1 ceph-01"
创建用户
~ ❯ radosgw-admin user create --uid="testuser"--display-name="Test User" root@ceph-01 15:32:36
{
"user_id": "testuser",
"display_name": "Test User",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "testuser",
"access_key": "JSS7YU6E5YBOLRO6IC2S",
"secret_key": "PkjgC46Zi5zDNQiBmWXRMKBoZTzvwj5LjoFCJHs5"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
6、使用对象存储
方式 1:S3 CLI(aws-cli)
安装 AWS CLI
pip install awscli
配置
~ ❯ aws configure
AWS Access Key ID [None]: JSS7YU6E5YBOLRO6IC2S
AWS Secret Access Key [None]: PkjgC46Zi5zDNQiBmWXRMKBoZTzvwj5LjoFCJHs5
Default region name [None]: us-east-1
Default output format [None]: json
创建桶(bucket)
~ ❯ aws --endpoint-url http://172.22.1.101:8080 s3 mb s3://mybucket
make_bucket: mybucket
上传文件
~/vdbench50407 ❯ aws --endpoint-url http://172.22.1.101:8080 s3 cp read.txt s3://mybucket/
upload: ./read.txt to s3://mybucket/read.txt
列出文件
~/vdbench50407 ❯ aws --endpoint-url http://172.22.1.101:8080 s3 ls s3://mybucket/
2025-08-12 15:50:27 710 read.txt
方式 2:s3cmd
安装 s3cmd
- Ubuntu/Debian:
apt update && apt install -y s3cmd
- CentOS/RHEL:
yum install -y s3cmd
运行配置命令
s3cmd --configure
按提示填写参数
配置项描述 | 示例填写 | 说明 |
---|---|---|
Access Key | H1YK9X4WT4PMC3U4TZ8G | 你用 radosgw-admin user create 创建用户时得到的 Access Key |
Secret Key | h7QAmj9sKQoBROkOArxg7I2xjVYQ3w6xNx1pMkGA | 同上 Secret Key |
Default Region | us-east-1 | 任何有效值即可,推荐和 RGW Realm 一致 |
S3 Endpoint | http://172.22.1.101:8080 | 你的 RGW 节点 IP 和端口 |
DNS-style bucket+hostname:port template | %(bucket)s | 必须是这个,不要写成 URL,表示 path-style 访问 |
Encryption password | 空(直接回车) | 用于本地文件加密,Ceph RGW 不需要 |
Path to GPG program | /usr/bin/gpg | 默认即可 |
Use HTTPS protocol | No | 你的 RGW 是 HTTP,不是 HTTPS |
HTTP Proxy server name | 空(直接回车) | 如果有代理才填 |
HTTP Proxy server port | 0 | 同上 |
配置示例
你也可以直接创建
~/.s3cfg
文件,内容如下(替换成你的实际信息):
[default]
access_key = JSS7YU6E5YBOLRO6IC2S
secret_key = PkjgC46Zi5zDNQiBmWXRMKBoZTzvwj5LjoFCJHs5
host_base = 172.22.1.101:8080
host_bucket =
use_https = False
signature_v2 = False
dns_bucket = False
常用命令示范
# 列出所有bucket
~/vdbench50407 ❯ s3cmd ls
2025-08-1207:49 s3://mybucket
# 创建bucket
s3cmd mb s3://testbucket123
# 上传文件
~/vdbench50407 ❯ s3cmd put write.txt s3://testbucket123/
upload: 'write.txt'-> 's3://testbucket123/write.txt' [1 of 1]
710 of 710 100% in 0s 92.25 KB/s done
# 下载文件
~/vdbench50407 ❯ s3cmd get s3://testbucket123/write.txt /tmp
download: 's3://testbucket123/write.txt'-> '/tmp/write.txt' [1 of 1]
710 of 710 100% in 0s 15.53 KB/s done
# 删除文件
s3cmd del s3://testbucket123/write.txt
# 删除bucket(必须空桶)
s3cmd rb s3://testbucket123
7、注意事项
- 确保 RGW 端口 8080 在防火墙和网络上是可访问的
host_bucket = %(bucket)s
是关键,使用 path-style 访问,避免 DNS 解析问题use_https = False
,因为默认 RGW HTTP 监听,除非你启用了 HTTPS- 如果之前用主机名访问失败,尝试用 IP 地址,或者配置 DNS/hosts
8、常见问题
- 端口访问不了
- 检查防火墙、SELinux(
setenforce 0
测试)。
- 检查防火墙、SELinux(
- AWS CLI 提示签名错误
- 确认
--endpoint-url
写对(必须带http://
)。
- 确认
- 上传大文件很慢
- 调整 RGW 线程数:
ceph config set client.rgw rgw_thread_pool_size 512
声明:来自IT运维大爆炸,仅代表创作者观点。链接:https://eyangzhen.com/2249.html