【Ceph集群应用】Ceph对象存储系统之RGW接口详解

Ceph对象存储系统之RGW接口详解

接上文基于ceph-deploy部署Ceph集群详解

1.创建Ceph对象存储系统RGW接口

(1)对象存储概念

对象存储(object storage)是非结构数据的存储方法,对象存储中每一条数据都作为单独的对象存储,拥有唯一的地址来识别数据对象,通常用于云计算环境中。
不同于其他数据存储方法,基于对象的存储不使用目录树。

虽然在设计与实现上有所区别,但大多数对象存储系统对外呈现的核心资源类型大同小异。从客户端的角度来看,分为以下几个逻辑单位:

  • Amazon S3:

提供了
(1)用户(User)
(2)存储桶(Bucket)
(3)对象(Object)

三者的关系是:

(1)User将Object存储到系统上的Bucket
(2)存储桶属于某个用户并可以容纳对象,一个存储桶用于存储多个对象
(3)同一个用户可以拥有多个存储桶,不同用户允许使用相同名称的Bucket,因此User名称即可做为Bucket的名称空间

  • OpenStack Swift

提供了user、container和object分别对应于用户、存储桶和对象,不过它还额外为user提供了父级组件account,用于表示一个项目或用户,因此一个account中可以包含一到多个user,它们可共享使用同一组container,并为container提供名称空间

  • RadosGW

提供了user、subuser、bucket和object,其中的user对应于S3的user,而subuser则对应于Swift的user,不过user和subuser都不支持为bucket提供名称空间,因此不同用户的存储桶不允许同名;不过,自jewel版本起,RadosGW引入了tenant(租户)用于为user和bucket提供名称空间,但他是个可选组件

从上可以看出大多数对象存储的核心资源类型大同小异,如Amazon S3、OpenStack Swift与RadosGw。其中 S3 与 Swift 互不兼容,RadosGw为了兼容S3与Swift, Ceph在RadosGW集群的基础上提供了RGW(RadosGateway)数据抽象层和管理层,它可以原生兼容 S3 和 Swift 的 API。
S3和Swift它们可基于http或https完成数据交换,由RadosGW内建的Civetweb提供服务,它还可以支持代理服务器包括nginx、haproxy等以代理的形式接收用户请求,再转发至RadosGW进程。
RGW的功能依赖于对象网关守护进程实现,负责向客户端提供 REST API接口。出于冗余负载均衡的需求,一个 Ceph集群上通常不止一个RadosGW守护进程。

(2)创建RGW接口

如果需要使用到类似S3或者Swift接口时候,才需要部署/创建RadosGW接口,RadosGW通常作为对象存储(Object Storage)使用,类于阿里云OSS。

在管理节点创建一个RGW守护进程

bash 复制代码
cd /etc/ceph
ceph-deploy rgw create node01

ceph -s


创建成功后,默认情况下会自动创建一系列用于RGW的存储池

bash 复制代码
ceph osd pool ls
rgw.root 
default.rgw.control			#控制器信息
default.rgw.meta			#记录元数据
default.rgw.log				#日志信息
default.rgw.buckets.index	#为 rgw 的 bucket 信息,写入数据后生成
default.rgw.buckets.data	#是实际存储的数据信息,写入数据后生成

默认情况下RGW监听7480号端口

bash 复制代码
ssh root@node01 netstat -lntp | grep 7480

curl node01:7480

2. 开启http+https,更改监听端口

RadosGW守护进程内部由Civetweb实现,通过对Civetweb的配置,可以完成对RadosGW的基本管理。

要在Civetweb上启用SSL,首先需要一个证书,在admin节点生成证书

(1)生成CA证书私钥

bash 复制代码
openssl genrsa -out civetweb.key 2048

(2)生成CA证书公钥

bash 复制代码
openssl req -new -x509 -key civetweb.key -out civetweb.crt -days 3650 -subj "/CN=192.168.80.30"

(3)将生成的证书合并为pem

bash 复制代码
cat civetweb.key civetweb.crt > /etc/ceph/civetweb.pem


(4)在admin管理节点,将生成合并的证书civetweb.pem,推送到RGW节点中

bash 复制代码
 scp civetweb.pem node02:`pwd`

3. 更改监听端口

