title: ceph存储之OSS对象存储 #标题tags: ceph #标签
date: 2021-02-22
categories: 存储 # 分类

记录下ceph对象存储网关相关概念及基本使用操作。

ceph对象存储简介

Ceph对象网关是一个对象存储接口,建立在此基础之上, librados以为应用程序提供通往Ceph存储集群的RESTful网关。

Ceph对象存储支持两个接口:

  • 与S3兼容:为对象存储功能提供与Amazon S3 RESTful API的大部分子集兼容的接口。
  • 兼容Swift:为对象存储功能提供与OpenStack Swift API的大部分子集兼容的接口。

Ceph对象存储使用Ceph对象网关守护进程(radosgw),它是用于与Ceph存储群集进行交互的HTTP服务器。由于它提供与OpenStack Swift和Amazon S3兼容的接口,因此Ceph对象网关具有自己的用户管理。Ceph对象网关可以将数据存储在用于存储来自Ceph文件系统客户端或Ceph块设备客户端的数据的同一Ceph存储群集中。S3和Swift API共享一个公共的名称空间,因此可以使用一个API编写数据,而使用另一个API检索数据。

ceph存储之OSS对象存储 - 图1

部署RGW存储网关

在上面的介绍中有提到,Ceph对象存储使用Ceph对象网关守护进程(radosgw),它是用于与Ceph存储群集进行交互的HTTP服务器。所以我们需要先安装ceph-radosgw。

此博文基于部署ceph集群 (Nautilus版)进行操作。

  1. $ yum -y install ceph-radosgw
  2. $ cd ~/my-cluster/
  3. $ ls # 必须进入此目录下
  4. ceph.bootstrap-mds.keyring ceph.bootstrap-osd.keyring ceph.client.admin.keyring ceph-deploy-ceph.log
  5. ceph.bootstrap-mgr.keyring ceph.bootstrap-rgw.keyring ceph.conf ceph.mon.keyring
  6. # 将 pod4-core-20-10 设置为 radosgw
  7. $ ceph-deploy rgw create pod4-core-20-10

输出如下:

ceph存储之OSS对象存储 - 图2

  1. $ ceph -s # 查看集群状态,多了一个rgw服务
  2. cluster:
  3. id: 634fc0a4-d2bd-4f14-af6b-421ecbb89ba6
  4. health: HEALTH_OK
  5. services:
  6. mon: 3 daemons, quorum pod4-core-20-10,pod4-core-20-5,pod4-core-20-6 (age 2h)
  7. mgr: pod4-core-20-10(active, since 2h), standbys: pod4-core-20-5, pod4-core-20-6
  8. osd: 3 osds: 3 up (since 2h), 3 in (since 18h)
  9. rgw: 1 daemon active (pod4-core-20-10)
  10. task status:
  11. data:
  12. pools: 5 pools, 256 pgs
  13. objects: 740 objects, 2.0 GiB
  14. usage: 7.0 GiB used, 53 GiB / 60 GiB avail
  15. pgs: 256 active+clean
  16. $ ss -lnpt | grep 7480 # 确认端口在监听
  17. LISTEN 0 128 *:7480 *:* users:(("radosgw",pid=16841,fd=45))
  18. LISTEN 0 128 :::7480 :::* users:(("radosgw",pid=16841,fd=46))
  19. $ ceph osd lspools # radosgw部署成功后,会自动增加几个资源池
  20. 1 ceph-demo
  21. 2 .rgw.root
  22. 3 default.rgw.control
  23. 4 default.rgw.meta
  24. 5 default.rgw.log

修改rgw的默认监听端口

1、 修改配置文件

  1. $ cd ~/my-cluster/
  2. $ vim ceph.conf
  3. # 增加如下配置
  4. [client.rgw.pod4-core-20-10] # 将 pod4-core-20-10 替换为你rgw所在节点的主机名
  5. rgw_frontends = "civetweb port=80"

2、替换配置文件

  1. # 将后面三个替换为你ceph集群中的所有节点
  2. $ ceph-deploy --overwrite-conf config push pod4-core-20-10 pod4-core-20-5 pod4-core-20-6

3、重启生效

  1. $ systemctl restart ceph-radosgw.target
  2. $ ss -lnpt | grep radosgw # 确认端口已修改
  3. LISTEN 0 128 *:80 *:* users:(("radosgw",pid=20705,fd=45))

创建ceph对象网关用户

若想使用对象网关,必须先在radosgw里创建一个用户。

创建的用户分两种类型:

  • S3风格的;
  • SWIFT风格的;

创建用于S3访问的RADOSGW用户

  1. $ radosgw-admin user create --uid ceph-s3-user --display-name "Ceph S3 User Demo"

上述命令执行成功后,输出如下:

ceph存储之OSS对象存储 - 图3

