我们知道Ceph可以提供块、文件和对象三种形态的存储。而RGW就是提供对象存储的网关,也即对象存储网关。所谓对象存储网关,也就是对象存储的入口,本质上是一个HTTP服务器,与Nginx和Apache无异。通过这个入口,用户可以通过HTTP协议,以RESTful的方式访问Ceph的对象存储。
Ceph RGW的整体架构如图1所示,对象存储网关实际上是调用librados的API来实现数据的存储和读取。而该网关同时提供了兼容AWS S3和OpenStack Swift的对象存储访问接口(API)。
图1 RGW整体架构
另外,有些同学可能不清楚对象存储的特点。在介绍后续内容之前,我们大概了解一下对象存储是如何存储数据的。对象存储的应用场景通常是互联网场景,一个对象存储通常会给多个用户(租户)使用。而在一个用户下面可以创建多个桶(swift里面称为容器container)。在桶中可以存储对象,对象就是我们存储的数据,比如图片或者是视频等。如果将对象存储与我们常规存储做一个类比,桶就好比文件夹,而对象就好比文件,但不同之处在于桶里面只能存储对象,而不能嵌套桶。如图2是对象存储数据组织形式。
图2 对象存储数据组织
今天我们主要除了介绍Ceph对象存储网关基本架构外,我们重点介绍一下如何在几个Ceph集群上部署一个RGW,并且通过Swift客户端进行访问。
部署环境描述为了简化环境,本文使用的是2副本Ceph集群,在实际生产中通常是3副本。另外,本文使用的是本地虚拟机,也就是通过VirtualBox或者其它虚拟化平台安装的虚拟操作系统。本文操作系统版本为CentOS 7.4。如图3所示,我们的RGW安装在ceph-s节点。
图3 Ceph集群
部署Ceph RGW进入安装Ceph集群的时候创建的目录中,本文之前的目录为mycluster,因此进入该目录。
$ cd my-cluster
RGW默认使用Civetweb作为其Web Sevice,而Civetweb默认使用端口7480提供服务,如果想修改端口(如80端口),就需要修改Ceph的配置文件。在配置文件中增加一个section。
[client.rgw.ceph-s]
rgw_frontends = "civetweb port=80"
注意: 这一步并不是必须的,根据实际情况进行设定
安装Ceph对象存储网关
我们可以通过ceph-deploy命令非常方便的安装Ceph的对象存储网关软件(也就是RGW)。如下是命令格式:
$ ceph-deploy install --rgw <gateway-node1> [<gateway-node2> ...]
比如在我们的ceph-s节点安装该软件,则可以执行如下命令:
$ ceph-deploy install –-rgw ceph-s
创建RGW实例
上面步骤只是安装了必要的软件,但并没有创建需要的存储资源(存储池)。之前版本的安装需要用户手动创建多个存储池,安装比较麻烦,且容易出错。目前安装非常方便,可以通过ceph-deploy命令直接创建需要的资源,具体执行如下命令即可:
$ ceph-deploy rgw create ceph-s
创建完成后我们可以看一下目前Ceph集群的资源情况,在管理节点输入如下命令查看存储池的情况:
$ rados lspools
具体结果如下:
图4 对象存储所需的存储池
基本验证
如果上述配置没有出现任何问题的话,其实Ceph的对象存储网关已经正常工作了。前面我们说了,对象存储其实是基于HTTP协议的,因此我们可以通过浏览器进行访问,比如在浏览器中输入如下内容:
http://192.168.142.133:7480
回车后,可以看到如下内容:
图5 连通性验证
对象存储访问验证前面我们进行了安装和连通性的基本验证,对于对象存储的功能来说还差得远。下面我们通过swift的客户端工具进行验证。
注意:后续创建用户的操作应该在RGW节点上运行。
创建用户
我们前面介绍了对象存储的数据结构,数据必须存储在某个用户下面。因此,想正常的访问RGW,需要创建相应的RGW用户,并赋予相应的权限,radosgw-admin命令实现了这些功能。
执行下面命令,来创建一个名为testuser的用户:
$ radosgw-admin user create --uid="testuser" --display-name="First User"
命令的输出大致如下:
注意:需要记住返回结果中keys->access_key和keys->secret_key的值,用于S3接口访问确认。
创建子用户
Swift用户是作为子用户subuser被创建的,执行以下命令:
$ radosgw-admin subuser create --uid=testuser --subuser=testuser:swift --access=full
输出结果大致如下:
注意:需要记住返回结果中swift_keys->secret_key的值,用于Swift接口访问确认。
用Swift的客户端访问对象存储
我们前面说了Ceph对象存储是兼容Swift的,因此我们可以直接用Swift的客户端访问Ceph对象存储。当然,我们需要首先安装该客户端。
添加yum源
新建文件/etc/yum.repos.d/openstack.repo,然后写入如下内容:
[centos-openstack-liberty] name=CentOS-7 - OpenStack liberty baseurl=http://vault.centos.org/centos/7.3.1611/cloud/x86_64/openstack-liberty/ gpgcheck=0 enabled=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Centos-7
更新yum缓存后就可以安装swift客户端了。
$ yum update $ yum install python-swiftclient
命令样式
Swift客户端的命令格式如下所示:
$ swift -A http://{IP ADDRESS}:{port}/auth/1.0 -U testuser:swift -K '{swift_secret_key}' list
其中swift为主命令,而后面的list为子命令。在实际使用的时候,需要替换{IP ADDRESS}、{port}、{swift_secret_key}等相关参数,其中{swift_secret_key}为创建Swift用户时radosgw-admin命令返回的swift_keys->secret_key的值。如果忘记了上述内容,可以通过radosgw-admin命令查看。
创建容器/桶
首先是需要一容器,Swift创建容器的命令为swift post contaner_name。具体命令如下:
swift -A http://192.168.142.133:7480/auth/1.0 -U testuser:swift -K 'ozmuwVXWSeUg30TO8qkYggmbM7dXy2a4VlGid2Sp' post testbucket
可以通过list命令查看一下我们创建的容器:
swift -A http://192.168.142.133:7480/auth/1.0 -U testuser:swift -K 'ozmuwVXWSeUg30TO8qkYggmbM7dXy2a4VlGid2Sp' list
上传对象
有了容器后,我们就可以向容器上传对象了。具体命令如下,为了清晰一些,这里省略了认证相关的内容。
swift upload testbucket ./mysql.yaml
成功后可以看一下容器中的内容,具体命令如下:
swift list testbucket小结
至此,我们完成了本文要介绍的内容。这里我们介绍了Ceph对象存储的基本架构、安装和基于Swift客户端的使用。当然这里仅仅是入门级的,如果各位童鞋想继续深入学习,请关注本号,本号会持续更新Ceph相关的内容。