Civetweb默认监听7480端口,并提供http协议。在管理节点编辑ceph.conf配置文件,可以修改Civetweb监听的端口号

bash 复制代码
vim /etc/ceph/ceph.conf
......
[client.rgw.node02]
rgw_host = node02
rgw_frontends = "civetweb port=80+443s ssl_certificate=/etc/ceph/civetweb.pem num_threads=500 request_timeout_ms=60000"

------------------------------------------------------------
●rgw_host:对应的RadosGW名称或者IP地址
●rgw_frontends:这里配置监听的端口,是否使用https,以及一些常用配置:
•port:如果是https端口,需要在端口后面加一个s。
•ssl_certificate:指定证书的路径。
•num_threads:最大并发连接数,默认为50,根据需求调整,通常在生产集群环境中此值应该更大
•request_timeout_ms:发送与接收超时时长,以ms为单位,默认为30000
•access_log_file:访问日志路径,默认为空
•error_log_file:错误日志路径,默认为空
------------------------------------------------------------

修改完ceph.conf配置文件后,需要重启对应的RadosGW服务,再推送配置文件

bash 复制代码
ceph-deploy --overwrite-conf config push node0{1..3}

ssh root@node02 systemctl restart ceph-radosgw.target
ssh root@node02 systemctl status ceph-radosgw.target

在rgw节点上查看端口

bash 复制代码
netstat -lntp | grep -w 80
netstat -lntp | grep 443

在客户端访问验证

bash 复制代码
curl http://192.168.80.30:80
curl -k https://192.168.80.30:443

创建RadosGW账户

在管理节点使用radosgw-admin命令创建RadosGW账户

bash 复制代码
radosgw-admin user create --uid="rgwuser" --display-name="rgw test user"
-------------------------------------------------------
 "keys": [
        {
            "user": "rgwuser",
            "access_key": "1HXE9W5NNID7BWGW0JCE",
            "secret_key": "Oq7UOSE6eTs03e7lqClN8J9iSD7QcKycVbh52gSj"
        }
    ],

创建成功后将输出用户的基本信息,其中最重要的两项信息为access_key和secret_key 。用户创建成功后,如果忘记用户信息可以使用下面的命令查看

bash 复制代码
radosgw-admin user info --uid="rgwuser"

4.S3接口访问测试

创建以及使用存储桶的脚本文件;

bash 复制代码
vim /etc/ceph/test.py 

#coding:utf-8
#boto s3手册:http://boto.readthedocs.org/en/latest/ref/s3.html
#boto s3快速入门:http://boto.readthedocs.org/en/latest/s3_tut.html
#如果脚本长时间阻塞,请检查集群状态,开启的端口等
import ssl
import boto.s3.connection
from boto.s3.key import Key
#异常抛出
try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    pass
else:
    ssl._create_default_https_context = _create_unverified_https_context
#test用户的keys信息,为在admin节点使用radosgw-admin命令创建RadosGW账户
access_key = "1HXE9W5NNID7BWGW0JCE"   
secret_key = "Oq7UOSE6eTs03e7lqClN8J9iSD7QcKycVbh52gSj"
#rgw的ip与端口,此处的IP地址为kgw节点的IP地址
host = "192.168.80.30"    
#如果使用443端口,下述链接应设置is_secure=True
port = 443
#如果使用80端口,下述链接应设置is_secure=False
#port = 80
conn = boto.connect_s3(
    aws_access_key_id=access_key,
    aws_secret_access_key=secret_key,
    host=host,
    port=port,
    is_secure=True,
    validate_certs=False,
    calling_format=boto.s3.connection.OrdinaryCallingFormat()
)

#一:创建存储桶
conn.create_bucket(bucket_name='bucket01')
conn.create_bucket(bucket_name='bucket02')

#二:判断是否存在,不存在返回None
exists = conn.lookup('bucket01')
print(exists)
exists = conn.lookup('bucket02')
print(exists)

#三:获得一个存储桶
bucket1 = conn.get_bucket('bucket01')
bucket2 = conn.get_bucket('bucket02')

#四:查看一个bucket下的内容
print(list(bucket1.list()))
print(list(bucket2.list()))

