Ceph RGW架构简介

我们知道Ceph可以提供块、文件和对象三种形态的存储。而RGW就是提供对象存储的网关,也即对象存储网关。所谓对象存储网关,也就是对象存储的入口,本质上是一个HTTP服务器,与Nginx和Apache无异。通过这个入口,用户可以通过HTTP协议,以RESTful的方式访问Ceph的对象存储。

Ceph RGW的整体架构如图1所示,对象存储网关实际上是调用librados的API来实现数据的存储和读取。而该网关同时提供了兼容AWS S3和OpenStack Swift的对象存储访问接口(API)

 

Ceph对象存储RGW架构及安装实战_Ceph

图1 RGW整体架构

另外,有些同学可能不清楚对象存储的特点。在介绍后续内容之前,我们大概了解一下对象存储是如何存储数据的。对象存储的应用场景通常是互联网场景,一个对象存储通常会给多个用户(租户)使用。而在一个用户下面可以创建多个(swift里面称为容器container)。在桶中可以存储对象,对象就是我们存储的数据,比如图片或者是视频等。如果将对象存储与我们常规存储做一个类比,就好比文件夹,而对象就好比文件,但不同之处在于桶里面只能存储对象,而不能嵌套桶。如图2是对象存储数据组织形式。

 

Ceph对象存储RGW架构及安装实战_Ceph_02

图2 对象存储数据组织

今天我们主要除了介绍Ceph对象存储网关基本架构外,我们重点介绍一下如何在几个Ceph集群上部署一个RGW,并且通过Swift客户端进行访问。

部署环境描述

为了简化环境,本文使用的是2副本Ceph集群,在实际生产中通常是3副本。另外,本文使用的是本地虚拟机,也就是通过VirtualBox或者其它虚拟化平台安装的虚拟操作系统。本文操作系统版本为CentOS 7.4。如图3所示,我们的RGW安装在ceph-s节点。

 

Ceph对象存储RGW架构及安装实战_分布式存储_03

图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

具体结果如下:

 

Ceph对象存储RGW架构及安装实战_分布式存储_04

图4 对象存储所需的存储池

基本验证

如果上述配置没有出现任何问题的话,其实Ceph的对象存储网关已经正常工作了。前面我们说了,对象存储其实是基于HTTP协议的,因此我们可以通过浏览器进行访问,比如在浏览器中输入如下内容:

http://192.168.142.133:7480

回车后,可以看到如下内容:

 

Ceph对象存储RGW架构及安装实战_分布式存储_05

图5 连通性验证

对象存储访问验证

前面我们进行了安装和连通性的基本验证,对于对象存储的功能来说还差得远。下面我们通过swift的客户端工具进行验证。

注意:后续创建用户的操作应该在RGW节点上运行。

创建用户

我们前面介绍了对象存储的数据结构,数据必须存储在某个用户下面。因此,想正常的访问RGW,需要创建相应的RGW用户,并赋予相应的权限,radosgw-admin命令实现了这些功能。

执行下面命令,来创建一个名为testuser的用户:

$ radosgw-admin user create --uid="testuser" --display-name="First User"

命令的输出大致如下:

Ceph对象存储RGW架构及安装实战_分布式存储_06

 

注意:需要记住返回结果中keys->access_key和keys->secret_key的值,用于S3接口访问确认。

创建子用户

Swift用户是作为子用户subuser被创建的,执行以下命令:

$ radosgw-admin subuser create --uid=testuser --subuser=testuser:swift --access=full

输出结果大致如下:

Ceph对象存储RGW架构及安装实战_Ceph_07

 

注意:需要记住返回结果中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相关的内容。