APP下载

数字图书馆数据存储系统性能优化

2015-10-15

科技传播 2015年2期
关键词:版本号存储系统磁盘

宋 凯

中国传媒大学文科科研处,北京 100024

0 引言

现代化高校的数字图书馆改变传统的纸质媒体的信息查看和传播方式而借助于网络信息技术,传播各种以数字多媒体为存储单位的知识、文献信息,电子文献资源、教师课件、课程视频等。数字图书馆是用数字技术处理和存储各种图文并茂文献的图书馆,实质上是一基于种多媒体的信息分享系统。通过数字图书馆所提供的搜索功能,提高了读者检索资源的效率;同时,通过数字图书馆提供的web端、移动端等相关应用平台极大的提高了读者的访问便利度。数字图书馆需要大量的磁、光、电等新型存储媒介来存储文本、图像、声音、动画、影视作品等文献信息资源的数字化信息[1]。海量数据信息的存储和管理是数字图书馆的显著特征之一。数字图书馆数据信息资源的种类、数量、性质及其使用方式等均对读者访问的性能、资源的传输速度、可靠性等方面起着决定性的作用。数字图书馆具有系统用户数量庞大,并发存取海量数据及业务类型多的特点。

数字图书馆的数据信息种类繁多,形式复杂多样,数据的重要性程度不一,数据访问方式各异,因而不同的数据类型则对读写性能等方面有不同的要求[1]。大文件的顺序读写,如视频数据等多媒体资源,读写数据量很大,要求数据存储吞吐量性能高。小文件随机读,如数字期刊、数字图书等,资源访问频率很高,下载流量也比较大,对存储系统的IOPS要求很高。因此如何在复杂的数据环境中提升存储系统的I/O性能以满足数字图书馆各种数据访问的要求是一个急需要解决的问题。

因此,针对上述问题本文提出一种适用于数字图书馆应用环境的存储系统性能优化方法KVCache,其基本原理为将最近访问的文件保持在由高速非易失性存储介质组成的缓存层中,下次访问相同的文件数据时则不需要再访问低速的磁盘,直接从缓存层中得到,以获得较高的 I/O 性能。该优化方法的特点主要包含以下方面:

1)采用非易失性高速存储设备,例如SSD,作为存储系统的缓存层存储介质,充分保障数据在各种应用环境下的性能[8]。

2)采用Key-Value技术实现了缓存的持久化存储,提升了存储系统的访问性能。

3)利用多级存储下的两段更新事务原子性管理,在提升存储系统I/O性能的前提下,保证多级存储数据一致性和可靠性。

1 相关研究

目前缓存对于缓存的研究主要集中在通用块层。

FlashCache是Linux内核中的一种磁盘缓存实现模块,于2010年由Facebook公司开发,FlashCache的具体实现,将请求IO以一定的哈希映射关系同时映射到闪存设备和磁盘设备中。并在读写路径中,先请求闪存设备,再请求磁盘设备,从而实现了使用闪存设备对传统磁盘进行缓存的设计。磁盘与闪存之间的映射,FlashCache使用了对磁盘以及闪存逻辑上进行条带化,哈希映射的方式完成[5]。

BCache作为同样实现在Linux内核中的一种磁盘缓存实现,其则是基于通用块层实现的,与FlashCache不同,其实现与IO调度层之上,可以使用更少的设备来缓存整个存储子系统的数据。同时,由于其实现于通用块层,BCache可以有效利用闪存设备对随机IO读写的优异性能,将随机IO组合为顺序IO再写入传统磁盘中,大大增加了磁盘的读写能力。

块存储方案用于实现持久化缓存,可以将缓存模型简化,也是传统缓存模型常用的解决方案。使用块存储接口调用持久化缓存设备,可以将设备直接与内存中的缓存块相映射,从而快速索引持久化设备中的缓存数据。然而此方式的缺点是,由于块存储方案存储流程非常简单,通过对内核的系统调用实现数据的存取,如果在写入过程中阻塞等待内核块接口的完成回调则损失了缓存性能,而如果不阻塞等待则无法达到第一阶段写事务的原子性和可靠性要求[2]。

而基于Key-Value的方式则很好地解决了块存储方案的缺点。Key-Value的方式可以很好地完成内存与磁盘设备的映射过程,因而逻辑视图上对于持久化缓存项和内存缓存项的映射规则简单,模型类似块存储缓存方案;而对于更新操作的一致性和可靠性以及性能特点,又可以超越块存储缓存方案。

