Ceph RGW 对象存储:S3 兼容接口实战

RGW(RADOS Gateway)是 Ceph 的对象存储网关,提供与 Amazon S3 和 OpenStack Swift 兼容的 RESTful API。它适用于云存储、备份归档、大数据湖等场景。

本文将详细介绍 RGW 的部署、配置和使用,包括 S3 接口实战、多租户管理、生命周期策略等高级功能。


一、RGW 基础概念

1.1 什么是 RGW

RGW 是 Ceph 的对象存储接口,提供:

  • S3 兼容 API:兼容 AWS SDK 和工具
  • Swift 兼容 API:兼容 OpenStack 生态
  • 多租户支持:用户、桶、配额管理
  • 生命周期管理:自动过期、转换存储类
  • 跨区域复制:多集群数据同步
  • 静态网站托管:直接托管静态网站

1.2 核心概念

概念 说明 类比
Object 对象,存储的基本单元 文件
Bucket 桶,对象的容器 文件夹
User 用户,访问控制主体 账户
Zone 区域,RGW 实例组 可用区
Realm 域,多区域管理的顶层 组织

二、部署 RGW

2.1 使用 cephadm 部署

# 创建 RGW 存储池
ceph osd pool create .rgw.buckets.data 32 32
ceph osd pool create .rgw.buckets.index 32 32

# 部署 RGW 实例
ceph orch apply rgw myrgw --placement="1 ceph-node1" --port=8080

# 查看 RGW 状态
ceph orch ps | grep rgw
ceph -s

2.2 创建 RGW 用户

# 创建 admin 用户
radosgw-admin user create \
  --uid="admin" \
  --display-name="Admin User" \
  --caps="buckets=*;users=*;usage=read;metadata=read"

# 输出示例:
# {
#   "user_id": "admin",
#   "display_name": "Admin User",
#   "keys": [
#     {
#       "user": "admin",
#       "access_key": "XXXXXXXXXXXXXXXX",
#       "secret_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
#     }
#   ]
# }

# 查看用户
radosgw-admin user info --uid=admin

# 列出所有用户
radosgw-admin user list

2.3 创建普通用户

# 创建应用用户
radosgw-admin user create \
  --uid="app-user-001" \
  --display-name="Application User 001" \
  --max-buckets=100

# 设置用户配额
radosgw-admin quota set \
  --quota-scope=user \
  --uid=app-user-001 \
  --max-objects=10000 \
  --max-size=107374182400

三、S3 API 使用

3.1 配置 AWS CLI

# 安装 AWS CLI
apt install -y awscli

# 配置凭证
aws configure

# 输入:
# AWS Access Key ID: [你的 access_key]
# AWS Secret Access Key: [你的 secret_key]
# Default region name: us-east-1
# Default output format: json

# 或手动配置
mkdir -p ~/.aws
cat > ~/.aws/credentials << EOF
[default]
aws_access_key_id = XXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
EOF

cat > ~/.aws/config << EOF
[default]
region = us-east-1
EOF

3.2 桶操作

# 创建桶
aws --endpoint-url http://ceph-node1:8080 s3 mb s3://mybucket

# 列出桶
aws --endpoint-url http://ceph-node1:8080 s3 ls

# 删除桶
aws --endpoint-url http://ceph-node1:8080 s3 rb s3://mybucket

3.3 对象操作

# 上传文件
aws --endpoint-url http://ceph-node1:8080 s3 cp file.txt s3://mybucket/

# 上传目录
aws --endpoint-url http://ceph-node1:8080 s3 cp ./data s3://mybucket/data/ --recursive

# 下载文件
aws --endpoint-url http://ceph-node1:8080 s3 cp s3://mybucket/file.txt ./

# 列出对象
aws --endpoint-url http://ceph-node1:8080 s3 ls s3://mybucket/

# 删除对象
aws --endpoint-url http://ceph-node1:8080 s3 rm s3://mybucket/file.txt

3.4 使用 Python SDK (boto3)

import boto3

# 配置 S3 客户端
s3 = boto3.client(
    's3',
    endpoint_url='http://ceph-node1:8080',
    aws_access_key_id='YOUR_ACCESS_KEY',
    aws_secret_access_key='YOUR_SECRET_KEY',
    region_name='us-east-1'
)

# 创建桶
s3.create_bucket(Bucket='my-bucket')

# 上传文件
s3.upload_file('local.txt', 'my-bucket', 'remote.txt')

# 下载文件
s3.download_file('my-bucket', 'remote.txt', 'downloaded.txt')

# 列出对象
response = s3.list_objects_v2(Bucket='my-bucket')
for obj in response['Contents']:
    print(obj['Key'])

# 删除对象
s3.delete_object(Bucket='my-bucket', Key='remote.txt')

四、高级功能

4.1 桶版本控制

