Ceph存储接口-Ceph RGW对象存储

今天我们来学习Ceph提供的另外一个存储接口:RGW对象存储,掌握什么是对象存储,Ceph中RGW组件部署,命令行工具 s3cmd 的使用,以及通过 python 调用SDK编写API接口实现对象存储的上传,下载等功能。

1、RGW对象存储

关于什么是对象存储、这里我就不再过多介绍了、感兴趣的同学请自行百度、我们直奔主题。

2、RGW网关部署

Ceph Object Gateway提供了为Ceph提供了对象存储网关接口,其基于librados为应用程序提供了RESTful风格的API,为应用程序提供访问Ceph对象存储的能力,要访问对象存储,首先需要有一个RGW,RGW即Rados GateWay,RGW是一个http服务器,用于和Ceph存储系统交互。

img

1、对象存储网关对外提供兼容于S3风格的API和兼容于Swift风格的API;

2、存储网关RGW负责用户API接入;

3、使用RADOS协议实现数据存储;

4、monitor保存集群状态,OSD负责实际数据存储。

要使用Ceph对象存储,首先我们需要部署RGW存储网关,RGW是一个http服务器,由Civetweb(一个web服务器)实现。目前RGW已经嵌入到radosgw中了,因此部署会简单很多,Civetweb默认使用7480端口,我们可以根据需要将其修改为80端口。这里我们在 cephnode-01 上部署RGW,执行部署前需要进入到admin-node的目录下:

# 进去admin-node目录
cd admin-node
# 部署RGW
ceph-deploy rgw create cephnode-01

img

img

从上图最后的输出结果我们可以看出,RGW默认监听在7480端口,此时如果我们访问 cephnode-01 的7480端口,将会得到如下的输出结果,由于RGW有自己的用户认证,当前没有集群创建认证授权账户,因此会提示无法授权的报错信息。

# 访问cephnode-01的7480端口
curl http://cephnode-01:7480

img

RGW部署完毕后,集群中默认会创建多几个pool资源池,我们可以通过ceph osd lspools查看,此时集群增加多了几个pool,这几个pool专门用于RGW:

# 查看pool资源池
ceph osd lspools

img

RGW默认提供7480端口,但是该端口是可以修改的。这里我们按照习惯,把默认的7480端口修改为80,我们需要在管理节点的 ceph-admin 目录下修改 ceph.conf 配置文件,并在 global 段后面添加如下内容:

# 添加配置文件 /ceph-admin/ceph.conf
[client.rgw.cephnode-01]
rgw_frontends = "civetweb port=80"

修改后的配置文件内容如下:

# /ceph-admin/ceph.conf
[global]
fsid = 3830951a-26a0-4d56-97c4-e05c0c1b7159
public_network = 192.168.18.0/24
cluster_network = 192.167.17.0/24
mon_initial_members = cephnode-01,cephnode-02,cephnode-03
mon_host = 192.168.18.134,192.168.18.135,192.168.18.136
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

[client.rgw.cephnode-01]
rgw_frontends = "civetweb port=80"

img

配置修改完成之后我们需要将 ceph.conf 配置文件同步到集群中的所有节点:

# 配置文件分发
ceph-deploy --overwrite-conf config push cephnode-01 
ceph-deploy --overwrite-conf config push cephnode-02 
ceph-deploy --overwrite-conf config push cephnode-03

img

配置文件修改分发完成之后,我们需要重启cephnode-01节点的RGW服务,服务名称为:ceph-radosgw:

# 重启radosgw服务
systemctl restart ceph-radosgw.target

# 查看radosgw服务端口状态
netstat -anltp | grep radosgw

img

至此,我们已经在 cephnode-01 完成了RGW存储网关的部署。但是,此时RGW存储网关是单点,只有一个 cephnode-01 充当RGW的角色,如果 cephnode-01 出现异常,势必会导致RGW集群不可用,怎么解决呢? 我们需要部署多个RGW,这里我们把 cephnode-02 和 cephnode-03 也加入到为RGW存储网关。

添加 cephnode-02 和 cephnode-03 节点为 RGW存储网关:

# 添加 cephnode-02 和 cephnode-03 节点
ceph-deploy rgw create cephnode-02
ceph-deploy rgw create cephnode-03

