文档章节

RadosGW框架分析

linuxhunter
 linuxhunter
发布于 2016/04/07 11:40
字数 1018
阅读 1.9K
收藏 3

RadosGW分析。

一、RadosGW的main()函数解析。

RadosGW的main()函数位于rgw_main.cc中,该函数是RadosGW的入口函数。这里主要解析和RadosGW相关的内容,尽量省略WebServer的内容。

main()函数解析如下:

1、根据g_conf->rgw_frontends得到默认支持的前端WebServers,目前默认支持的前端WebServer包括fastcgi和civetweb。对于每一个支持的前端都有一个RGWFrontendConfig类与之对应,最后将WebServer的名字和对应的RGWFrontendConfig类设置到fe_map集合中;

2、调用global_init()函数做初始化操作;

3、调用rgw_tool_init()函数从g_conf->rgw_mime_type_file指定的文件中读取该文件中的数据并初始化;

4、调用curl_global_init()函数初始化libcurl,由此可以看出rgw使用curl进行网络数据传输;

5、调用FCGX_Init()初始化WebServer;

6、调用RGWStoreManager::get_storage()函数初始化librados对象,即:以后对Ceph集群的操作都得通过该librados对象;

7、调用rgw_rest_init()初始化rest部分;

8、调用rgw_user_init()函数初始化radosgw中关于用户部分的类RGWUserMetadataHandler,且将该类注册到store->meta_mgr中;

9、调用rgw_buckt_init()函数初始化radosgw中关于bucket部分的类RGWBucketMetadataHandler和RGWBucketInstanceMetadataHandler,且将这两个类注册到store->meta_mgr中;

10、对于兼容S3的API来说,使用RGWRESTMgr_S3类作为radosgw中rest接口的默认处理类;

11、对于支持admin的操作来说,注册管理员操作对应的类RGWRESTMgr_Usage/RGWRESTMgr_User/RGWRESTMgr_Bucket/RGWRESTMgr_Metadata/RGWRESTMgr_Log/RGWRESTMgr_Opstate/RGWRESTMgr_ReplicaLog/RGWRESTMgr_Config/RGWRESTMgr_Realm;

12、注册信号处理函数,处理诸如SIGUP/SIGTERM等信号;

13、初始化前端WebServer并运行前端WebServer;

14、调用wait_shutdown()函数等待radosgw进程执行完毕;

实际的Web请求处理位于rgw_process.cc::process_request()函数内,该函数负责处理Web前端的数据读写请求。


二、process_request()函数分析流程。

int process_request(RGWRados* store, RGWREST* rest, RGWRequest* req, RGWStreamIO* client_io, OpsLogSocket* olog)

参数说明:

store:在rgw_main.cc中的main()函数中调用的RGWStoreManager::get_storage()的返回值;

rest:在rgw_main.cc中的main()函数中调用rest.register_default_mgr(new RGWRESTMgr_S3())的返回值,也就是说rest是类RGWRESTMgr_S3的实例;

处理流程:

1)rest->get_handler():得到RGWHandler_REST类实例,包括:RGWHandler_REST_Service_S3/RGWHandler_REST_Bucket_S3/RGWHandler_REST_Obj_S3;

2)handler->get_op():根据request的op得到对应的操作处理类,如:GET/PUT/DELETE/POST等;

3)handler->authorize():执行认证操作。具体调用流程如下:

handler->authorize()

|__RGWHandler_REST_S3::authorize()

    |__RGW_Auth_S3::authorize()

|__RGW_Auth_S3::authorize_v4()/RGW_Auth_S3::authorize_v2()/

根据客户端的请求头中是否包含http_auth以及http_auth的内容,确定采用S3v4或S3v2进行认证;

4)handler->postauth_init():检查bucket以及object名字的有效性。

handler->postauth_init()

|__rgw_parse_url_bucket() 解析出tenant名称和bucket名称

|__validate_tenant_name() 校验tenant名称的有效性

|__validate_s3_bucket_name() 校验S3bucket名称的有效性

|__validate_object_name() 校验对象名称的有效性

5)handler->init_permissions():读取并创建bucket有效性检查信息。

handler->init_permissions()

|__rgw_build_bucket_policies()

    |__初始化req_state->bucket_acl为RGWAccessControlPolicy_S3类实例

    |__RGWRados::get_bucket_info()/RGWRados::get_bucket_instance_info()获取bucket info信息

    |__read_policy()读取bucket的ACL信息,bucket的属性信息等

    |__RGWRados::get_zonegroup()读取bucket的zone信息

6)handler->retarget() 重新定位和计算存储对象,这个对于某些website访问的方式有效。

7)handler->read_permissions() 获取bucket以及object的ACL信息

8)op->init_processing()

op->init_processing()

