问题导读
1、在网站的应用中,Swift可用于存储什么文件?
2、Swift2.0有哪些存储策略功能?
3、如何配置存储策略?
摘要:
在Swift2.0中推出的存储策略功能,能够让管理员根据自己系统的特点制定不同的存储策略;用户或租户根据自己数据的特点和业务需要,以Container为粒度选择存储策略。文中对存储策略做了简要介绍,让读者体会其用途。
OpenStack ObjectStorage(Swift)前身是Rackspace CloudFiles项目,于2010年贡献给OpenStack社区,是OpenStack最早的两个项目之一。Swift可在比较便宜的通用硬件上构筑具有极强可扩展性和数据持久性的存储系统,支持多租户,通过RESTfulAPI提供对容器(Container)和对象的CRUD操作。
OpenStackSwift对象存储及其存储策略简介
Swift2.0于2014年7月8日发布,其中最重要的新特性是存储策略(StoragePolicy),该特性改变了以往存储系统中存储策略由设计与实施方决定的做法,让用户能够以Container为粒度,为不同需求的数据指定不同的副本数量、不同参数的纠删码、不同性能的存储介质、不同地理位置、不同的后端存储设备。存储策略充分体现了Swift"软件定义存储"(SoftwareDefinedStorage)的特点。
为了实现存储策略,Swift在原先三个环(Ring)的架构基础上进行了改进。Swift为账户、容器和对象分别定义了的环,通过环将虚拟节点(分区)映射到一组物理存储设备上。在Swift2.0中,每个存储策略对应一个ObjectRing。
Swift存储策略的配置与使用
配置存储策略
设置存储策略分为两步:编辑配置文件swift.conf文件,创建相应的ObjectRing。在配置文件中每个存储策略以[storage-policy:N]开头,其中N是策略的编号。对于该文件的解析遵循以下规则:
1、如果该文件中没有声明任何策略,Swift会自己创建一个;
2、策略编号应当位非负整数;
3、如果没有声明默认策略,Swift会把编号为0的策略设为默认策略;
4、策略编号必须唯一;
5、策略应当具有名字,策略命名区分大小且必须唯一;
6、策略名称只能包含字母、数字和连字符,"Policy-0"只能用于编号为0的策略;
7、定义策略之后,应当有一个且仅有一个策略被指定为默认策略;
8、"废弃"(Deprecated)策略不能同时为默认策略。
下面是一个swift.conf文件的示例:
[swift-hash]
# random unique strings that can never change (DO NOT LOSE)
swift_hash_path_prefix = changeme
swift_hash_path_suffix = changeme
[storage-policy:0]
name = apple
default = yes
[storage-policy:1]
name = orange
deprecated = yes 复制代码
完成swift.conf 文件的编辑,下一步是为每个存储策略创建相应的Object Ring,方法和创建老版本 Object Ring类似,只是要在object 后面加上"-N",这里的 N 是存储策略的编号。例如,为上述编号为 0和1的存储策略创建Object Ring:
swift-ring-builder object-0.builder create 10 3 1
swift-ring-builder object-1.builder create 10 2 1 复制代码
使用存储策略
存储策略的使用非常简单,只需要在创建 container 是指定存储策略即可,下面以 SAIO 部署为例加以说明:
curl -v -X PUT -H 'X-Auth-Token: <your auth token>' -H \
"X-Storage-Policy: orange" \
<a href="http://127.0.0.1:8080/v1/AUTH_test/myCont1">http://127.0.0.1:8080/v1/AUTH_test/myCont1</a>
curl -X PUT -v -T file1.txt -H 'X-Auth-Token: <your auth token>' \
<a href="http://127.0.0.1:8080/v1/AUTH_test/myCont1/">http://127.0.0.1:8080/v1/AUTH_test/myCont1/</a> 复制代码
然后执行:
curl -X GET –v \
<a href="http://127.0.0.1:8080/endpoints/AUTH_test/myCont1/file1.txt">http://127.0.0.1:8080/endpoints/AUTH_test/myCont1/file1.txt</a> 复制代码
例如,会看到如下结果:
["http://127.0.0.1:6010/sdb1/32/AUTH_test/myCont1/file1.txt",
"http://127.0.0.1:6040/sdb4/32/AUTH_test/myCont1/file1.txt"] 复制代码
说明 Storage Policy 已经成功发挥作用。
存储策略的应用模式
上述提到副本数量的改变,只是存储策略的应用模式的一种,在实际应用中,可以有以下几种模式:
1. 缩减或增加冗余
对于一些数据,它们不需要保证很高的数据持久性和可靠性,比较典型的是图像的缩略图,它们可以由原图降采样得到,在这种情况下,可以对原图采用三副本方案,对缩略图采用双副本方案,降低存储系统的开销。
图 1.为不同的 Container 指定不同的副本数量
2. 性能分层
例如,对于一些数据用 HDD 保存,另一些用 SSD 保存。也可以应用于其他存储介质,甚至是不同的存储设备。
图 2.为不同的 Container 指定不同的存储介质
3. 地理位置约束
在某些场景下,因为公司或者国家的政策的约束,某些数据必须存储在指定的地理位置,例如混合云场景。有些场景下,用户希望指定数据存放在距离访问客户端比较近的地方。
图 3.为不同的 Container 指定不同的存储位置
4. 应用纠删码(Erasure Codes)
对于性能要求不高的场合,应用纠删码。纠删码,又称为删除码,将对象分割为 m 个分片(fragments),并通过编码生成 k 个校验分片,最后将这 n=m+k 个分片放到 Swift 对象存储系统的不同位置(通常是 swift 的不同 zone 中)。对于将 m 个分片编码为 n 个分片的纠删码,记为EC(m, n)。纠删码的示意图如下:
图 4.纠删码示意图
纠删码在提高存储空间利用率的同时,保持或增加数据的持久性(durability)和可靠性。但是由于编码、解码和恢复数据往往需要较大的计算量,可能导致性能的降低,所以比较适用于对持久性和可靠性要求比较高,但是访问量并不大的数据存储。
图 5 .应用纠删码保护数据
在某视频网站中的应用案例
在某视频网站中,采用 Swift 存储视频文件,并对其部分文件根据视频类型的不同应用不同的存储策略。
作者简介:李明宇在中国科学院担任课题组负责人。2008 年进入中科院软件所工作以来,带领团队在船舶、航天等领域国家大型工程项目中负责私有云和大数据系统的设计与实施,为互联网和 IT 公司提供培训、咨询和系统优化。目前主要研发方向为分布式对象存储、大数据系统云化。在高水平国际会议和 SCI 期刊上发表多篇论,并申请多项专利。