Ceph 生产环境搭建 | 第 11 天:Ceph 对象存储 RGW 网关部署与 S3 兼容

第 11/20 天

在 Ceph 存储生态中,对象存储是最贴近云原生应用的一种数据访问接口。无论是备份归档、镜像仓库(Harbor/Quay)、大数据湖,还是 Web 静态资源托管,对象存储凭借其扁平命名空间、无限扩展能力和标准 S3 协议,已经成为现代云架构的事实标准。Ceph 的 RADOS Gateway(RGW,又称 radosgw)正是为集群提供 S3 与 Swift 兼容对象存储接口的关键组件。本篇将深入解析 RGW 的架构原理,并在 Ubuntu 24.04 LTS + Ceph Squid v19 环境下完成从网关部署、存储池规划、用户创建到 S3 客户端对接的完整生产实践。

RGW 架构与工作原理

RGW 在 Ceph 体系中的位置

Ceph 提供三种存储接口:块存储(RBD)、对象存储(RGW)和文件系统(CephFS)。RGW 是一个独立的守护进程(radosgw),它本身不存储数据,而是作为”协议翻译层”运行:接收来自客户端的 S3/Swift HTTP 请求,将其转换为对底层 RADOS 存储池的读写操作,最终数据持久化在 OSD 上的 BlueStore 中。

层级 组件 职责
客户端层 s3cmd / aws-cli / SDK S3/Swift 协议客户端
接入层 负载均衡(nginx/haproxy) 分发 HTTP 流量到多 RGW
网关层 radosgw 守护进程 协议解析与 RADOS 调用
元数据层 index pool / meta pool bucket index、用户元数据
数据层 data pool 对象实际数据(rgw.main)
存储层 OSD / BlueStore 数据持久化

数据流向与对象布局

一个 S3 PUT 请求的处理流程:客户端 → 负载均衡 → radosgw → 写入 data pool(对象数据,按 4MB 分片)+ 更新 index pool(bucket 索引)+ meta pool(用户/桶元数据)→ CRUSH 分布到多个 OSD。

RGW 将对象存储的核心实体映射为多个存储池:

  • .rgw.root:全局元数据(zone/zonegroup 信息)
  • default.rgw.meta:用户与桶元数据
  • default.rgw.log:操作日志与用量统计
  • default.rgw.buckets.index:桶索引(bucket index)
  • default.rgw.buckets.data:实际对象数据

K8s Logo

S3 与 Swift 协议兼容性

RGW 同时兼容 AWS S3 与 OpenStack Swift 两种对象存储协议,通过不同的 HTTP Endpoint 区分:

  • S3 API:http://rgw-host/<bucket>/<object>,使用 AWS Signature v4 认证
  • Swift API:http://rgw-host:8080/swift/v1/<container>/<object>,使用 Keystone/TempAuth 认证

生产环境中绝大多数业务使用 S3 协议,Swift 接口主要用于与 OpenStack 对接的场景。RGW 的 S3 兼容性覆盖了 bucket CRUD、object CRUD、multipart upload、预签名 URL、生命周期策略、版本控制等核心特性。

多站点与 Realm 机制

K8s Logo

RGW 支持多站点(multisite)同步,通过 realm → zonegroup → zone 三级抽象实现跨地域容灾:

  • Realm:全局唯一命名空间,包含一个 master zonegroup 和多个 slave zonegroup
  • Zonegroup:一组 zone 的集合,通常对应一个地理区域
  • Zone:一组 RGW 实例及其关联存储池,对应一个数据中心

数据在 master zone 写入后,异步同步到所有 slave zone,实现跨机房/异地容灾。

部署实战

环境准备与 RGW 部署

本实战基于已完成 Monitor/Manager/OSD 部署的 Ceph Squid v19 集群(参见第 3-6 天)。RGW 作为无状态网关,可部署在任意可访问 Ceph 公共网络的节点上。

💻 代码示例

# 在 cephadm 管理节点查看集群状态,确认 MON/MGR/OSD 健康

ceph status

 

# 查看当前已运行的服务

ceph orch ls

 

# 通过 cephadm 部署 RGW 守护进程(在 rgw-node 上启动 2 个实例做高可用)

ceph orch apply rgw default –placement="count=2:rgw-node1,rgw-node2"

 

# 指定端口与服务名(生产环境常用独立端口)

ceph orch apply rgw objectgw –port=8080

–placement="count=2:rgw-node1,rgw-node2"

 

# 等待 RGW 容器拉起并加入集群

ceph orch ls –service_type rgw

存储池自动创建与容量规划

RGW 首次启动时会自动创建所需存储池,但生产环境建议手动规划 PG 数与副本策略(参见第 8 天 PG 规划)。以下展示手动初始化存储池并验证的流程:

💻 代码示例

# 查看 RGW 自动创建的存储池

ceph osd pool ls | grep rgw

 

# 典型输出:

# .rgw.root

# default.rgw.meta

# default.rgw.log

# default.rgw.buckets.index

