对象是对象存储系统中数据存储的基本单位,每个 Object 是数据和数据属性集的综合体,数据属性可以根据应用的需求进行设置,包括数据分布、服务质量等每个对象自我维护其属性,从而简化了存储系统的管理任务,对象的大小可以不同,对象存储(Object Storage)是无层次结构的数据存储方法,通常用于云计算环境中,不同于其他数据存储方法,基于对象的存储不使用目录树:
- 数据作为单独的对象进行存储
- 数据并不放置在目录层次结构中,而是存在于平面地址空间内的同一级别
- 应用通过唯一地址来识别每个单独的数据对象
- 每个对象可包含有助于检索的元数据
- 专为使用 API 在应用级别(而非用户级别)进行访问而设计
1、RadosGW 对象存储简介
RadosGW 是对象存储(OSS,Object Storage Service)的一种实现方式,RADOS 网关也称为 Ceph对象网关、RADOSGW、RGW,是一种服务,使客户端能够利用标准对象存储 API 来访问 Ceph集群,它支持AWS S3和Swift API,rgw运行于librados之上,在ceph 0.8版本之后使用Civetweb的 web 服务器来响应 api 请求,可以使用 nginx 或或者 apache 替代,客户端基于 http/https协议通过 RESTful API 与 rgw 通信,而 rgw 则使用 librados 与 ceph 集群通信,rgw 客户端通过 s3 或者 swift api 使用 rgw 用户进行身份验证,然后 rgw 网关代表用户利用 cephx 与 ceph存储进行身份验证。
S3 由 Amazon 于 2006 年推出,全称为 Simple Storage Service,S3 定义了对象存储,是对象存储事实上的标准,从某种意义上说,S3 就是对象存储,对象存储就是 S3,它对象存储市场的霸主,后续的对象存储都是对 S3 的模仿。
2、对象存储特点
- 通过对象存储将数据存储为对象,每个对象除了包含数据,还包含数据自身的元数据。
- 对象通过 Object ID 来检索,无法通过普通文件系统的方式通过文件路径及文件名称操作来直接访问对象,只能通过 API 来访问,或者第三方客户端(实际上也是对 API 的封装)。
- 对象存储中的对象不整理到目录树中,而是存储在扁平的命名空间中,Amazon S3 将这个扁平命名空间称为 bucket,而 swift 则将其称为容器。
- 无论是 bucket 还是容器,都不能嵌套。
- bucket 需要被授权才能访问到,一个帐户可以对多个 bucket 授权,而权限可以不同。
- 方便横向扩展、快速检索数据
- 不支持客户端挂载,且需要客户端在访问的时候指定文件名称。
- 不是很适用于文件过于频繁修改及删除的场景。
ceph 使用 bucket 作为存储桶(存储空间),实现对象数据的存储和多用户隔离,数据存储在bucket 中,用户的权限也是针对 bucket 进行授权,可以设置用户对不同的 bucket 拥有不通的权限,以实现权限管理。
bucket 特性:
- 存储空间是您用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间,可以设置和修改存储空间属性用来控制地域、访问权限、生命周期等,这些属性设置直接作用于该存储空间内所有对象,因此您可以通过灵活创建不同的存储空间来完成不同的管理功能。
- 同一个存储空间的内部是扁平的,没有文件系统的目录等概念,所有的对象都直接隶属于其对应的存储空间。
- 每个用户可以拥有多个存储空间
- 存储空间的名称在 OSS 范围内必须是全局唯一的,一旦创建之后无法修改名称。
- 存储空间内部的对象数目没有限制。
bucket 命名规范:
- 只能包括小写字母、数字和短横线(-)。
- 必须以小写字母或者数字开头和结尾。
- 长度必须在 3-63 字节之间
![图片[1]-对象存储 RadosGW 使用-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2023/01/image-173.png)
![图片[2]-对象存储 RadosGW 使用-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2023/01/image-174.png)
3、对象存储访问对比
Amazon S3:提供了 user、bucket 和 object 分别表示用户、存储桶和对象,其中 bucket 隶属
于 user,可以针对 user 设置不同 bucket 的名称空间的访问权限,而且不同用户允许访问相
同的 bucket。
OpenStack Swift:提供了 user、container 和 object 分别对应于用户、存储桶和对象,不过它还额外为 user 提供了父级组件 account,用于表示一个项目或租户,因此一个 account 中可
包含一到多个 user,它们可共享使用同一组 container,并为 container 提供名称空间。
RadosGW:提供了 user、subuser、bucket 和 object,其中的 user 对应于 S3 的 user,而 subuser则对应于 Swift 的 user,不过 user 和 subuser 都不支持为 bucket 提供名称空间,因此,不同用户的存储桶也不允许同名;不过,自 Jewel 版本起,RadosGW 引入了 tenant(租户)用于为 user 和 bucket 提供名称空间,但它是个可选组件,RadosGW 基于 ACL 为不同的用户设置不同的权限控制,如:
Read 读加执行权限
Write 写权限
Readwrite 只读
full-control 全部控制权限
4、部署 RadosGW 服务
将 ceph-mgr1、ceph-mgr2 服务器部署为高可用的 radosGW 服务。
安装 radosgw 服务并初始化:
[root@mgr01 ~]# yum install -y ceph-radosgw
[root@mgr02 ~]# yum install -y ceph-radosgw
# 在 ceph deploy 服务器将 mgr 初始化为 radosGW 服务
[ceph@deploy ceph-cluster]$ ceph-deploy rgw create mgr01
[ceph@deploy ceph-cluster]$ ceph-deploy rgw create mgr02
![图片[3]-对象存储 RadosGW 使用-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2023/01/image-175.png)
验证 radosgw 服务状态:
[ceph@deploy ceph-cluster]$ ceph -s
cluster:
id: 845224fe-1461-48a4-884b-99b7b6327ae9
health: HEALTH_WARN
application not enabled on 1 pool(s)
1 pools have pg_num > pgp_num
services:
mon: 3 daemons, quorum mon01,mon02,mon03
mgr: mgr01(active), standbys: mgr02
mds: mycephfs-2/2/2 up {0=mgr02=up:active,1=mon02=up:active}, 2 up:standby
osd: 15 osds: 15 up, 15 in
rgw: 2 daemons active
data:
pools: 9 pools, 288 pgs
objects: 470 objects, 839 MiB
usage: 18 GiB used, 1.4 TiB / 1.5 TiB avail
pgs: 288 active+clean
验证 radosgw 服务进程:
[root@mgr02 ~]# ps -ef | grep radosgw
ceph 32047 1 0 18:10 ? 00:00:00 /usr/bin/radosgw -f --cluster ceph --name client.rgw.mgr02 --setuser ceph --setgroup ceph
访问 radosgw 服务:
[root@ceph-client ~]# curl http://192.168.1.117:7480
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>
5、radosgw 服务配置
radosgw 高可用架构:
![图片[4]-对象存储 RadosGW 使用-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2023/01/image-176.png)
自定义端口:
配置文件可以在 ceph deploy 服务器修改然后统一推送,或者单独修改每个 radosgw 服务器的配置为同一配置。
[root@mgr02 ~]# vim /etc/ceph/ceph.conf
# 在最后面添加
[client.rgw.mgr02]
rgw_host = mgr02
rgw_frontends = civetweb port=8080
# 重启服务
[root@mgr02 ~]# systemctl restart ceph-radosgw@rgw.mgr02.service
# 验证
[root@ceph-client ~]# curl http://192.168.1.118:8080
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>
启用 SSL:
生成签名证书并配置 radosgw 启用 SSL
# 自签名证书
[root@mgr02 ~]# cd /etc/ceph/
[root@mgr02 ceph]# mkdir certs
[root@mgr02 ceph]# cd certs/
[root@mgr02 certs]# openssl genrsa -out civetweb.key 2048
Generating RSA private key, 2048 bit long modulus
............+++
.......................+++
e is 65537 (0x10001)
[root@mgr02 certs]# openssl req -new -x509 -key civetweb.key -out civetweb.crt -subj "/CN=rgw.ceph.com"
[root@mgr02 certs]# cat civetweb.key civetweb.crt > civetweb.pem
[root@mgr02 certs]# tree
.
├── civetweb.crt
├── civetweb.key
└── civetweb.pem
0 directories, 3 files
# SSL 配置
[root@mgr02 certs]# vim /etc/ceph/ceph.conf
[client.rgw.mgr02]
rgw_host = mgr02
rgw_frontends = "civetweb port=8080+8443s ssl_certificate=/etc/ceph/certs/civetweb.pem"
[root@mgr02 certs]# systemctl restart ceph-radosgw@rgw.mgr02.service
![图片[5]-对象存储 RadosGW 使用-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2023/01/image-178.png)
# 验证访问
[root@ceph-client ~]# curl -k https://192.168.1.118:8443
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>
优化配置:
# 创建日志目录
[root@mgr02 certs]# mkdir /var/log/radosgw
[root@mgr02 certs]# chown ceph:ceph /var/log/radosgw
# 配置
[root@mgr02 ceph]# vim ceph.conf
[client.rgw.mgr02]
rgw_host = mgr02
rgw_frontends = "civetweb port=8080+8443s ssl_certificate=/etc/ceph/certs/civetweb.pem request_timeout_ms=30000 error_log_file=/var/log/radosgw/civetweb.error.log access_log_file=/var/log/radosgw/civetweb.access.log num_threads=100"
# 重启服务
[root@mgr02 ceph]# systemctl restart ceph-radosgw@rgw.mgr02.service
# 访问测试
[root@ceph-client ~]# curl -k https://192.168.1.118:8443
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>
# 验证日志
[root@mgr02 ceph]# tail /var/log/radosgw/civetweb.access.log
192.168.1.11 - - [09/Jan/2023:18:25:07 +0800] "GET / HTTP/1.1" 200 413 - curl/7.29.0
192.168.1.11 - - [09/Jan/2023:18:25:08 +0800] "GET / HTTP/1.1" 200 413 - curl/7.29.0
192.168.1.11 - - [09/Jan/2023:18:25:09 +0800] "GET / HTTP/1.1" 200 413 - curl/7.29.0
192.168.1.11 - - [09/Jan/2023:18:25:09 +0800] "GET / HTTP/1.1" 200 413 - curl/7.29.0