2 KVCache的实现

KVCache的实现主要包括:key-Value原子更新策略、缓存数据分布与置换策略。

当更新I/O请求到达时,需要将I/O请求通过分割成多个细颗粒度的对象请求,并且为每个对象请求将创建一个更新事务,如图1所示。

第一阶段的写事务将对象请求更新提交到保存在内存中的缓存目录,并同时提交到内存缓存。完成对内存缓存的更新后,又将根据更新的缓存目录,将缓存写入到持久化缓存设备中。

第二阶段的写事物则是待Flush线程达到某个预设值时,将本地缓存写回到后端存储设备中。为了保证第二阶段写事务的可靠性和一致性,需要在第一阶段写事务完成后,以日志形式将该事务记录在持久化缓存中,并在第二阶段写事务完成后将该日志删除。

2.1 key-Value原子更新

KVCache中使用LevelDB作为持久化缓存接口,将对象缓存数据合并成可以并行读写,快速索引的磁盘数据因而本文选择使用键值对存储方案LevelDB来完成系统对数据的持久化缓存[4]。

LevelDB是一个开源的键值对存储方案,其使用LSM树对数据进行存储,并利用内存暂存区设计优化了写性能,通过将内存中数据和持久化后数据进行多级存储,简化了索引对内存产生的开销。同时,由于LevelDB本身的键值对语义与内存缓存使用的map语义十分契合,减少了存储接口转换带来的开销。

图2为KVCache对于更新请求结合LevelDB所进行的数据流图。为了提高数据写入性能,LevelDB对缓存持久化的操作其实是一个异步事务。也就是图中看到当写操作写入LevelDB的memtable中后,并不是立刻会被写入LevelDB SSTable。LevelDB 会将多个更新操作进行合并和等待到某预设值到达,才将数据写入imm_memtable,并分级存储到SSTable中。但是由于LevelDB本身的事务原子性管理,系统可以完全假设当数据写入LevelDB的memtable时,即完成了对持久化缓存的写入事务,因而系统可以向系统提交缓存更新成功响应。

图2 单节点多级缓存更新事务处理流程

本文设计了缓存目录,用于记录与管理所有的缓存数据。缓存目录只用于记录缓存的最新版本号,本地版本号,后端版本号以及所在位置。缓存目录主要结构如表1所示。

通过版本号记录更新事务的状态以及是否可提供读操作。写请求映射到缓存目录后,最新缓存版本号(version)首先被更新,从而表明该缓存有更新的数据将存入,而其余本地版本号(lversion)以及后端版本号(bversion)不同则标记了该写事务并未完成,如图3所示。由于KVCache基于内存缓存与持久化缓存进行两级缓存,所以当写事务已成功提交给内存缓存与持久化缓存时,第一阶段写事务已完成。对于后端的写提交为一个新的写事务,通过异步写操作执行。当提交给后端的写操作完成后,缓存目录的后端版本号更新至提交该操作时的最新缓存版本号。缓存更新事件在任一状态时失败,则可以通过缓存目录有效回滚回上一个状态点,且重新执行该写事务,保证了更新事务的原子性。

图3 缓存目录项状态转换

2.2 数据分布与置换策略

由于缓存设备的空间有限,且内存存储空间远小于持久化设备的缓存空间,当缓存空间不足时的换出策略则变成多级缓存的另一个重要问题。KVCache中内存缓存与持久化缓存之间采用直写策略。持久化缓存到后端采用写回策略。

KVCache使用LRU(Latest Recent Update)替换算法来完成在缓存空间不足时的剔除管理。

由于目录缓存记录了所有在缓存中的数据,因而系统在对象缓存数据被内存缓存LRU换出后,并不需要因此对缓存目录进行修改;而当持久化缓存设备空间不足时,系统则需要修改缓存目录。

KVCache通过LRU类来记录存储在内存缓存中的所有对象缓存项指针以及保存在缓存目录中的所有指针。LRU类以被更新时间作为视图,记录被定义为LRU对象的指针列表。通过该方式,只需要在每次更新内存缓存与更新缓存目录时,通过将LRU指针列表中该项提到列表顶部,则在空间不足时,只需要将LRU对象底部指针指向的数据在缓存中删除则完成了系统的缓存替换算法。

2.3 实验与评估

