对象存储简介

对象存储是无层次结构的数据存储方法,一般用于云计算环境。和其他数据存储方法相比,对象存储有以下特点:

  • 数据作为单独的对象进行存储
  • 数据并不存放在目录层次结构中,而是存在于平面地址结构的同一级别空间中
  • 应用通过唯一的地址来访问单个数据对象
  • 每个对象可以包含有助于数据检索的元数据

对象是对象存储系统中数据存储的基本单位,每个对象是数据和数据属性集的综合体。数据属性可以根据应用需求而设置,包括数据分布、服务质量等。

  • 每个对象自我维护其属性,减轻了存储系统的管理任务
  • 对象的大小可以不同,甚至可以包括整个数据结构,比如:文件、数据库表项等

在这里插入图片描述

一般情况下一个对象存储系统的核心资源类型应该包括用户、存储桶(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就可以访问了,权限已经生效

在这里插入图片描述

更多授权的操作可以参考:

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