# default.rgw.buckets.data

 

# 查看各存储池的 PG 数与副本数

ceph osd pool get default.rgw.buckets.data pg_num

ceph osd pool get default.rgw.buckets.data size

 

# 生产环境:为 data pool 设置纠删码(节省空间)

# 注意:index pool 必须用副本池,不能用 EC 池

ceph osd pool application enable default.rgw.buckets.data rgw

 

# 查看 PG 状态,确保全部 active+clean

ceph pg ls –pool=default.rgw.buckets.data | head -20

RGW 关键配置参数详解

RGW 的运行参数通过 cephadm 的 config.yaml 或 ceph config set 管理。以下是生产环境必须关注的核心参数:

💻 代码示例

# 设置 RGW 绑定端口

ceph config set rgw rgw_frontends "beast port=8080"

 

# 设置 bucket 索引分片数(生产环境强烈建议,避免单索引瓶颈)

ceph config set rgw rgw_override_bucket_index_max_shards 16

 

# 启用 RGW 数据/元数据缓存

ceph config set rgw rgw_cache_enabled true

ceph config set rgw rgw_cache_lru_size 10000

 

# 设置对象最大大小(默认 5GB,生产可调整)

ceph config set rgw rgw_max_chunk_size 4194304

 

# 验证配置已生效

ceph config dump | grep rgw

 

# 查看某个 RGW 实例的运行时配置

ceph config show rgw.objectgw.rgw-node1.xxx

关键参数说明:

参数 默认值 生产建议 说明
rgw_frontends beast port=80 beast port=8080 前端监听端口
rgw_override_bucket_index_max_shards 0 16/32 桶索引分片数,防止单索引瓶颈
rgw_cache_enabled true true 网关缓存开关
rgw_cache_lru_size 10000 50000 LRU 缓存条目数
rgw_max_chunk_size 4MB 4MB 多部分上传分片大小
rgw_num_rados_handles 1 2 连接 RADOS 的句柄数

创建 S3 用户与访问凭证

RGW 使用 cephx + S3 Access Key 双层认证。每个 S3 用户拥有一个 Access Key 和 Secret Key,用于 API 签名:

💻 代码示例

# 创建管理员用户(用于管理操作)

radosgw-admin user create

–uid=admin

–display-name="RGW Admin"

–email="admin@stellardata.top"

 

# 输出示例中会包含 access_key 和 secret_key,务必保存

 

# 创建业务用户(最小权限原则)

radosgw-admin user create

–uid=appuser

–display-name="App User"

–access-key="APPACCESSKEY001"

–secret="AppSecretKeyExample2026"

 

# 为业务用户设置 S3 读写权限

radosgw-admin caps add

–uid=appuser

–caps="users=*;buckets=*;metadata=*;usage=*"

 

# 查看用户信息

radosgw-admin user info –uid=appuser

💻 代码示例

{

"user_id": "appuser",

"display_name": "App User",

"email": "app@stellardata.top",

"access_keys": [

{

"access_key": "APPACCESSKEY001",

"secret_key": "AppSecretKeyExample2026"

}

],

"suspended": 0,

"max_buckets": 1000,

"op_mask": "read, write, delete"

}

S3 客户端对接与验证

使用 s3cmd 或 aws-cli 作为 S3 客户端,配置凭证后即可像操作 AWS S3 一样操作 Ceph 对象存储:

💻 代码示例

# 安装 s3cmd 客户端

apt install -y s3cmd

 

# 生成 s3cmd 配置文件

cat > /root/.s3cfg << 'EOF'

[default]

access_key = APPACCESSKEY001

secret_key = AppSecretKeyExample2026

host_base = rgw.stellardata.top:8080

host_bucket = rgw.stellardata.top:8080

use_https = False

signature_v2 = False

EOF

 

# 创建 bucket

s3cmd mb s3://prod-backup

 

# 上传文件

s3cmd put /var/log/syslog s3://prod-backup/logs/

 

# 列举 bucket 内容

s3cmd ls s3://prod-backup/

 

# 下载文件

s3cmd get s3://prod-backup/logs/syslog /tmp/syslog.restored

 

# 生成预签名 URL(临时分享)

s3cmd signurl s3://prod-backup/logs/syslog –expires-in 86400

💻 代码示例

# 使用 aws-cli 方式(更通用,推荐生产环境)

apt install -y awscli

 

# 配置 AWS CLI 指向 RGW

export AWS_ACCESS_KEY_ID=APPACCESSKEY001

export AWS_SECRET_ACCESS_KEY=AppSecretKeyExample2026

export AWS_ENDPOINT_URL=http://rgw.stellardata.top:8080

export AWS_DEFAULT_REGION=us-east-1

 

# 创建 bucket

aws –endpoint-url=http://rgw.stellardata.top:8080 s3 mb s3://prod-harbor

 

# 同步本地目录到 RGW

aws –endpoint-url=http://rgw.stellardata.top:8080 s3 sync /data/images/ s3://prod-harbor/images/

 

