对象存储是无层次结构的数据存储方法,一般用于云计算环境。和其他数据存储方法相比,对象存储有以下特点:
对象是对象存储系统中数据存储的基本单位,每个对象是数据和数据属性集的综合体。数据属性可以根据应用需求而设置,包括数据分布、服务质量等。
一般情况下一个对象存储系统的核心资源类型应该包括用户、存储桶(bucket)、对象。
这三者之间的关系是,用户将对象存储在存储桶中,存储桶隶属于用户,一个用户可以拥有一个或多个存储桶,一个存储桶一般存放多个对象。
虽然设计与实现上有所区别,但大多数对象存储系统对外呈现的核心资源类型大同小异。
官方文档:https://docs.ceph.com/en/pacific/radosgw
RadosGW是Ceph提供的对象存储访问方式,RGW是一个服务,使客户端能够利用标准对象存储API来访问Ceph集群,它支持AWS S3 API和Swift API。
RGW的功能依赖于ceph-radosgw守护进程实现,它通过内置的civetweb或beast(从M版开始支持beast,civetweb在Q版已经废弃)服务向客户端提供REST API,并将数据操作请求转换为底层rados集群相关操作。
RGW存储特点:
ceph使用bucket作为存储桶(存储空间),实现对象数据的存储和多用户隔离,数据存储在bucket中,用户的权限也是针对bucket进行授权,可以设置用户对不同bucket有不同权限,以实现权限管理。
存储空间bucket是用于存储对象的容器,所有的对象必须隶属于某个bucket,可以设置和修改存储空间属性用来控制地域、访问权限和生命周期等,这些属性设置直接作用于bucket内所有对象,因此可以通过创建不同的存储空间来完成不同的管理功能。
同一个存储空间的内部是扁平的,没有文件系统的目录概念,所有的对象都直接隶属于其对应的促成农户空间
每个用户可以拥有多个存储空间
存储空间的名称OSS范围内是全局唯一的,创建之后无法修改名称
存储空间内部的对象数量没有限制
集群中已经部署了两个rgw服务,分别运行在mon-01节点和mon-02节点上
查看默认radosgw的存储池信息
radosgw-admin zone get --rgw-zone=default --rgw-zonegroup=default
如上图所示,rgw使用的各个pool的作用如下:
使用ceph-ansibel部署的rgw默认监听8080端口,可以使用http访问测试
修改两个rgw服务所在节点的配置
vim /etc/ceph.conf
##################
[client.rgw.ceph-mon-02.rgw0]
.........
host = ceph-mon-02
rgw_frontends = beast port=9900 #将http端口修改为9900
.........
##################
sytemctl restart ceph-radosgw.target
重启完成后通过9900访问rgw验证
签发证书
#生成CA
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=linux.io" \
-key ca.key -out ca.crt
#生成radosgw证书,两个radosgw服务器使用同一套证书
openssl genrsa -out radosgw.key 4096
openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=linux.io" \
-key radosgw.key \
-out radosgw.csr
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=linux.io
DNS.2=ceph-mon-02.linux.io
DNS.3=ceph-mon-03.linux.io
EOF
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in radosgw.csr \
-out radosgw.crt
cat radosgw.key radosgw.crt >radosgw.pem #将key和crt保存到一个pem文件中
将证书分发至两个rgw服务所在节点
scp radosgw.key radosgw.crt ceph-mon-02:/etc/ceph/cert/
scp radosgw.key radosgw.crt ceph-mon-03:/etc/ceph/cert/
修改两个rgw服务所在节点的配置
vim /etc/ceph/ceph.conf
############################
[client.rgw.ceph-mon-02.rgw0]
.........
#指定https端口以及证书和私钥位置
rgw frontends = beast port=9900 ssl_port=9443 ssl_certificate=/etc/ceph/cert/radosgw.crt ssl_private_key=/etc/ceph/cert/radosgw.key
.........
############################
systemctl restart ceph-radosgw.target
部署配置haproxy
apt -y install haproxy
vim /etc/haproxy/haproxy.cfg #修改haproxy配置,添加转发配置
############################
listen radosgw-http
bind 192.168.211.15:80
mode tcp
server radosgw-server1 192.168.211.24:80 check inter 2000 fall 3 rise 5
server radosgw-server2 192.168.211.25:80 check inter 2000 fall 3 rise 5
listen radosgw-https
bind 192.168.211.15:443
mode tcp
server radosgw-server1 192.168.211.24:443 check inter 2000 fall 3 rise 5
server radosgw-server2 192.168.211.25:443 check inter 2000 fall 3 rise 5
############################
systemctl restart haproxy #重启
其它的配置可以参考官方文档介绍:https://docs.ceph.com/en/pacific/radosgw/frontends/ 和 https://docs.ceph.com/en/pacific/radosgw/config-ref/
radosgw-admin user create --uid user1 --display-name user1
radosgw-admin user list #查看用户
创建完成后会返回一个access_key和一个secret_key,保存这两个key,是用户user1访问rgw的凭据
apt -y install s3cmd
在s3cmd客户端配置域名解析,将域名解析至负载均衡器地址或具体的RGW的地址。这里将radowgw.linux.io解析至前面配置中haproxy的地址
echo "192.168.211.15 radowgw.linux.io" >>/etc/hosts
以交互式的方式指定s3cmd的配置
s3cmd --configure
创建bucket
s3cmd mb s3://bucket1 #创建一个名为bucket1的bucket
s3cmd ls #查看bucket
s3cmd put ./1.jpg s3://bucket1/ #将当前目录下1.jpg上传到bucket1中
s3cmd la #查看所有bucket中存在的object
下载数据
s3cmd get s3://bucket1/1.jpg ./2.jpg #将bucket1中1.jpg保存为本地2.jpg
目前我们通过s3cmd上传到bucket中的数据除了创建者user1外其它用户都不能访问
例如,向bucket1中上传一个MP4视频文件
s3cmd -r put videos/ s3://bucket1
此时就需要对bucket进行授权,设置公有读的权限,才能公开访问
首先准备policy文件
cat test-policy.json #此policy允许所有人读取bucket1中的对象
###########################
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": [
"arn:aws:s3:::bucket1/*"
]
}]
}
###########################
应用policy到bucket
s3cmd setpolicy test-policy.json s3://bucket1 #设置权限
s3cmd info s3://bucket1 #查看权限
再次通过浏览器访问1.mp4就可以访问了,权限已经生效
更多授权的操作可以参考: