月度归档:2014年02月

swift object features

swift 对象特性

1 fake directory 伪目录

2 multi-version  多版本
3 support large file (over 5 GiB) 大对象/文件
伪目录:之所以叫伪目录,是因为swift中并没有目录这一概念。但又可以做到“目录”方面的特性,是因为object的命名可以包含斜杠,就像通常Web中的URI的path一样。通过对名字中的斜杠进行分割,我们可以得到一个目录树结构。从而通过客户端API的封装来实现对目录的一些操作,但这并不是一个真正的目录,所以没有目录修改时间等元数据等的记载。尤其是,不存在目录大小这个概念。
多版本:swift提供了对象对版本功能,具体 找 Google。
大文件: 大文件的管理 用到了 一个元数据 和 一个命名惯例,和分段管理方法。
    swift 为了 平衡分区,限制了最大文件大小(即不容许上传特大文件),为了上传更大的文件,通过分段来实现。
    一个元数据即object的X-Object-Manifest属性,具有该属性的文件,称为“清单文件”。该类文件/对象,没有内容。其X-Object-Manifest属性的值,为一个包含container名字的path前缀,具有该前缀的对象都是该大文件对象的分段文件。
   一个命名惯例,为了将大文件和大文件的分段文件分开管理。比如在list的时候看起来简洁,将分段文件放到单独的容器中。该类container的命名为对应大文件的容器名字加上”_segments”。当然,也是可以不创建,全部放到一个容器中的。
  分段管理方法,该分段管理是对客户端可见的,因此可以单独对分段文件进行修改,上传等。在上传时,主要是客户端来控制,不过下载的时候,swift内部可识别“清单文件”,并提供大文件的合并下载。当然 客户端也是可以自己下载各分段后合并。
  另外,分段文件的命名。比如swift客户端 命名方法:
     大文件 :  com/google/big.db
     分段文件: com_segments/google/big.db/12345678900/102410241024/00000000
                        com_segments/google/big.db/12345678900/102410241024/00000001
     即 前面容器加上 _segmnets ,文件名字后面加上总文件大小,分段大小,分段号。
  同容器命名一样,由于是客户端控制,也可以使用其他方法。
================
PS, 之所以 看这个 是因为,要做 Swift EC,这个在Swift blueprint 中已提出,但我不想和Swift组织那样从Swift内部开始写,感觉这样比较困难。从外围来做工作比较简单一些。
从Swift大文件的管理方法,可以为此提供一些思路。
另外,测试了 Jerasure 和 zfec 在 n=4,m=2 下的文件编解码。 在我的测试中,zfec表现更好,而且zfec有python sdk,虽然 自己写了个 Jerasure的python wrapper, 但没有仔细测试,对自己代码还缺点信心。
前期工作还是没有做好。。。引以为戒。。。