# 查看 RGW 集群用量统计

radosgw-admin usage show –uid=appuser

部署验证与状态检查

💻 代码示例

# 查看 RGW 守护进程运行状态

ceph orch ls –service_type rgw –format json-pretty

 

# 查看 RGW 服务详情(含实例数、部署节点)

ceph orch ls rgw.objectgw

 

# 查看 RGW 服务的 metric 端点(用于 Prometheus 监控)

curl -s http://rgw-node1:8080/metrics | head -30

 

# 检查 RGW 存储池健康状态

radosgw-admin pool list

ceph health detail | grep rgw

 

# 查看 bucket 列表与索引分片状态

radosgw-admin bucket list

radosgw-admin bucket stats –bucket=prod-backup

生产环境注意事项

踩坑提示

  1. 桶索引分片(sharding)必须提前配置:默认 rgw_override_bucket_index_max_shards=0 表示单索引对象,当一个 bucket 中对象数超过 10 万时,索引操作会成为严重瓶颈。生产环境部署 RGW 后第一件事就是把分片数设为 16 或 32,且必须在创建 bucket 之前配置——已存在的 bucket 无法回溯增加分片(需 reshard,过程复杂且影响在线业务)。

  2. 负载均衡必须配置:单个 RGW 实例虽然无状态,但其并发处理能力有限。生产环境必须用 nginx/haproxy 在多个 RGW 实例前做负载均衡,并配置健康检查(GET / 返回 200)。nginx 配置需开启 client_max_body_size 0 以允许大文件上传。

  3. 时间同步至关重要:S3 Signature v4 认证对时间偏差敏感,超过 15 分钟的时钟偏移会直接导致 RequestTimeTooSkewed 错误。所有 RGW 节点和客户端必须配置 chrony/NTP 并保持同步。

性能影响

  • RGW 的吞吐受限于单个 OSD 的 IOPS 和网关节点 CPU。建议每个 RGW 实例独占至少 4 核 CPU、8GB 内存
  • 大文件上传优先使用 multipart upload,分片并行写入多个 OSD,吞吐可线性扩展
  • 小文件场景(<1MB)性能瓶颈在 index pool 和元数据操作,启用 RGW 缓存并增加分片数可缓解

安全考量

  • 生产环境必须使用 HTTPS(在负载均衡层终止 TLS),绝不在公网用明文 HTTP 传输 Access Key
  • 不同业务使用独立用户,严格遵循最小权限原则,避免一个用户泄露影响全集群
  • 定期轮换 Access Key/Secret Key,通过 radosgw-admin key create 为同一用户新增密钥后,再废弃旧密钥

常见问题

Q1: RGW 部署后无法创建 bucket,报错 “Could not connect to cluster” 怎么办?

这是因为 RGW 容器无法访问 Ceph 公共网络或缺少 cephx 凭证。检查 ceph orch ls rgw 是否显示实例已运行,查看 ceph log last 50 debug radosgw 排查连接错误。确认部署 RGW 的节点能访问 MON 的 3300/6789 端口,且 ceph config get rgw 能返回值。必要时重新部署:ceph orch rm rgw.objectgw 后再次 apply。

Q2: 大 bucket 性能突然下降,如何优化?

这是典型的桶索引未分片问题。使用 radosgw-admin bucket list --bucket=<bucket> --allow-unordered 查看对象数,若超过 10 万,需执行 radosgw-admin bucket reshard 在线 reshard,将单索引拆分为多个分片。建议在低峰期执行,reshard 期间该 bucket 的写操作会短暂阻塞。未来新建 bucket 前务必先设置 rgw_override_bucket_index_max_shards。

Q3: 如何实现 RGW 的跨机房容灾?

通过 multisite 配置。在主站点创建 realm 并设为 master,在灾备站点创建同名 realm 并设为 slave,两者通过 radosgw-admin period pull 同步元数据。数据写入 master 后异步同步到 slave,延迟取决于网络带宽和对象大小。生产环境建议主备站点间网络带宽不低于 1Gbps,并对 multisite 同步状态配置监控告警。

总结

本篇深入讲解了 Ceph RGW 对象存储网关的架构原理与数据流向,完成了从 cephadm 部署 RGW、存储池规划、用户权限创建到 S3 客户端对接的完整生产实践。关键要点:RGW 是无状态协议翻译层,数据最终持久化在 RADOS 上;桶索引分片必须在创建 bucket 前配置;生产环境必须用负载均衡 + 多实例实现高可用;multisite 机制实现跨机房容灾。掌握 RGW,就掌握了 Ceph 对象存储对接云原生应用的核心能力。

下期预告

明天(第 12 天)将发布 CephFS 分布式文件系统部署与挂载,从 MDS 元数据服务器架构到 POSIX 文件系统挂载、快照与配额,全面覆盖 Ceph 共享文件存储生产部署,敬请期待。

系列目录

微信公众号二维码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像 - 恒星
欢迎您留下宝贵的见解!
提交
头像 - 恒星

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容