小編給大家分享一下ceph中RadosGW框架的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
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框架的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。