英特尔周渊:软件定义云存储解决方案
阿明 发表于:13年12月11日 22:00 [原创] 存储在线
2013年12月11日,北京——以“数据造化 智见未来”为主题的2013中国存储峰会在北京盛大开幕。作为一年一度的中国信息产业界领袖级会议,本次大会得到了中国软件行业协会、中国计算机学会存储技术专业委员会、武汉国家光电实验室和国防科技大学计算机学院的大力支持。在下午软件定义与数据中心论坛上,英特尔亚太研发公司基础架构实验室高级软件开发工程师周渊为大家现场分享软件定义云存储解决方案,带给大家全新的软件定义云存储的趋势与观点。
在演讲现场,周渊分析道,软件定义存储这个概念大家都在谈,但仅靠几个名词很难有深入的理解,对此给大家分享一个英特尔实际在做的关于对象存储的项目,希望能对大家有帮助。首先是关于对象存储的一些基本概念,大家可能理解最多是本地文件系统,比如本地的一块硬盘格式化成NTFS,向应用程序提供了Posix接口,然后是传统的分布式文件系统,也会向应用程序提供Posix接口。而对象存储有所不同,通常来说一个对象存储,首先会有一套RESTful 的接口,然后是一个代理/控制节点,主要做关于数据定位,最后面就是真正的存储节点,用于存储数据。与传统的文件系统比,最大的差别在接口。
另一方面,值得注意的是对象存储系统持久性,通常有三种机制,第一种就是说对于非常“热”的数据可以用副本机制,对冷一点数据可以应用纠删码机制,实际情况中采用混合的方案:既有冷数据也有热数据。这里其实也可以理解为是一个区分的服务等级,“比方说你给我最多钱就让你用三副本的形势来存储。”对象存储在过去几年时间里面发展非常快,Amazon S3已经有2万亿数据,每秒钟请求数有110万。
Erasure Coding很早就出现了,一直在不同的领域变动进化。实际上,其基本思想是,把数据切割成小块的形式,再对这些小块数据计算校验码得出校验块,这样当原始数据块丢失时,可以通过校验块计算出原始数据,于是可以容忍一定程度上的数据丢失。总结来说就是用CPU资源节省存储资源。英特尔对此专门来做存储相关的一个库,提供英特尔® 架构上erasure code,压缩等的支持,从实验数据来看,这个库性能是很不错的,我们也正尝试把它开源。现在这个项目也利用了这个库在Swift里面支持Erasure Coding。
对于Swift来说,可以这么理解,它是Amazon S3的替代品。最早是由Rackspace共享出来给OpenStack提供存储对象的一个项目。首先它有一个RESTful的接口来访问,其提供container模型来组织对象,针对非机构化数据来提供最终一致性。当然最重要的一点就是说它提供了一个很好的扩展性:可以用最普通的硬件组建的服务器就可以把它扩展好。比较具体一点来说Swift 里有个Ring的概念,Ring是一组内部的一致性hash表。当大家在硬盘上存储数据的时候,Swift通过Ring里的算法,可以保证三个副本放在尽可能不同的位置,不同副本之间尽量不产生影响,同时后台会有一些不同的进程来维护一致性。值得注意的是,Swift不是分布式文件系统,不提供Posix的接口,不支持ACID语义操作,不是NoSQL数据存储,不提供对块级别存储服务。
从总体来看,Swift分成几个部分,最前面它有Proxy节点负责处理所有的请求,并将请求发至后端存储节点去访问真实数据。Swift的结构很清晰,里面正好有一个proxy,像一个程序的入口出口一样,所以英特尔考虑在这个节点上做文章,在读写请求做Erasure code编解码。然后以Container为模型来组织数据,通过container的元数据(metadata)来识别其中的对象是否被编码过。这和现有Swift架构保持一致,还可以同时支持线上和线下的Erasure code。通过更加灵活的配置及优化策略,可以更好地做一个Tiering的解决方案,在这里英特尔更多是定义好一个机制而非策略,策略可以根据用户自己的需要去定义。
基于现有的完整性框架,需要加入一定服务进去来保证编码数据的完整性,这些代码都尽量以增量的形式加入,这样有利于用户从一些线上服务升级。比如用户用的是E或者G比较老的版本,现在就可以无故障升级。从Swift纠删码(EC)高层架构来看,最后实现就是一个混合存储方案,同时支持多副本和Erasure coding。比方当是三副本的时候就要存三副本,当是Erasure code时候就要去存Erasure code,同时在这里还定义了Erasure coding interface,这也是另外一个英特尔和Box合作的一个开源项目。并且在Swift中对此也有类似一些修改,主要是增加支持Erasure code plugin的相关模块。
最主要的修改是引入了多个对象Ring来支撑多种存储方案,也就是多副本和Erasure coding并存。在Erasure coding的Ring中,重用现有的副本存放位置算法,可以保证各个数据块与代码块尽可能分开存放。这样可以建立多种存储策略的基础。可以想象最终得到一个成品,就是说有些objects是用Erasure code存储的,有些则是多副本的形式存放。
其次是关于Erasure Code库的接口,英特尔和Box合作定义了云存储中编解码需要的接口,可以支持多种编解码形势。英特尔又加入后台进程来保证完整性。后台有一个审计员在不断进行MD5校验,如果数据已经被损坏了则直接进行隔离。同时会有一个reconstructor来进行数据恢复,当发现有数据片丢失,需要从还存在的数据片中读取数据并尝试恢复,并将恢复得数据写回到硬盘上去。大概所需要做的修改就是这样几个部分。
当EC加入Swift以后,读写流程会有一些变化。当写入数据时,其会被切片,一部分数据加一部分较验,这些块通过Ring分散到后端的存储节点上。然后当去读的时候,首先去找原始数据切片,如果全部都在,则合并数据并返回给Client;如果发现有数据片丢失的情况,需要通过校验码恢复原始数据片,再把重新拼起来。
总结来说,对象存储是云计算及大数据的关键技术。纠删码(Erasure code)技术可以有效降低在分布式存储的成本支出。同时,Swift作为OpenStack核心项目得到越来越多的重视。英特尔也在同开源社区通力合作帮助OpenStack Swift纠删码的更好实现。(阿明)