|__RGWOp::init_processing()

    |__RGWOp::init_quota()

|__获取bucket_quota

|__获取user_quota

9)op->verify_op_mask()

op->verify_op_mask()

|__RGWOp::verify_op_mask() 检查操作的op_mask和用户的op_mask是否一致

10)op->verify_permission()

op->verify_permission()

|__调用RGWOp子类对应的verify_permission()函数,由RGWOp子类自行判断权限是否满足

11)op->verify_params()

op->verify_params()

|__RGWPutObj_ObjStore::verify_params()/RGWPostObj_ObjStore::verify_params() 检查上传的数据大小是否超过g_conf->rgw_max_put_size值

12)op->pre_exec()

op->pre_exec()

|__调用RGWOp子类对应的pre_exec()函数,由RGWOp子类自行处理

13)op->execute()

op->execute()

|__调用RGWOp子类对应的execute()函数,由RGWOp子类自行处理

14)op->complete()

op->complete()

|__RGWOp::complete()

    |__调用RGWOp子类对应的send_response()函数,由RGWOp子类自行处理


因此在实际处理对象存储请求时,需要RGWOp子类处理的主要函数包括:

1)RGWOp::verify_permission()

2)RGWOp::pre_exec()

3)RGWOp::execute()

4)RGWOp::send_response()


© 著作权归作者所有

linuxhunter
粉丝 73
博文 145
码字总数 93559
作品 0
沈阳
技术主管
私信 提问
加载中

评论(1)

糖大米
您好,我刚开始看rgw这边的代码?这边的看代码的流程是什么啊?你之前总结过没?
radosgw 的civetweb 配置与排错

在64bit debian8 下面使用的仍然是sysinit,运行ceph-deploy rgw create 新建rgw的时候,提示rgw服务无法启动,排查如下: 检查ceph auth配置 ceph auth已经生成了一个client.rgw.demo的用户...

秦牧羊
2015/09/17
837
0
CEPH Object Gateway

参考文档: CEPH OBJECT GATEWAY:http://docs.ceph.com/docs/master/radosgw/ 一.环境准备 1. Ceph Object Gateway框架 Ceph Object Gateway是对象存储接口,构建在librados之上,为应用提...

Netonline
2019/04/11
0
0
单机部署多CEPH-RGW的方法

引言 在高配置服务器,单个RGW的并发量无法充分使用机器的网络带宽资源,本文用于说明如何在单机上部署多RGW的方法。 如何使nginx和radosgw联合使用 如何使用配置多nginx,多radosgw 1.nginx...

西昆仑
2016/02/04
1.3K
0
Infernalis版本radosgw搭建配置

1.安装apache。 #apt-get install apache2 libapache2-mod-fastcgi 2.配置apache。 在apache配置文件中添加服务器名称,即:在/etc/apache2/apache2.conf文件添加如下内容: ServerName {fq...

linuxhunter
2016/04/06
153
0
ceph radosgw模块介绍

ceph object store模式 一、总体概括。 ceph对象网关存储指的是,通过在librados库基础上对外提供Restful API的方式来访问ceph集群。ceph对象网关通常指的是radosgw程序,该程序建立在libra...

linuxhunter
2015/12/11
761
0

没有更多内容

加载失败,请刷新页面

加载更多

易鑫车贷人工客服电话是多少

易鑫车贷人工客服电话是多少O29-63O37558人工客服电话O29-688O2826方法,大家可以采取一些传统的方式,比如说打开易鑫车贷,然后设置,就会看到帮助与反馈的字眼,然后大家打开这到各种各样的问题...

fgrf
今天
58
0
IntelliJ 如何找到项目中 Deprecated 的方法

在一个项目中,如果我们标记了某些元素为 Deprecated 的话,如何让我们能够快速找到? 简单来说,你可以对项目进行 Code Inspection。 选择 Analyze > Inspect Code 在弹出的对话框中,对整个...

honeymoose
今天
93
0
Java中的排序算法:冒泡排序

学习了一种新的排序算法:冒泡排序,冒泡排序是一种交换排序,指比较相邻的两个元素,如果前者比后者大,就交换位置,继续进行比较。 通过例子来实现: import java.util.Arrays; public cl...

北芷南姜
今天
73
0
OSChina 周五乱弹 —— 你不仅要背负工作,还要背负领导

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《Cold Rain》- AniFace 手机党少年们想听歌,请使劲儿戳(这里) @明月依稀 :露...

小小编辑
今天
960
4
个人环境之ubuntu的apt-get 总结

前言 apt-get是必须要学会的,如果搞定apt-get,可解决很多问题。接下来鸟才啊总结以往经验。 场景一 指定安装版本 先查看有软件有那些版本可以安装 apt-cache madison gcc-4.8 gcc-4.8 ...

鸟菜啊
今天
67
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部