如果没有保存也没关系,后续可以使用如下命令去查询:

  1. $ radosgw-admin user list # 查看用户列表
  2. [
  3. "ceph-s3-user"
  4. ]
  5. $ radosgw-admin user info --uid ceph-s3-user
  6. {
  7. "user_id": "ceph-s3-user",
  8. "display_name": "Ceph S3 User Demo",
  9. "email": "",
  10. "suspended": 0,
  11. "max_buckets": 1000,
  12. "subusers": [],
  13. "keys": [
  14. {
  15. "user": "ceph-s3-user",
  16. "access_key": "MTTWEPIF59QX1C8UU3UC",
  17. "secret_key": "HeUyXswtKKaMpbb83OhaKjpxvAbZ5CfmdF9LlJc5"
  18. ......... # 省略部分输出

创建用于SWIFT访问的RADOSGW用户

swift用户需要基于上面s3创建的用户来创建,所以在创建swift类型的用户前,需要保证有如下用户:

  1. $ radosgw-admin user list # 确保有一个可用用户
  2. [
  3. "ceph-s3-user"
  4. ]
  5. # 基于ceph-s3-user用户创建swift拥有所有权限的用户
  6. $ radosgw-admin subuser create --uid ceph-s3-user --subuser=ceph-s3-user:swift --access=full

返回结果如下:

ceph存储之OSS对象存储 - 图4

  1. # 生成 ceph-s3-user:swift 对应的secret_key
  2. $ radosgw-admin key create --subuser=ceph-s3-user:swift --key-type=swift --gen-secret

输出如下:

ceph存储之OSS对象存储 - 图5

  1. # 自行保存secret_key,后续访问会用到
  2. "swift_keys": [
  3. {
  4. "user": "ceph-s3-user:swift",
  5. "secret_key": "6p2AHn3vMrYZupiDMHWp9Xb5hOtB3B4LyD17pZAu"
  6. }

访问radosgw验证账户

测试S3接口访问

1、使用python脚本验证

需要编写并运行Python测试脚本来验证S3访问。S3访问测试脚本将连接到radosgw,创建一个新存储桶并列出所有存储桶。

  1. $ yum -y install python-boto
  2. # 测试脚本如下
  3. # 请自行替换 access_key、secret_key、host、port 为你实际的值
  4. $ cat > s3test.py << EOF
  5. import boto.s3.connection
  6. access_key = 'MTTWEPIF59QX1C8UU3UC'
  7. secret_key = 'HeUyXswtKKaMpbb83OhaKjpxvAbZ5CfmdF9LlJc5'
  8. conn = boto.connect_s3(
  9. aws_access_key_id=access_key,
  10. aws_secret_access_key=secret_key,
  11. host='192.168.20.10', port=80,
  12. is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(),
  13. )
  14. bucket = conn.create_bucket('ceph-s3-bucket')
  15. for bucket in conn.get_all_buckets():
  16. print "{name} {created}".format(
  17. name=bucket.name,
  18. created=bucket.creation_date,
  19. )
  20. EOF
  21. $ python s3test.py # 执行脚本,输出如下表示访问成功
  22. ceph-s3-bucket 2021-02-22T23:27:37.490Z

2、使用命令行验证:

  1. # 安装工具
  2. $ yum -y install s3cmd
  3. $ s3cmd --configure # 进入配置

下图中,没有输入内容的都是直接按 “回车” 键即可。

ceph存储之OSS对象存储 - 图6

ceph存储之OSS对象存储 - 图7

  1. # 修改配置文件
  2. # 如果不修改,那么使用命令行时,会报错 403
  3. $ sed -i 's#signature_v2 = .*#signature_v2 = True#g' /root/.s3cfg
  1. # 查看s3cmd支持的操作
  2. $ s3cmd -h

返回的部分结果如下:

ceph存储之OSS对象存储 - 图8

s3cmd常用命令

如果上传文件报错ERROR: S3 error: 416 (InvalidRange),那么请参考 ceph对象存储上传文件报错416 进行解决。

  1. # 创建一个名为 s3cmd-demo 的bucket
  2. $ s3cmd mb s3://s3cmd-demo
  3. # 查看bucket 列表
  4. $ s3cmd ls
  5. # 上传文件至bucket
  6. $ s3cmd put /etc/fstab s3://s3cmd-demo/fstab
  7. # 下载文件(默认下载到当前目录)
  8. $ s3cmd get s3://s3cmd-demo/fstab
  9. # 下载至指定目录,并重命名
  10. $ s3cmd get s3://s3cmd-demo/fstab /tmp/fstab-t
  11. # 删除指定文件
  12. $ s3cmd rm s3://s3cmd-demo/fstab
  13. # 删除指定目录
  14. $ s3cmd rm s3://s3cmd-demo/etc/ --recursive

测试swift用户访问

  1. # 安装基础工具
  2. $ yum -y install python-setuptools python-pip
  3. $ pip install --upgrade python-swiftclient -i https://mirrors.aliyun.com/pypi/simple/
  4. # 访问验证
  5. # -A:指定认证URL
  6. # -U:指定用户名称
  7. # -K:指定用户对应的 secret_key
  8. $ swift -A http://192.168.20.10:80/auth -U ceph-s3-user:swift \
  9. -K 6p2AHn3vMrYZupiDMHWp9Xb5hOtB3B4LyD17pZAu list
  10. # 配置环境变量访问
  11. $ cat > ~/.swift << EOF
  12. export ST_AUTH=http://192.168.20.10:80/auth
  13. export ST_USER=ceph-s3-user:swift
  14. export ST_KEY=6p2AHn3vMrYZupiDMHWp9Xb5hOtB3B4LyD17pZAu
  15. EOF
  16. # 刷新环境变量
  17. source ~/.swift
  18. # 访问验证(查看bucket列表)
  19. $ swift list
  20. ceph-s3-bucket
  21. s3cmd-demo

swift常用指令

  1. # 创建一个bucket
  2. $ swift post swift-demo
  3. # 查看bucket列表
  4. $ swift list
  5. # 上传/etc/passwd 文件到swift-demo这个bucket
  6. $ swift upload swift-demo /etc/passwd
  7. # 上传 /etc/ 目录至swift-demo这个bucket
  8. $ swift upload swift-demo /etc
  9. # 查看目录内容
  10. $ swift list swift-demo
  11. # 下载 /etc/passwd 文件至本地
  12. $ swift download swift-demo etc/passwd