)
Ceph系列第五期Ceph 对象存储RADOS Gateway精讲本期目标理解对象存储的核心概念及与块存储、文件存储的区别掌握 RADOS GatewayRGW的架构与核心组件realm, zonegroup, zone学会部署 RGW 服务并配置多站点复制熟练使用 S3 和 Swift API 访问对象存储管理 RGW 用户、子用户及访问密钥配置用户、桶和全局配额前置要求已有一个健康的 Ceph 集群参考第二期并了解基本的 Cephx 认证第三期。1. 对象存储简介1.1 什么是对象存储对象存储将数据存储为对象每个对象包含三个部分Key键对象的唯一标识类似文件名Data数据文件的实际内容Metadata元数据描述对象的属性如 Content-Type、自定义键值对与块存储和文件存储的对比特点块存储RBD文件存储CephFS对象存储RGW数据组织固定大小的块层级目录树扁平桶对象访问协议SCSI、iSCSINFS、POSIXHTTP(S) (S3/Swift)适合场景数据库、虚拟机共享文件、HPC海量非结构化数据、备份、静态网站扩展性受限于单个卷大小可扩展有元数据瓶颈几乎无限扩展1.2 对象存储的典型特征扁平命名空间没有嵌套目录对象直接存放在**桶Bucket或容器Container**中通过 RESTful API 访问使用 HTTP/HTTPS 协议GET/PUT/DELETE高扩展性轻松扩展到 PB/EB 级别元数据丰富可自定义系统元数据和用户元数据1.3 Ceph 对象存储支持的 APIAmazon S3 兼容大多数子集兼容使用“桶”和“对象”OpenStack Swift 兼容使用“容器”和“对象”2. RADOS Gateway 架构2.1 核心组件textHTTP 客户端S3/Swift │ ▼ ┌───────────────────┐ │ RadosGW 守护进程 │ ← Beast HTTP 前端端口 80/8080 └─────────┬─────────┘ │ librados ▼ ┌───────────────────┐ │ RADOS │ └───────────────────┘RADOS Gatewayradosgw基于 librados 构建的 HTTP 服务负责处理 S3/Swift API 请求并将对象数据存储到底层 RADOS 池中。多站点支持可在多个 Ceph 集群间异步复制数据实现跨地域灾备。2.2 多站点概念Realm / Zonegroup / Zone为了实现数据同步和命名空间隔离Ceph 引入了三级逻辑结构概念说明类比Realm域全局唯一的命名空间包含一个或多个 Zonegroup。一个独立的存储系统Zonegroup区域组由一个或多个 Zone 组成数据在 Zonegroup 内复制。数据中心集群Zone区域一个具体的 Ceph 集群包含一组 RGW 实例。物理集群Period时期某一时刻 Realm/Zonegroup/Zone 配置的快照。配置版本Epoch时期号Period 内的配置变更序号。版本号主 Zone在 Zonegroup 中只有一个主 Zone负责处理所有元数据操作创建/删除用户、桶等。其他为次要 Zone。主 Zonegroup在 Realm 中只有一个主 Zonegroup。同步方向主 Zone 的元数据和数据会复制到次要 Zone次要 Zone 的数据也会复制回主 Zone在双向模式下。2.3 RGW 使用的 RADOS 池一个典型的 RGW 部署会创建多个池以default区域为例池名用途default.rgw.control控制信息default.rgw.meta用户、桶等元数据default.rgw.log日志default.rgw.buckets.index桶索引存储桶内对象列表default.rgw.buckets.data实际对象数据生产环境建议根据负载使用不同性能的存储类如 SSD 存索引HDD 存数据。3. 部署 RGW 单站点3.1 创建 Realm、Zonegroup 和 Zone使用radosgw-admin命令行工具配置。bash# 1. 创建 realm并设置为默认 radosgw-admin realm create --rgw-realmwebapp --default # 2. 创建 zonegroup设置为 master 和默认 radosgw-admin zonegroup create --rgw-realmwebapp --rgw-zonegroupvideo --master --default # 3. 创建 zone设置为 master 和默认 radosgw-admin zone create --rgw-realmwebapp --rgw-zonegroupvideo --rgw-zonestorage1 --master --default # 4. 提交配置生成新的 period radosgw-admin period update --rgw-realmwebapp --commit3.2 部署 RGW 服务使用 cephadmbash# 在 ceph1~ceph3 上部署 3 个 rgw 实例端口 8080关联上面创建的 realm 和 zone ceph orch apply rgw webapp \ --placement3 ceph1.whisky.cloud ceph2.whisky.cloud ceph3.whisky.cloud \ --realmwebapp --zonestorage1 --port80803.3 验证 RGW 服务bash# 查看服务状态 ceph orch ls rgw # 查看具体 daemon ceph orch ps --daemon-type rgw # 测试 HTTP 访问 curl http://ceph1.whisky.cloud:8080正常返回 XML 内容ListAllMyBucketsResult表示 RGW 已就绪。3.4 使用服务规格文件YAML部署bashcat rgw_service.yaml EOF service_type: rgw service_id: webapp placement: count: 3 hosts: - ceph1.whisky.cloud - ceph2.whisky.cloud - ceph3.whisky.cloud spec: rgw_frontend_port: 8080 EOF ceph orch apply -i rgw_service.yaml3.5 删除 RGW 服务bash# 删除服务不会删除池中的数据 ceph orch rm rgw.webapp4. 管理 RGW 用户对象存储有自己的用户数据库独立于 Cephx 系统。通过radosgw-admin管理。4.1 创建用户bash# 创建 S3 用户自动生成 access_key 和 secret_key radosgw-admin user create --uids3user --display-nameS3 User # 创建时指定 access_key 和 secret_key radosgw-admin user create --uidoperator --display-nameS3 Operator \ --emailoperatorexample.com --access-key12345 --secret-key678904.2 查看和列出用户bashradosgw-admin user list radosgw-admin user info --uids3user4.3 重新生成密钥bash# 重新生成 secret_key radosgw-admin key create --uids3user --gen-secret # 为现有用户添加第二个 access_key radosgw-admin key create --uids3user --gen-access-key4.4 删除访问密钥bashradosgw-admin key rm --uids3user --access-keyKEY4.5 启用/禁用用户bashradosgw-admin user suspend --uids3user # 禁用 radosgw-admin user enable --uids3user # 启用4.6 修改用户信息bashradosgw-admin user modify --uids3user --display-nameNew Name --emailnewexample.com4.7 删除用户同时删除其所有数据bashradosgw-admin user rm --uids3user --purge-data5. 使用 S3 API 访问5.1 安装 AWS CLI 客户端在客户端节点client上安装awscliPython 方式bash# 配置 pip 国内源可选 mkdir ~/.pip cat ~/.pip/pip.conf EOF [global] index-url http://mirrors.aliyun.com/pypi/simple/ [install] trusted-hostmirrors.aliyun.com EOF # 安装 pip3 install awscli5.2 配置 AWS 凭据bashaws configure # 输入 Access Key ID: 12345 # 输入 Secret Access Key: 67890 # Default region name: 直接回车 # Default output format: 直接回车配置文件保存在~/.aws/credentials。也可以使用 profile 方式bashaws configure --profileceph5.3 基本 S3 操作需指定 endpointbash# 创建桶 aws --endpointhttp://ceph1.whisky.cloud:8080 s3 mb s3://mybucket # 列出桶 aws --endpointhttp://ceph1.whisky.cloud:8080 s3 ls # 上传对象 echo Hello World test.txt aws --endpointhttp://ceph1.whisky.cloud:8080 s3 cp test.txt s3://mybucket/ # 上传并设置 ACL 为公共读 aws --endpointhttp://ceph1.whisky.cloud:8080 s3 cp test.txt s3://mybucket/ --aclpublic-read # 列出桶内对象 aws --endpointhttp://ceph1.whisky.cloud:8080 s3 ls s3://mybucket/ # 下载对象 aws --endpointhttp://ceph1.whisky.cloud:8080 s3 cp s3://mybucket/test.txt ./test_download.txt # 删除对象 aws --endpointhttp://ceph1.whisky.cloud:8080 s3 rm s3://mybucket/test.txt # 删除桶必须为空 aws --endpointhttp://ceph1.whisky.cloud:8080 s3 rb s3://mybucket使用 wget 下载公共对象bash# 对象被设置为 public-read 后可直接通过 HTTP 访问 wget http://ceph1.whisky.cloud:8080/mybucket/test.txt6. 使用 Swift API 访问6.1 创建 Swift 子用户Swift 使用“租户:用户”模型映射到 RGW 的“主用户:子用户”。bash# 创建一个主用户 swift radosgw-admin user create --uidswift --display-nameSwift User # 创建子用户 swift:swift_rgw并分配 full 权限 radosgw-admin subuser create --uidswift --subuserswift:swift_rgw --accessfull # 生成 Swift 密钥自动生成 secret_key radosgw-admin key create --subuserswift:swift_rgw --key-typeswift --gen-secret # 查看生成的 secret_key radosgw-admin user info --uidswift记录下swift_keys[0].secret_key。6.2 安装 Swift 客户端bashpip3 install python-swiftclient6.3 配置环境变量bashexport ST_AUTHhttp://ceph1.whisky.cloud:8080/auth/1.0 export ST_USERswift:swift_rgw export ST_KEY上面记录的 secret_key6.4 基本 Swift 操作bash# 查看容器桶列表 swift list # 创建容器相当于 S3 的 bucket swift post mycontainer # 上传对象 echo Swift content swift.txt swift upload mycontainer swift.txt # 列出容器内对象 swift list mycontainer # 下载对象 swift download mycontainer swift.txt # 删除对象 swift delete mycontainer swift.txt # 删除容器必须为空 swift delete mycontainer7. 配额管理支持用户级别、桶级别和全局配额限制最大对象数或最大字节数。7.1 用户配额bash# 启用用户配额以 uids3user 为例 radosgw-admin quota enable --quota-scopeuser --uids3user # 设置最大对象数为 1024 radosgw-admin quota set --quota-scopeuser --uids3user --max-objects1024 # 设置最大容量为 10GB radosgw-admin quota set --quota-scopeuser --uids3user --max-size10G # 查看用户配额 radosgw-admin user info --uids3user | grep -A 10 user_quota # 禁用配额设置 max-objects-1 或 max-size-1 radosgw-admin quota set --quota-scopeuser --uids3user --max-objects-1 radosgw-admin quota disable --quota-scopeuser --uids3user7.2 桶配额bash# 启用桶配额 radosgw-admin quota enable --quota-scopebucket --bucketmybucket # 设置桶最大对象数 radosgw-admin quota set --quota-scopebucket --bucketmybucket --max-objects100 # 设置桶最大容量 radosgw-admin quota set --quota-scopebucket --bucketmybucket --max-size1G # 查看桶配额 radosgw-admin bucket stats --bucketmybucket # 禁用桶配额 radosgw-admin quota disable --quota-scopebucket --bucketmybucket7.3 全局配额作用于所有用户或所有桶可被具体配额覆盖。bash# 设置所有用户的默认配额 radosgw-admin global quota set --quota-scopeuser --max-objects10000 --max-size100G # 启用全局用户配额 radosgw-admin global quota enable --quota-scopeuser # 设置所有桶的默认配额 radosgw-admin global quota set --quota-scopebucket --max-objects500 --max-size10G radosgw-admin global quota enable --quota-scopebucket # 提交配置重要 radosgw-admin period update --commit # 查看全局配额 radosgw-admin global quota get --quota-scopeuser修改全局配额后必须执行radosgw-admin period update --commit并重启 RGW 进程。7.4 查看使用情况bash# 查看特定用户使用量 radosgw-admin user stats --uids3user # 查看所有用户汇总 radosgw-admin usage show --show-log-entriesfalse # 查看指定日期范围 radosgw-admin usage show --uids3user --start-date2025-01-01 --end-date2025-12-318. 多站点同步配置基础本部分简述如何配置两个集群主集群 prod备集群 backup之间的单向数据同步。更复杂的双向或多区域配置可参考官方文档。8.1 架构规划主集群ceph1~3realmwebappzonegroupvideozonestorage1主 zone备集群ceph4~6realmwebappzonegroupvideozonestorage2次要 zone两个集群需网络互通且已分别部署好 Ceph 集群和 RGW备集群暂不创建本地 realm。8.2 主集群配置bash# 已部署好 RGW参考第 3 节确认运行正常 # 创建同步系统用户专门用于跨集群同步 radosgw-admin user create --uidsync-user --display-nameSync User \ --access-keysyncaccess --secretsyncsecret --system8.3 备集群配置bash# 从主集群拉取 realm 配置 radosgw-admin realm pull --urlhttp://ceph1.whisky.cloud:8080 \ --access-keysyncaccess --secretsyncsecret # 拉取 period radosgw-admin period pull --urlhttp://ceph1.whisky.cloud:8080 \ --access-keysyncaccess --secretsyncsecret # 创建本地 zonestorage2并指定 endpoints 为备集群的 RGW 地址 radosgw-admin zone create --rgw-zonegroupvideo --rgw-zonestorage2 \ --endpointshttp://ceph4.whisky.cloud:8080,http://ceph5.whisky.cloud:8080,http://ceph6.whisky.cloud:8080 \ --access-keysyncaccess --secretsyncsecret # 更新 period radosgw-admin period update --commit # 在备集群部署 RGW ceph orch apply rgw webapp --placement3 ceph4.whisky.cloud ceph5.whisky.cloud ceph6.whisky.cloud \ --realmwebapp --zonestorage2 --port80808.4 验证同步状态bash# 在备集群查看同步状态 radosgw-admin sync status # 在主集群创建桶并上传对象稍后查看备集群是否同步9. 常用命令速查表操作命令创建 realmradosgw-admin realm create --rgw-realmname --default创建 zonegroupradosgw-admin zonegroup create --rgw-realmrealm --rgw-zonegroupname --master --default创建 zoneradosgw-admin zone create --rgw-realmrealm --rgw-zonegroupzonegroup --rgw-zonename --master --default更新 periodradosgw-admin period update --commit部署 RGWceph orch apply rgw svc_id --placementplacement --realmrealm --zonezone --portport创建 S3 用户radosgw-admin user create --uiduid --display-namename创建子用户Swiftradosgw-admin subuser create --uiduid --subuseruid:sub --accessfull生成 Swift 密钥radosgw-admin key create --subuseruid:sub --key-typeswift --gen-secret启用用户配额radosgw-admin quota enable --quota-scopeuser --uiduid设置用户配额radosgw-admin quota set --quota-scopeuser --uiduid --max-objectsnum --max-sizebytes查看用户信息radosgw-admin user info --uiduid删除用户及数据radosgw-admin user rm --uiduid --purge-data拉取 realm备集群radosgw-admin realm pull --urlmaster_rgw_url --access-keykey --secretsecret查看同步状态radosgw-admin sync status10. 本期小结Ceph 对象存储通过 RGW 守护进程提供兼容 S3 和 Swift 的 RESTful API。核心逻辑结构Realm域 → Zonegroup区域组 → Zone区域用于多站点复制和命名空间隔离。使用radosgw-admin管理用户、桶、配额和同步配置。S3 客户端awscli和 Swift 客户端python-swiftclient均可访问需指定 endpoint 和认证信息。配额支持用户级、桶级和全局级可限制对象数量或存储容量修改后需执行period update。多站点同步通过系统用户进行身份验证备集群需要从主集群拉取 realm 和 period。下一期预告Ceph 文件系统CephFS精讲包括 MDS 管理、多文件系统、内核与 FUSE 客户端挂载、快照及跨集群 Mirror。