img

然后我们采用相同的方法,将 cephnode-02 和 cephnode-03 节点的RGW默认端口7840修改为80,并将配置同步到其他节点上,然后重启 cephnode-02 和 cephnode-03 节点的 ceph-radosgw.target 服务,其配置文件最终内容为:

# /ceph-admin/ceph.conf
[global]
fsid = 3830951a-26a0-4d56-97c4-e05c0c1b7159
public_network = 192.168.18.0/24
cluster_network = 192.167.17.0/24
mon_initial_members = cephnode-01,cephnode-02,cephnode-03
mon_host = 192.168.18.134,192.168.18.135,192.168.18.136
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

[client.rgw.cephnode-01]
rgw_frontends = "civetweb port=80"

[client.rgw.cephnode-02]
rgw_frontends = "civetweb port=80"

[client.rgw.cephnode-03]
rgw_frontends = "civetweb port=80"

img

# 配置文件分发
ceph-deploy --overwrite-conf config push cephnode-01 
ceph-deploy --overwrite-conf config push cephnode-02 
ceph-deploy --overwrite-conf config push cephnode-03

img

img

配置文件分发完成之后,我们重启 cephnode-02 和 cephnode-03 的ceph-radosgw.target服务,此时cephnode-02 和 cephnode-03 的RGW也将会监听到80端口上:

# 重启radosgw服务
systemctl restart ceph-radosgw.target

# 查看radosgw服务端口状态
netstat -anltp | grep radosgw

img

img

此时集群有三个RGW,但是该使用哪个作为接入呢?其实,RGW是一个http的web服务器,其提供无状态化的接入,因此对于 cephnode-01,cephnode-02和cephnode-03 来说,三个节点都是相同的,不管是哪个为入口,其提供的能力都是一样的,基于此我们需要在两个RGW的前面提供一个负载均衡调度器来实现接入,redhat官方推荐使用 haproxy 作为前段的负载均衡调度器,同时使用 keepalived 来确保haproxy的高可用。感兴趣的同学可以自行部署 haproxy和keepalived ,如果RGW存在负载,只需要扩容RGW并将其添加之负载均衡调度器即可。至此,Ceph RGW网关部署完毕,接下来我们开始探索如何使用Ceph对象存储。

img

3、s3cmd客户端

现在我们已经部署好了RGW网关,我们该如何向RGW中上传下载对象存储文件呢?一般而言会提供有三种访问的方式:

  • 1、API接口;
  • 2、SDK,提供各种编程语言的SDK接口供开发者使用;
  • 3、命令行接口,类似于 aws s3 cp 的命令行接口,用于系统管理员使用。

s3cmd是提供访问RGW的开源命令行工具,通过这个工具我们可以实现类似于s3接口的访问方式,下面我们通过 s3cmd 实现对象存储的管理。RGW对象存储提供了独立的认证方式用于访问对象存储网关,因此我们需要先创建认证访问的账户。由于RGW能兼容与S3风格的API,同时也能兼容于Swift风格API,创建认证账户也是有所区别的。这里我们先创建S3风格的API为例演示s3cmd命令行接口的使用。

我们通过 radosgw-admin 创建一个访问的用户,创建输出结果可以看到access_key和secret_key,这两个key非常关键,需要用于后续key访问RGW对象存储:

# 创建用户
radosgw-admin user create --uid z0ukun-rgw-s3  --display-name="Ceph RGW S3 Style User"

img

从上面的输出可以看到access_key,secret_key,同时也能够看到关于bucket,user配额相关的内容,radowsgw-admin还提供了其他用户管理相关的命令,比如查看用户的列表:

  • 1、radosgw-admin user modify 修改用户信息;
  • 2、radosgw-admin user rm 删除用户;
  • 3、radosgw-admin user enable,radosgw-admin user suspend 启用和禁用用户。

此时用户已经创建完毕,我们可以配置 s3cmd 访问集群了,访问集群的时候需要用到RGW的访问域名。如果在企业中最好设置DNS解析,当前为了测试直接写hosts文件的方式实现:

img

注:当前集群有3个radosgw,指向任意一个均可以,生产环境应该指向radosgw的VIP地址。