#五:向s3上存储数据,数据来源可以是file、stream、or string
#5.1、上传文件
bucket1 = conn.get_bucket('bucket01')
# name的值是数据的key
key = Key(bucket=bucket1, name='myfile')
key.set_contents_from_filename(r'D:\PycharmProjects\ceph\123.txt')
# 读取 s3 中文件的内容,返回 string 即文件 123.txt 的内容
print(key.get_contents_as_string())

#5.2、上传字符串
#如果之前已经获取过对象,此处不需要重复获取
bucket2 = conn.get_bucket('bucket02')
key = Key(bucket=bucket2, name='mystr')
key.set_contents_from_string('hello world')
print(key.get_contents_as_string())

#六:删除一个存储桶,在删除存储桶本身时必须删除该存储桶内的所有key
bucket1 = conn.get_bucket('bucket01')
for key in bucket1:
    key.delete()
bucket1.delete()
#bucket1.get_all_keys()[0].delete() #删除某一个 key

#迭代遍历删除 buckets and keys
for bucket in conn:
    for key in bucket:
        print(key.name,key.get_contents_as_string())
#---个判断文件夹中是否有文件的方法
bucket1 = conn.get_bucket('bucket01')
res = bucket1.get_all_keys()
if len(res) > 0:
    print('有文件')
else:
    print('为空')

(1)在客户端安装python3、python3-pip

bash 复制代码
yum install -y python3 python3-pip

python3 -V
pip3 -V

(2)安装boto模块,用于测试连接S3

bash 复制代码
pip3 install boto

(3)测试访问S3接口

脚本判断存储桶是否存在;

bash 复制代码
#一:创建存储桶
conn.create_bucket(bucket_name='bucket01')
conn.create_bucket(bucket_name='bucket02')
 
#二:判断是否存在,不存在返回None
exists = conn.lookup('bucket01')
print(exists)
exists = conn.lookup('bucket02')
print(exists)
exists = conn.lookup('bucket03')
print(exists)


将指定文件内容上传到bucket01存储桶中;

bash 复制代码
##5.1、上传文件
bucket1 = conn.get_bucket('bucket01')
## name的值是数据的key
key = Key(bucket=bucket1, name='gzy')
key.set_contents_from_filename(r'/opt/123.txt')
## 读取 s3 中文件的内容,返回 string 即文件 123.txt 的内容
print(list(bucket1.list()))
print(key.get_contents_as_string())

上传指定字符串内容到bucket02存储桶中;

bash 复制代码
##5.2、上传字符串
##如果之前已经获取过对象,此处不需要重复获取
bucket2 = conn.get_bucket('bucket02')
key = Key(bucket=bucket2, name='Ayu')
key.set_contents_from_string('hello world is you ooo')
print(list(bucket2.list()))print(key.get_contents_as_string())


删除指定存储桶bucket01;

bash 复制代码
---------需要取消打印存储桶的注释,否则将不返回任何数据内容
#二:判断是否存在,不存在返回None
exists = conn.lookup('bucket01')
print(exists)
exists = conn.lookup('bucket02')
print(exists)
exists = conn.lookup('bucket03')
print(exists)

##六:删除一个存储桶,在删除存储桶本身时必须删除该存储桶内
的所有key
bucket1 = conn.get_bucket('bucket01')
for key in bucket1:
    key.delete()
bucket1.delete()
##bucket1.get_all_keys()[0].delete() #删除某一个 key

5.实验中遇到的故障案例

问题:

OSD服务被down掉,健康状态显示WARN.

解决方法:

产生该问题的原因是数据在均衡或者回滚等操作的时候,导致其某个守护进程崩溃了,且没有及时归档,所以集群产生告警。
在OSD节点重启osd和mgr服务;

bash 复制代码
systemctl restart  ceph-osd.target
systemctl restart  ceph-mgr.target

在admin管理节点,查看崩溃守护进程的详细信息

bash 复制代码
ceph crash ls   #列出所有未归档崩溃守护进程
ceph crash archive <id>      #查看某个崩溃守护进程的详细信息
ceph crash archive-all		#将所有崩溃守护进程进行存档

ceph -s
相关推荐
大树886 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质7 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush47 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5207 小时前
Linux 11 动态监控指令top
linux
Inhand陈工8 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智8 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩8 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_8 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈9 小时前
Unix 与 Linux 异同小叙
linux·服务器·unix