1.功能特性
对象存储最基本的功能包括用户,存储桶,对象的增删改查,在此基础之上结合对象存储应用的特征,引申出更多的功能,比如在对象存储应用中,如果对一个存储桶或者对象没有任何访问的限制,该储存桶或对象就会变成公开的资源,任何人都可以访问。因此对存储桶和对象的访问控制变得尤为重要,存储桶和对象的访问功能成为了对象存储的基本功能之一。
2.I/O路径
RGW网关使用OP线程处理应用的I/O请求。OP线程内部处理逻辑可分为HTTP前端、REST API通用处理层、API操作执行层、RADOS接口适配层与librados接口层等几个关键流程。
OP线程从HTTP前端收到I/O请求以后,首先在REST API通用处理层,从HTTP语义中解析出S3或者Swift数据并进行一系列检查,检查通过以后,根据不同的API操作请求执行不同的处理流程,如需从RADOS集群获取数据或者往RADOS集群写入数据,则通过RGW与RADOS接口适配层的调用librados接口将请求发送到RADOS集群中获取或写入相应数据,完成整个I/O过程。
REST API通用处理层的关键步骤大概分为用户认证、(用户,存储桶,对象)访问权限控制、(用户、存储桶)配额检查这几个关键步骤
用户认证:对于S3 API支持认证用户和匿名用户的访问,所有没有通过认证的访问则认为是匿名用户的访问。RGW认证支持V2和V4两种认证方式,RGW V2认证支持本地认证,LDAP和kaystone三种认证方式。RGW V4认证兼容AWS V4认证机制。用户/存储桶/对象的访问权限控制:通过身份验证的请求,并不意味着一定会有访问资源(桶,对象)的权限,针对不同资源的访问,用户必须具备相应的访问权限(ACL)才能访问相应的资源。
bucket/用户配额:在RGW网关中配额管理是指对最大可存放对象数量和对象总大小进行限制,他支持单个用户以及单个用户下单个存储桶两种模式的配额限制,分别使用user_quota和bucket_quota表示。当两种配额模式同时启用时,任何一种先达到了配额限制都会生效。而且,在做用户配额判断时,如果针对的那个用户/存储桶配置了配额,则使用单个用户/存储桶配额判断,否则,使用全局配额判断。
用户操作权限判断:判断该用户是否具有读,写,删除权限。
3.存储桶的创建
1)从HTTP请求流中解析出相关参数
2)判断存储桶是否存在
3)创建存储桶
4)更新user_id.buckets对象:创建一个用户的同时,创建一个名为user_id.buckets的对象,用于记录该用户下所有的存储桶列表,保存在该对象的OMAP中。
4.对象上传
1.整体上传
prepare:在prepare阶段主要工作是初始化manifest数据结构
handle_data:RGW每次从HTTP Server缓冲区中取出rgw_max_chunk_size(分块大小)字节数据,存放在bufferlist中,然后分成一个或者多个I/O异步下发到RADOS层
complete:所有数据上传成功以后,对象上传进入complete。该阶段主要工作是将对象元数据更新到head_obj中,同时将对象条目更新到索引对象中,以便后续
2.分段上传
初始化:上传数据之前,应首先调用INITIATE MULTI-PART UPLOAD接口进行初始化,应用在调用该接口请求中携带对象的访问控制列表、用户对上传对象定义的元数据等信息。RGW网关在此操作中生成一个Uploadld返回给应用,同时在data_extra_pool中生成一个临时对象,用于保存每个分段的信息,并将对象的访问控制列表信息、元数据信息等保存到该对象的xattr中。
分段上传:流程和单个操作上传流程基本一样,不同之处在于complete阶段,分段上传除了需要将每个分段对象更新到索引对象之外,还需要将每个分段的信息更新到初始化时在data_extra_pool中生成的临时对象中。
分段上传完成:所有的分段上传完成以后,应用需要调用COMPLETE MULTIPART UPLOAD表示对象上传完成。此操作中RGW会从初始化阶段生成的临时对象中读出各个分段的信息,最主要的分段是manifest,组成一个manifest,然后生成一个head_obj,将这些信息保存到head_obj后,将临时对象删除。
5.对象下载
用户可以请求指定对象某一段,去下载对象的部分内容,RGW首先从head_obj中读出manifest管理结构,然后根据manifest中定义的规则计算出用户请求的数据段保存在哪些对象中,最后从这些对象读出数据合并发送给客户端。