然后我们直接安装 s3cmd 工具:

# 在线安装 s3cmd 
yum install s3cmd -y

img

s3cmd 安装完毕后,我们需要对 s3cmd 进行配置,这里就需要用到我们前面讲的 access_key访问key;secret_key密钥key;region区域和endpoints即RGW的地址了。如果不记得可以通过 radosgw-admin user info –uid z0ukun-rgw-s3 查询:

# 查看访问用户
radosgw-admin user info --uid z0ukun-rgw-s3 

# 配置s3cmd
s3cmd --configure

img

这里我们需要输入access_key,secret_key和endpoints地址;关闭https,DNS风格访问的bucket名称,其余保持默认即可。最后配置将会保存在 /root/.s3cfg中,我们可以根据需要修改这个配置文件中的内容,接下来就可以使用s3cmd和RGW交互了。

我们先来创建一个bucket,bucket是存储俑,这里我们可以理解为装载对象的容器。我们通过mb即 make bucket 完成了bucket的创建,然后可以通过 ls 查看bucket创建的情况,当前有一个bucket:

# 创建 bucket
s3cmd mb s3://z0ukun-rgw-bucket

# 查看 bucket
s3cmd ls

img

有了 bucket 之后,我们就可以向 bucket 中上传文件了。这里我们通过 put 命令上传一个文件到 bucket 中。上传完毕后,我们通过ls查看文件或者通过info查看文件详情:

# 上传文件
s3cmd put /etc/fstab s3://z0ukun-rgw-bucket/fstab

# 查看文件详情
s3cmd ls s3://z0ukun-rgw-bucket
s3cmd info s3://z0ukun-rgw-bucket

img

当然,我们也可以同 bucket 中下载文件:

# 下载文件
s3cmd get s3://z0ukun-rgw-bucket/fstab test-fstab

img

除了这几个常见的基本功能之外,s3cmd还提供了sync,cp,mv,setpolicy,multipart等功能,我们可以通过s3cmd –help获取更多的命令帮助:

img

向radosgw中上传了对象之后,我们再次查看ceph的pool,会发现多出了几个pool:default.rgw.buckets.index,default.rgw.buckets.data:

# 查看pool资源池
ceph osd lspools

img

default.rgw.buckets.index用于存储索引,default.rgw.buckets.data用于存储数据,我们实际查看一下里面的数据看看,可以看到一个存储的是对象的索引,另外一个存储的是实际的数据:

# 查看索引
rados -p default.rgw.buckets.index ls
rados -p default.rgw.buckets.data ls

img

4、SDK

前面s3cmd通过命令行的接口方式访问Ceph RGW集群,向Ceph集群中上传数据和下载文件等操作,s3cmd也是系统管理员比较喜欢的方式。但是对于开发者而言,更喜欢SDK,通过SDK实现和Ceph对象存储进行交互,完成业务数据的上传下载逻辑处理,当前Ceph支持多种语言的SDK,包括C,C++,Python,Go等主流语言,现在我们尝试使用Python的SDK来实现和RGW交互,当然您如果熟悉其他语言也可以使用其他语言的SDK。

首先我们要去安装依赖包工具,客户端需要安装一个rpm包:python-boto:

# 安装 python-boto
yum install python-boto -y

img

获取S3风格常见的用户access_key和secret_key:

# 获取用户授权(下图的access_key和secret_key就是我们需要的)
radosgw-admin user info --uid z0ukun-rgw-s3

img

然后我们编写SDK接口实现buckdet的创建,并将bucket列表输出:

# 创建s3client.py请求文件
import boto.s3.connection

hostname="192.168.18.134"
port=80
access_key = 'U2W15EU20LAM0SFSPC0W' 
secret_key = 'lSLZIHEGc9lBqTyeQucFl9HKnoIMUHUMkM7akHF9' 
conn = boto.connect_s3(
        aws_access_key_id=access_key,
        aws_secret_access_key=secret_key,
        host=hostname, port=port,
        is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(),
       )

bucket = conn.create_bucket('sdk-bucket-demo')
for bucket in conn.get_all_buckets():
    print "{name} {created}".format(
        name=bucket.name,
        created=bucket.creation_date,
    )

