一 介绍
通常,为了描述一个Account、Container或者对象,我们应该以“class Account”的形式去定义一个类,并将相关的操作进行封装,但是在Swift中,有的只是“class AccountController”,各个Controller去处理接收的HTTP请求,并操作保存在存储节点上的相应文件。
在ObjectController与物理文件之间,Swift提供了类DiskFile作为桥梁,所有针对具体对象文件的操作都被封装在DiskFile里面,因此实际上我们可以将类DiskFile作为Swift对象的描述,它的部分属性为:
name:值为/<account>/<container>/<obj>。
disk_chunk_size:每次操作文件的块大小。
device_path:比如/srv/node/node['device']。
data_file:存放Object的文件路径
datadir:Object数据文件所在的目录,比如/srv/node/node['device']/objects/
metadata:对象的元数据。
下面是一个运行环境的实际路径
[root@localhost swiftloopback]# pwd
/srv/node/swiftloopback
[root@localhost swiftloopback]# ll
total 32
drwxr-xr-x. 3 swift swift 4096 Mar 18 15:31 accounts
drwxr-xr-x. 3 swift swift 4096 Mar 31 19:10 containers
drwx------. 2 swift swift 16384 Mar 17 21:24 lost+found
drwxr-xr-x. 4 swift swift 4096 Apr 1 19:21 objects
drwxr-xr-x. 2 swift swift 4096 Mar 18 16:16 tmp
二 Object RESTful API
GET:下载object的内容并且获得该object的元数据。
PUT:用传递进来的数据内容以及metadata创建或者替换一个object
COPY:复制一个object
DELETE:永久性删除一个object
HEAD:获取object的metadata
POST:创建或者更新object的metadata
三 PBE
不同的存储介质不同的文件系统对于文件的操作方式可能会有些差异,我们无法用一个类DiskFile涵盖所有的情况,为了支持不同的存储后端(storage backend),Swift引入了PBE(pluggable backends,可插拔后端)的概念。
PBE通过实现特定的类DiskFile去支持新的后端存储,因为ObjectController负责响应RESTful API,并通过类DiskFile进行具体的文件操作,所以所有的类DiskFile实现必须要满足ObjectController处理流程的需要,官方文档给出了需要实现的接口的详细描述,比如所有DiskFile必须实现对象内容和元数据的读写。
Swift提供了一个简单示例,实现了一个内存文件系统的后端接口:swift.obj.mem_diskfile,按照官方文档的要求实现了一个新的DiskFile类,swift.obj.mem_server定义了新的ObjectController,它继承于swift.object.server.objectController,我们可以修改Paste Deploy文件/etc/swift/object-server.conf中的[app:object-server],使其使用新的ObjectController即可。
![](https://i-blog.csdnimg.cn/blog_migrate/894fd82c0e1b618916e513da5ef258c6.png)
[pipeline:main]
pipeline = healthcheck recon object-server
[app:object-server]
#默认为object,使用swift.obj.server.ObjectController
#use = egg:swift#object
use=egg:swift#mem_object