title: ceph存储之OSS对象存储 #标题tags: ceph #标签
date: 2021-02-22
categories: 存储 # 分类
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检索数据。

部署RGW存储网关
在上面的介绍中有提到,Ceph对象存储使用Ceph对象网关守护进程(radosgw),它是用于与Ceph存储群集进行交互的HTTP服务器。所以我们需要先安装ceph-radosgw。
此博文基于部署ceph集群 (Nautilus版)进行操作。
$ yum -y install ceph-radosgw$ cd ~/my-cluster/$ ls # 必须进入此目录下ceph.bootstrap-mds.keyring ceph.bootstrap-osd.keyring ceph.client.admin.keyring ceph-deploy-ceph.logceph.bootstrap-mgr.keyring ceph.bootstrap-rgw.keyring ceph.conf ceph.mon.keyring# 将 pod4-core-20-10 设置为 radosgw$ ceph-deploy rgw create pod4-core-20-10
输出如下:

$ ceph -s # 查看集群状态,多了一个rgw服务cluster:id: 634fc0a4-d2bd-4f14-af6b-421ecbb89ba6health: HEALTH_OKservices:mon: 3 daemons, quorum pod4-core-20-10,pod4-core-20-5,pod4-core-20-6 (age 2h)mgr: pod4-core-20-10(active, since 2h), standbys: pod4-core-20-5, pod4-core-20-6osd: 3 osds: 3 up (since 2h), 3 in (since 18h)rgw: 1 daemon active (pod4-core-20-10)task status:data:pools: 5 pools, 256 pgsobjects: 740 objects, 2.0 GiBusage: 7.0 GiB used, 53 GiB / 60 GiB availpgs: 256 active+clean$ ss -lnpt | grep 7480 # 确认端口在监听LISTEN 0 128 *:7480 *:* users:(("radosgw",pid=16841,fd=45))LISTEN 0 128 :::7480 :::* users:(("radosgw",pid=16841,fd=46))$ ceph osd lspools # radosgw部署成功后,会自动增加几个资源池1 ceph-demo2 .rgw.root3 default.rgw.control4 default.rgw.meta5 default.rgw.log
修改rgw的默认监听端口
1、 修改配置文件
$ cd ~/my-cluster/$ vim ceph.conf# 增加如下配置[client.rgw.pod4-core-20-10] # 将 pod4-core-20-10 替换为你rgw所在节点的主机名rgw_frontends = "civetweb port=80"
2、替换配置文件
# 将后面三个替换为你ceph集群中的所有节点$ ceph-deploy --overwrite-conf config push pod4-core-20-10 pod4-core-20-5 pod4-core-20-6
3、重启生效
$ systemctl restart ceph-radosgw.target$ ss -lnpt | grep radosgw # 确认端口已修改LISTEN 0 128 *:80 *:* users:(("radosgw",pid=20705,fd=45))
创建ceph对象网关用户
若想使用对象网关,必须先在radosgw里创建一个用户。
创建的用户分两种类型:
- S3风格的;
- SWIFT风格的;
创建用于S3访问的RADOSGW用户
$ radosgw-admin user create --uid ceph-s3-user --display-name "Ceph S3 User Demo"
上述命令执行成功后,输出如下:

如果没有保存也没关系,后续可以使用如下命令去查询:
$ radosgw-admin user list # 查看用户列表["ceph-s3-user"]$ radosgw-admin user info --uid ceph-s3-user{"user_id": "ceph-s3-user","display_name": "Ceph S3 User Demo","email": "","suspended": 0,"max_buckets": 1000,"subusers": [],"keys": [{"user": "ceph-s3-user","access_key": "MTTWEPIF59QX1C8UU3UC","secret_key": "HeUyXswtKKaMpbb83OhaKjpxvAbZ5CfmdF9LlJc5"......... # 省略部分输出
创建用于SWIFT访问的RADOSGW用户
swift用户需要基于上面s3创建的用户来创建,所以在创建swift类型的用户前,需要保证有如下用户:
$ radosgw-admin user list # 确保有一个可用用户["ceph-s3-user"]# 基于ceph-s3-user用户创建swift拥有所有权限的用户$ radosgw-admin subuser create --uid ceph-s3-user --subuser=ceph-s3-user:swift --access=full
返回结果如下:

# 生成 ceph-s3-user:swift 对应的secret_key$ radosgw-admin key create --subuser=ceph-s3-user:swift --key-type=swift --gen-secret
输出如下:

# 自行保存secret_key,后续访问会用到"swift_keys": [{"user": "ceph-s3-user:swift","secret_key": "6p2AHn3vMrYZupiDMHWp9Xb5hOtB3B4LyD17pZAu"}
访问radosgw验证账户
测试S3接口访问
1、使用python脚本验证
需要编写并运行Python测试脚本来验证S3访问。S3访问测试脚本将连接到radosgw,创建一个新存储桶并列出所有存储桶。
$ yum -y install python-boto# 测试脚本如下# 请自行替换 access_key、secret_key、host、port 为你实际的值$ cat > s3test.py << EOFimport boto.s3.connectionaccess_key = 'MTTWEPIF59QX1C8UU3UC'secret_key = 'HeUyXswtKKaMpbb83OhaKjpxvAbZ5CfmdF9LlJc5'conn = boto.connect_s3(aws_access_key_id=access_key,aws_secret_access_key=secret_key,host='192.168.20.10', port=80,is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(),)bucket = conn.create_bucket('ceph-s3-bucket')for bucket in conn.get_all_buckets():print "{name} {created}".format(name=bucket.name,created=bucket.creation_date,)EOF$ python s3test.py # 执行脚本,输出如下表示访问成功ceph-s3-bucket 2021-02-22T23:27:37.490Z
2、使用命令行验证:
# 安装工具$ yum -y install s3cmd$ s3cmd --configure # 进入配置
下图中,没有输入内容的都是直接按 “回车” 键即可。


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

s3cmd常用命令
如果上传文件报错ERROR: S3 error: 416 (InvalidRange),那么请参考 ceph对象存储上传文件报错416 进行解决。
# 创建一个名为 s3cmd-demo 的bucket$ s3cmd mb s3://s3cmd-demo# 查看bucket 列表$ s3cmd ls# 上传文件至bucket$ s3cmd put /etc/fstab s3://s3cmd-demo/fstab# 下载文件(默认下载到当前目录)$ s3cmd get s3://s3cmd-demo/fstab# 下载至指定目录,并重命名$ s3cmd get s3://s3cmd-demo/fstab /tmp/fstab-t# 删除指定文件$ s3cmd rm s3://s3cmd-demo/fstab# 删除指定目录$ s3cmd rm s3://s3cmd-demo/etc/ --recursive
测试swift用户访问
# 安装基础工具$ yum -y install python-setuptools python-pip$ pip install --upgrade python-swiftclient -i https://mirrors.aliyun.com/pypi/simple/# 访问验证# -A:指定认证URL# -U:指定用户名称# -K:指定用户对应的 secret_key$ swift -A http://192.168.20.10:80/auth -U ceph-s3-user:swift \-K 6p2AHn3vMrYZupiDMHWp9Xb5hOtB3B4LyD17pZAu list# 配置环境变量访问$ cat > ~/.swift << EOFexport ST_AUTH=http://192.168.20.10:80/authexport ST_USER=ceph-s3-user:swiftexport ST_KEY=6p2AHn3vMrYZupiDMHWp9Xb5hOtB3B4LyD17pZAuEOF# 刷新环境变量source ~/.swift# 访问验证(查看bucket列表)$ swift listceph-s3-buckets3cmd-demo
swift常用指令
# 创建一个bucket$ swift post swift-demo# 查看bucket列表$ swift list# 上传/etc/passwd 文件到swift-demo这个bucket$ swift upload swift-demo /etc/passwd# 上传 /etc/ 目录至swift-demo这个bucket$ swift upload swift-demo /etc# 查看目录内容$ swift list swift-demo# 下载 /etc/passwd 文件至本地$ swift download swift-demo etc/passwd
