文章目录
- 对象存储简介
- RadosGW简介
- RadosGW配置
- RGW使用的存储池
- 配置rgw使用的http端口
- 配置rgw使用https
- 配置rgw高可用
- 客户端s3cmd测试数据读写
- 创建rgw用户
- 安装s3cmd客户端
- 配置s3cmd访问rgw
- 测试数据读写
- bucket授权
对象存储简介
对象存储是无层次结构的数据存储方法,一般用于云计算环境。和其他数据存储方法相比,对象存储有以下特点:
- 数据作为单独的对象进行存储
- 数据并不存放在目录层次结构中,而是存在于平面地址结构的同一级别空间中
- 应用通过唯一的地址来访问单个数据对象
- 每个对象可以包含有助于数据检索的元数据
对象是对象存储系统中数据存储的基本单位,每个对象是数据和数据属性集的综合体。数据属性可以根据应用需求而设置,包括数据分布、服务质量等。
- 每个对象自我维护其属性,减轻了存储系统的管理任务
- 对象的大小可以不同,甚至可以包括整个数据结构,比如:文件、数据库表项等
一般情况下一个对象存储系统的核心资源类型应该包括用户、存储桶(bucket)、对象。
这三者之间的关系是,用户将对象存储在存储桶中,存储桶隶属于用户,一个用户可以拥有一个或多个存储桶,一个存储桶一般存放多个对象。
虽然设计与实现上有所区别,但大多数对象存储系统对外呈现的核心资源类型大同小异。
- Amazon S3:提供user、bucket和object,其中bucket属于user,因此user可以作为bucket的名称空间,不同用户允许使用相同名称的bucket
- Openstack Swift:提供user、container和object,分别对应用户、存储桶和对象。另外还提供了account,表示项目或租户,一个account可以包含一到多个user,这些user可以共享一组container,account还为container提供名称空间
- Ceph RadosGW:提供user、subuser、bucket和object,其中user对应S3 user,subuser对应Swift user。不过user、subuer都不支持为bucket提供名称空间。从J版起,RadosGW引入tenant,来为user、subuser提供名称空间,但它是可选的
RadosGW简介
官方文档: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存储特点:
- 通过RGW将数据存储为对象,每个对象除了包含数据,还包含数据自身的元数据
- 对象通过Object ID来检索,无法通过挂载方式访问,只能使用API来访问
- 对象的存储不是垂直的目录树结构,而是存储在扁平的命名空间中,在ceph中使用bucket表示整个命名空间
- bucket不能再包含bucket,不能嵌套
- bucket需要被授权才能访问,一个账户可以对多个bucket授权么人权限可以不同
- 方便横向扩展,快速检索数据
- 适用于文件频繁读取但不经常修改的场景,例如视频网站
ceph使用bucket作为存储桶(存储空间),实现对象数据的存储和多用户隔离,数据存储在bucket中,用户的权限也是针对bucket进行授权,可以设置用户对不同bucket有不同权限,以实现权限管理。
存储空间bucket是用于存储对象的容器,所有的对象必须隶属于某个bucket,可以设置和修改存储空间属性用来控制地域、访问权限和生命周期等,这些属性设置直接作用于bucket内所有对象,因此可以通过创建不同的存储空间来完成不同的管理功能。
同一个存储空间的内部是扁平的,没有文件系统的目录概念,所有的对象都直接隶属于其对应的促成农户空间
每个用户可以拥有多个存储空间
存储空间的名称OSS范围内是全局唯一的,创建之后无法修改名称
存储空间内部的对象数量没有限制
RadosGW配置
集群中已经部署了两个rgw服务,分别运行在mon-01节点和mon-02节点上
RGW使用的存储池
查看默认radosgw的存储池信息
radosgw-admin zone get --rgw-zone=default --rgw-zonegroup=default
如上图所示,rgw使用的各个pool的作用如下:
- .rgw.root:包含realm(领域信息),比如zone和zonegroup
- default.rgw.control:系统控制池,再有数据更新时,通知其它RGW更新缓存
- default.rgw.log:存储日志信息,用于记录各种log信息
- default.rgw.meta:元数据存储池,通过不同的名称空间分别存储不同的rados对象,这些名称空间包括用户uid及其bucket映射信息的名称空间users.uid、用户的密钥名称空间users.keys、用户的email名称空间users.email、用户的subuser的名称空间users.swift,以及bucket的名称空间root等
- default.rgw.buckets.index:存放bucket到object的所有信息
- default.rgw.buckets.data:存放对象的数据,默认是副本池
- default.rgw.buckets.non-ec:数据的额外信息存储池
- default.rgw.users.uid:存放用户信息的存储池
- default.rgw.data.root:存放bucket的元数据,结构体对应RGWBucketInfo,比如存放桶名、桶ID、data_pool等
rgw部署之后默认就会创建一些要使用的存储池,如下所示:
使用ceph-ansibel部署的rgw默认监听8080端口,可以使用http访问测试
配置rgw使用的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验证
配置rgw使用https
签发证书
#生成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
通过https访问测试
配置rgw高可用
部署配置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 #重启
通过haproxy访问rgw测试
其它的配置可以参考官方文档介绍:https://docs.ceph.com/en/pacific/radosgw/frontends/ 和 https://docs.ceph.com/en/pacific/radosgw/config-ref/
客户端s3cmd测试数据读写
创建rgw用户
radosgw-admin user create --uid user1 --display-name user1
radosgw-admin user list #查看用户
创建完成后会返回一个access_key和一个secret_key,保存这两个key,是用户user1访问rgw的凭据
安装s3cmd客户端
apt -y install s3cmd
配置s3cmd访问rgw
在s3cmd客户端配置域名解析,将域名解析至负载均衡器地址或具体的RGW的地址。这里将radowgw.linux.io解析至前面配置中haproxy的地址
echo "192.168.211.15 radowgw.linux.io" >>/etc/hosts
以交互式的方式指定s3cmd的配置
s3cmd --configure
设置完成后,配置文件默认保存在~/.s3cfg
测试数据读写
创建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
bucket授权
目前我们通过s3cmd上传到bucket中的数据除了创建者user1外其它用户都不能访问
例如,向bucket1中上传一个MP4视频文件
s3cmd -r put videos/ s3://bucket1
通过浏览器访问1.mp4文件,会提示拒绝访问
此时就需要对bucket进行授权,设置公有读的权限,才能公开访问
首先准备policy文件
- Effect:允许(allow)或拒绝(deny),默认拒绝所有,必须设置
- Principal:授权针对的用户,*表示所有,必须设置
- Action:执行的动作,例如读取对象、上传对象等,必须设置。所有可设置的动作可以参考:https://docs.ceph.com/en/quincy/radosgw/bucketpolicy/#limitations
- Resource:针对哪些bucket、object资源进行授权,必须设置
- Condition:授权生效的条件,例如客户端访问的TLS版本等,非必须,可不设置
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就可以访问了,权限已经生效
更多授权的操作可以参考:
- https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/using-iam-policies.html
- https://docs.ceph.com/en/quincy/radosgw/bucketpolicy/#