扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
小编给大家分享一下ceph中RadosGW框架的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
成都创新互联长期为近千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为大余企业提供专业的成都网站设计、做网站、成都外贸网站建设公司,大余网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。
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()
看完了这篇文章,相信你对“ceph中RadosGW框架的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注创新互联行业资讯频道,感谢各位的阅读!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流