# 启用版本控制
aws --endpoint-url http://ceph-node1:8080 s3api put-bucket-versioning \
  --bucket mybucket \
  --versioning-configuration Status=Enabled

# 查看版本状态
aws --endpoint-url http://ceph-node1:8080 s3api get-bucket-versioning \
  --bucket mybucket

# 列出所有版本
aws --endpoint-url http://ceph-node1:8080 s3api list-object-versions \
  --bucket mybucket

4.2 生命周期策略

自动过期旧文件或转换存储类:

# 创建生命周期配置
cat > lifecycle.json << EOF
{
  "Rules": [
    {
      "ID": "expire-old-logs",
      "Status": "Enabled",
      "Filter": {
        "Prefix": "logs/"
      },
      "Expiration": {
        "Days": 30
      }
    },
    {
      "ID": "transition-to-cold",
      "Status": "Enabled",
      "Filter": {},
      "Transitions": [
        {
          "Days": 90,
          "StorageClass": "COLD"
        }
      ]
    }
  ]
}
EOF

# 应用生命周期策略
aws --endpoint-url http://ceph-node1:8080 s3api put-bucket-lifecycle-configuration \
  --bucket mybucket \
  --lifecycle-configuration file://lifecycle.json

# 查看生命周期配置
aws --endpoint-url http://ceph-node1:8080 s3api get-bucket-lifecycle-configuration \
  --bucket mybucket

4.3 桶策略(访问控制)

# 创建公开读桶策略
cat > bucket-policy.json << EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicRead",
      "Effect": "Allow",
      "Principal": "*",
      "Action": ["s3:GetObject"],
      "Resource": ["arn:aws:s3:::mybucket/*"]
    }
  ]
}
EOF

# 应用桶策略
aws --endpoint-url http://ceph-node1:8080 s3api put-bucket-policy \
  --bucket mybucket \
  --policy file://bucket-policy.json

4.4 静态网站托管

# 启用静态网站托管
aws --endpoint-url http://ceph-node1:8080 s3api put-bucket-website \
  --bucket mybucket \
  --website-configuration '{
    "IndexDocument": {"Suffix": "index.html"},
    "ErrorDocument": {"Key": "error.html"}
  }'

# 上传网站文件
aws --endpoint-url http://ceph-node1:8080 s3 cp index.html s3://mybucket/
aws --endpoint-url http://ceph-node1:8080 s3 cp error.html s3://mybucket/

# 访问网站:http://ceph-node1:8080/mybucket/index.html

五、多租户管理

5.1 创建子用户

# 创建子用户(用于不同应用)
radosgw-admin subuser create \
  --uid=admin \
  --subuser=admin:swift \
  --access=full

# 创建 Swift 密钥
radosgw-admin key create \
  --subuser=admin:swift \
  --key-type=swift \
  --gen-secret

5.2 用户配额管理

# 查看配额
radosgw-admin quota get --quota-scope=user --uid=app-user-001

# 设置配额
radosgw-admin quota set \
  --quota-scope=user \
  --uid=app-user-001 \
  --max-objects=100000 \
  --max-size=1099511627776

# 启用配额
radosgw-admin quota enable --quota-scope=user --uid=app-user-001

5.3 使用统计

# 查看用户使用统计
radosgw-admin user stats --uid=admin

# 查看桶使用统计
radosgw-admin bucket stats --bucket=mybucket

# 查看整体使用
radosgw-admin usage show

六、监控与运维

6.1 监控命令

# 查看 RGW 状态
ceph -s | grep rgw

# 查看 RGW 进程
ceph orch ps | grep rgw

# 查看活跃请求
curl http://ceph-node1:8080/admin/metadata/bucket

# 查看性能统计
radosgw-admin perf dump

6.2 常见问题

问题 1:Access Denied

# 检查用户权限
radosgw-admin user info --uid=admin

# 检查桶策略
aws --endpoint-url http://ceph-node1:8080 s3api get-bucket-policy --bucket mybucket

问题 2:桶无法删除

# 清空桶内容
aws --endpoint-url http://ceph-node1:8080 s3 rm s3://mybucket --recursive

# 删除桶
aws --endpoint-url http://ceph-node1:8080 s3 rb s3://mybucket

问题 3:上传失败

# 检查存储池空间
ceph df

# 检查用户配额
radosgw-admin quota get --quota-scope=user --uid=app-user-001

总结

通过本文,你掌握了 RGW 对象存储的完整使用:

  • ✅ 部署 RGW 网关
  • ✅ 创建和管理用户
  • ✅ S3 API 基本操作
  • ✅ 版本控制、生命周期、桶策略
  • ✅ 静态网站托管
  • ✅ 多租户与配额管理

下一步:搭建 CephFS 文件系统、配置监控告警


🔗 相关链接

下一篇将介绍 CephFS 分布式文件系统实战!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注