Ceph对象存储使用
对象存储是无层次结构的数据存储方法,一般用于云计算环境。数据作为单独的对象进行存储数据并不存放在目录层次结构中,而是存在于平面地址结构的同一级别空间中应用通过唯一的地址来访问单个数据对象每个对象可以包含有助于数据检索的元数据对象是对象存储系统中数据存储的基本单位,每个对象是数据和数据属性集的综合体。数据属性可以根据应用需求而设置,包括数据分布、服务质量等。每个对象自我维护其属性,减轻了存储系统的管
文章目录
对象存储简介
对象存储是无层次结构的数据存储方法,一般用于云计算环境。和其他数据存储方法相比,对象存储有以下特点:
- 数据作为单独的对象进行存储
- 数据并不存放在目录层次结构中,而是存在于平面地址结构的同一级别空间中
- 应用通过唯一的地址来访问单个数据对象
- 每个对象可以包含有助于数据检索的元数据
对象是对象存储系统中数据存储的基本单位,每个对象是数据和数据属性集的综合体。数据属性可以根据应用需求而设置,包括数据分布、服务质量等。
- 每个对象自我维护其属性,减轻了存储系统的管理任务
- 对象的大小可以不同,甚至可以包括整个数据结构,比如:文件、数据库表项等
一般情况下一个对象存储系统的核心资源类型应该包括用户、存储桶(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就可以访问了,权限已经生效
更多授权的操作可以参考:
更多推荐
所有评论(0)