Ceph本质上就是一个rados,利用命令rados就可以访问和使用ceph的对象存储,但作为一个真正产品机的对象存储服务,通常使用的是Restful api的方式进行访问和使用。而radosgw其实就是这个作用,安装完radosgw以后,就可以使用api来访问和使用ceph的对象存储服务了。
首先明白一下架构,radosgw其实名副其实,就是rados的一个网关,作用是对外提供对象存储服务。本质上radosgw(其实也是一个命令)和rbd命令一样,其实是ceph集群的客户端。只不过,radosgw即作为rados的客户端,同时又提供http restful接口,作为服务端供用户使用。
Radosgw对用户而言就是一个http restful的应用,因此本质上来讲,对其进行使用就是通过http的方式,但显然每次都要用户构建http访问的url和headers不是一个很方便的方式,因此radosgw兼容了通用的对象存储接口,分别是亚马逊的s3和openstack的swift,这也就是说你可以用swift或者s3的客户端来访问radosgw。
Radosgw包含两个命令行工具,一个是radosgw,这个是用来启动radosgw服务的脚步,是一个二进制文件;另外一个是radosgw-admin,这是用来管理radosgw的账号的一个命令行工具,主要用来创建、查看、修改radosgw的账号信息。
注意,radowgw的账号信息仅仅是对radosgw的用户而言,这个和ceph中的用户不是一个概念。
Radosgw作为ceph集群(rados)的客户端,因此他在ceph中有一个账号,通常叫做client.radosgw.gateway。在启动radosgw这个服务时,会读取ceph.conf中[client.radosgw.gateway]这个section。
Radosgw有自己的账号管理系统,可以使用radosgw-admin来创建和维护账号,之后可以使用curl、swift、s3等方式指明账号名和密码就可以访问,不确定s3怎么样,但如果用swift的话,其实和openstack中类似,先通过账号和密码想radosgw的auth系统获取一个token,然后用这个token再radosgw的存储系统。
另外,radosgw是可以和keystone进行集成的,那这里就有一个问题,两个账号管理系统中的账号就有一个映射关系。实验发现,keystone中的每个tenant都对应radosgw中的一个账号,其账号uid就是keystone中的tenant id。
我们用Radosgw和keystone进行集成,创建对应的endpoint,客户端使用swift接口。操作就和和使用真正的swift+keystone没有任何差别,作为一个用户无法感知到后端究竟真是一个swift还是radosgw。但就附加功能还是有区别的,我们知道swift除了对象存储本身的上传、下载、删除等操作为,还有很多其他附加功能,比如object 过期设置、tempurl、staticweb等,这些都是通过在proxy节点增加middleware来实现的,radosgw支持swift一些middleware,但并不完全支持。由于radosgw也是c++开发的,只会写python的我,无法了解radosgw中这些middleware是如何支持的。
好吧,就说这么多了,先行这么了解,以后有用到,再做进一步研究。
==================================
有个项目中要用到,重新读文档以及动手验证,有些新的认识,补充如下。
ceph radosgw作为对象存储,同时提供swift接口和S3接口。那么这两种接口使用上有什么不同的,我们从以下几个方面分析下。
1、访问不同的接口需要的用户创建方式不同
用使用radosgw,肯定就需要一个账号信息,这个账号是由radosgw-admin这个程序来创建的。但根据要访问的接口不同,创建账号略有差异。
创建访问s3接口的用户,只需要一个命令radosgw-admin user create;
创建访问Swift接口的用户,除了上面的命令,还需要radosgw-admin subuser create。这里之所以要用到subuser,是为了和openstack里的project及user形成对应关系。
2、访问不同接口需要的用户信息不同
rados ls -p default.rgw.users.uid命令可以查看radosgw-admin创建了哪些用户
radosgw-admin user info --uid=XXX 可以查看用户的详细信息
访问S3接口,需要用到的是access_key和secret_key;
访问Swift接口,需要用secret_key获取一个token,然后用token去访问对象存储系统。
3、访问不同接口的命令行工具不同
不同什么接口,都是一个http服务,因此总是可以利用curl命令去访问各种接口,但是需要提供的Header不同。curl虽然貌似万能,但实际上要拼装完整的API参数还是比较麻烦的,这个时候可以用针对不同接口的工具。
访问S3接口,用s3cmd命令。
安装:pip install s3cmd
配置文件: ~/.s3cfg
[root@tbds-10-10-10-94 ~]# cat .s3cfg
[default]
access_key = 2LEK1H66CX3CJNNWIP9G
host_base = 127.0.0.1:8088
host_bucket = 127.0.0.1:8088/%(bucket)
secret_key = 5X5QAXUmo7goXD6508OjkEMiaS0HIqLUIxyEVBoc
use_https = False
访问Swift接口,用swift命令。
如下方式:
swift -A http://127.0.0.1:8088/auth -U wyt:wuyuting -K'wytL5CuWz25I7n48rFxUJifBoQo82xclpEI3ACSA' list