实验环境基于SAN的架构,存储设备中采用8GB的内存,使用40GB的SSD作为KVCache的持久化缓存[3][6][7]。SAN与应用服务器采用1Gb以太网进行互联。测试模拟在数字图书馆的应用环境下的流媒体文件的顺序读写和小文件的随机读写为主的数据访问方式。

读写性能对比测试见图4。

实验结果表明,在使用了KVCache的存储系统中,所有压力测试节点的顺序读带宽总和为111MB/s,顺序写带宽为113MB/s,基本接近千兆网卡传输上限。

小文件的随机读写模拟测试通过二组数据完成:(a) 没有加入缓存系统随机读写测试。(b) 使用300G空间进行持久化缓存随机读写测试。(c) 使用16G内存空间进行缓存随机读写测试。

图4 顺序读写带宽

图5 随机写性能比较

图5为模拟随机小文件写性能测试结果。横坐标为不同的客户节点,纵坐标为每一个VM使用IOSTAT获取到的IOPS。通过对于总的IOPS计算发现,内存缓存与SSD缓存得到了几乎相同的IOPS数。由于使用内存作为缓存的过程中,系统内存空间上限为16G,所以仅使用10G内存空间作为缓存。而系统的持久化缓存策略与内存缓存策略均使用写回方式,因而内存缓存和持久化缓存获得了几乎相同的每秒吞吐量。同时可以看出由于KVCache使用了高速SSD进行缓存,I/O请求在一定范围内均在SSD中命中,因而全面提升随机I/O的性能,可以看到其拥有几乎仅使用HDD作为后端9倍的吞吐量。

图6 随机读性能比较

如图6模拟随机小文件读性能上,KVCache使用SSD作为持久化缓存后的性能优势更明显。实验结果可见,由于KVCache使用SSD作为缓存,并且采用Keyvalue的方式进行缓存数据的更新,使得其随机读总带宽达到26.11MB/s,其读写性能基本上达到了内存读的性能。

3 结论

针对高校数字图书馆的多样化数据访问的应用环境,提出了适用于数字图书馆应用环境的存储系统性能优化方法KVCache,包括key-Value原子更新策略和数据分布与置换策略等内容。KVCache利用SSD闪存设备和key-Value技术实现缓存数据的缓存持久化存储,并且利用多级存储下的两段更新事务原子性管理,保证多级存储数据一致性和可靠性。

通过模拟实验表明KVCache有效的增加了存储系统中的数据在顺序读写、随机读写下的性能,并且使其随机读写性能接近本地内存读写性能。

[1]黎春兰,邓仲华.信息资源视角下云计算面临的挑战[J].图书与情报,2011(3):23-28.

[2]Fred Douglis and John K. Ousterhout. Beating the I/O bottleneck: A case for logstructured files systems. Technical Report UCB/CSD 88/467, Universityof California, Berkeley, October 1988.

[3]Howard Gobioff, Garth Gibson, and Doug Tygar. Security for network attached storage devices.Technical Report TR CMU-CS-97-185, Carniege Mellon,October 1997.

[4]LevelDB. leveldb: A fast and lightweight key/value database library by Google.

[5]Alex Robson. Consistent Hashing. http://sharplearningcurve.com/blog/2010/09/27/consistenthashing/,September 2010.

[6]T. Clark.Designing Storage Area Networks: A Practical Reference for Implementing Fibre Channel and IP SANS (Second Edition). Addison-Wesley Networking Basics Series, 2003.

[7]D. Nagle, G. Ganger, J. Butler, et al.Network Support for Network-Attached Storage. In:Proceedings of Hot Interconnects. 18-20, 1999.

[8]Kim Y, Gupta A, Urgaonkar B, et al.Hybridstore: A cost-efficient, high-performance storage system combining SSDs and HDDs[C]//Modeling,Analysis & Simulation of Computer and Telecommunication Systems (MASCOTS), 2011 IEEE 19th International Symposium on. IEEE, 227-236. 2011.

猜你喜欢

版本号存储系统磁盘
ETCS基线3的系统版本管理方法
分布式存储系统在企业档案管理中的应用
天河超算存储系统在美创佳绩
修改磁盘属性
认识vSphere安装程序
磁盘组群组及iSCSI Target设置
创建VSAN群集
华为震撼发布新一代OceanStor 18000 V3系列高端存储系统
一种基于STM32的具有断电保护机制的采集存储系统设计