img

这里需要替换主机名ip,端口,access_key和secret_key等信息为真实环境信息。然后执行下面的命令查看效果:

# 测试SDK
cd ceph-admin
python s3client.pt

img

从上图我们已经可以看到,我们成功拿到的SDK的信息。现在我们就可以使用SDK来实现对象的上传,如下例尝试将/etc/passwd文件上传到对象存储中,文明名命名为passwd:

# 创建s3client.py请求文件
import boto.s3.connection

hostname="192.168.18.134"
port=80
access_key = 'U2W15EU20LAM0SFSPC0W' 
secret_key = 'lSLZIHEGc9lBqTyeQucFl9HKnoIMUHUMkM7akHF9' 
conn = boto.connect_s3(
        aws_access_key_id=access_key,
        aws_secret_access_key=secret_key,
        host=hostname, port=port,
        is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(),
       )

bucket = conn.create_bucket('sdk-bucket-demo')
for bucket in conn.get_all_buckets():
    print "{name} {created}".format(
        name=bucket.name,
        created=bucket.creation_date,
    )
key=bucket.new_key('passwd')
key.set_contents_from_string('/etc/passwd')

上传完毕后我们可以通过s3cmd查看bucket中的对象。当然、关于SDK的更多范例,各位小伙伴可以参考官方文档:https://docs.ceph.com/docs/master/radosgw/s3/python/#creating-an-object

5、swift风格API

前面我们介绍的s3cmd和SDK接口调用,均是S3风格的方式。RGW除了能够支持S3风格的API,还能够支持Swift风格,swift是openstack提供的对象存储,它能提供像Ceph RGW一样对象存储的功能,同时还提供了规范化的swift API,Ceph RGW同样能兼容于swift的API,由于swift有自己的一套认证机制,因此我们需要先创建一个swift认证风格的用户。

创建swift风格的认证用户(创建用户和key的步骤需要分开):

# 创建swift风格的用户
radosgw-admin subuser create --uid=z0ukun-rgw-s3 --subuser=z0ukun-rgw-s3:swift --access=full

img

然后我们执行下面的命令生成secret key,执行完成之后我们可以看到生成了一个 m05xfkwK049moS7KnaI7QychNCo5nGQJLOPZ3H48 的key,该key用于后面的认证:

# 生成secret key
radosgw-admin key create --subuser=z0ukun-rgw-s3:swift --key-type=swift --gen-secret

img

用户生成完了之后,我们来安装一个swift的客户端,该客户端由python-swiftclient提供:

# 安装python-swiftclient
yum install python-pip -y
pip install python-swiftclient

然后我们就可以测试swift接口的使用了,这里我们使用前面生成的key,可以看到swift已经将key列举出来了:

# swift接口测试
swift -A  http://192.168.18.134:80/auth -U z0ukun-rgw-s3:swift -K 'm05xfkwK049moS7KnaI7QychNCo5nGQJLOPZ3H48' list

img

但是上述这种使用方式不太便捷,我们使用环境变量的方式来替代url认证,用户和key(长期使用的话可以将其保存在一个文件中,需要用的时候source该文件):

# 配置环境变量
export ST_USER=z0ukun-rgw-s3:swift
export ST_KEY=m05xfkwK049moS7KnaI7QychNCo5nGQJLOPZ3H48
export ST_AUTH=http://192.168.18.134:80/auth

有了环境变量之后,swift后面就不需要添加了,此时我们可以像s3cmd一样,使用swift命令操作RGW对象存储。例如这里我们创建一个bucket,名称为bucket-for-swift:

# 创建bucket
swift post bucket-for-swift
swift list

img

我们向bucket中上传文件,这里我们将/etc目录上传到RGW中:

# 上传文件
swift upload bucket-for-swift /etc/

# 查看校验bucket中的内容
swift list bucket-for-swift | less

img

同样,我们也可以把上传的文件下载下来:

# 文件下载
swift download bucket-for-swift

img

好了,至此swift演示到此完毕,如果您有接触过openstack的swift,相信上面的swift命令您会很熟悉,openstack swift对象存储所提供的功能,Ceph RGW一样能够为您提供。

推荐文章