存储技术
海量小文件是业界难题,甚至有专门的名词,LOSF(lots of samll file)。通常我们认为大小在1MB以内的文件称为小文件,百万级数量及以上称为海量文件,由此量化定义海量小文件。
在互联网(尤其是移动互联网)、物联网、云计算、大数据等高速发展的大背景下,数据呈现爆炸式地增长。海量小文件的应用在生活中已越来越常见,社会化网络、移动通信、网络视频音频、电子商务、传感器网络、科学实验等各种应用产生的数据,不仅存储容量巨大,而且数据类型繁多、数据大小变化幅度大、流动快等显著特点,往往能够产生千万级、亿级甚至十亿、百亿级的海量小文件。如何构建高效存储访问和备份恢复的小文件管理是目前海量数据存储所面临的一个重要问题。
对于LOSF而言,IOPS/OPS是关键性能衡量指标,造成性能和存储效率低下的主要原因包括海量文件的元数据管理、存储介质性能限制等方面。
元数据来说,虽然小文件得数据量小,但是每个数据的元数据量不变。导致文件系统的元数据量非常庞大,因此元数据对于小文件得访问效率影响非常大。磁盘文件系统使用块来组织磁盘数据,并在inode中存储索引文件数据块。数据块通常比较小,一般为1KB、2KB或4KB。
当文件需要存储数据时,文件系统根据预定的策略分配数据块,分配策略会综合考虑数据局部性、存储空间利用效率等因素,通常会优先考虑大文件I/O带宽。对于特别小的小文件,比如小于4KB,inode与数据分开存储,这种数据布局也没有充分利用空间局部性,导致随机I/O访问。
SSD无疑是从存储介质层面提升海量小文件存储性能的利器。单盘几万的IOPS,甚至采用nvme协议后能达到单盘几十万的IOPS,高IOPS能非常好的提升海量小文件检索效率。奈何SSD价格还是高高在上,无法大规模普及。但随着NAND flash的发展,SSD取代机械硬盘是肯定的事。
但是光从存储介质层面入手还不能完全解决问题。由于目前的文件系统往往是针对大文件设计的,比如ext3,btrfs,ntfs等文件系统在大文件时表现往往可以,但是海量小文件场景时性能也会出现下降。这种情况其实是文件系统跟不上硬件的性能,只有针对海量小文件做了特殊优化的文件系统配合高性能的SSD才能够更好的解决该问题。
对象存储是近几年新发展出来的全新存储使用协议。对象存储最明显的特点就是,一般无用户使用界面,不像常见的posix协议的文件系统可以直接操作文件。用户存储文件和获取文件采用url的方式。可以比如,存储一个数据的时候用put,获取用get。对象存储不像文件系统一样可以无缝兼容各种业务程序,而是需要业务程序调整自己的读写接口为对象标准,从而给实际落地应用带来了一定的门槛。
对象存储,也叫做基于对象的存储,是用来描述解决和处理离散单元的方法的通用术语,这些离散单元被称作为对象。就像文件一样,对象包含数据,但是和文件不同的是,对象在一个层结构中不会再有层级结构。每个对象都在一个被称作存储池的扁平地址空间的同一级别里,一个对象不会属于另一个对象的下一级。
比如Ceph通过Crush算法做数据分布。不使用文件系统时,系统无需配置元数据服务(MDS),这时系统无需管理庞大的元数据,避免了元数据服务成为瓶颈;但是由于机械硬盘的本身限制,往往在使用的时候,都会配置SSD盘作为缓存盘提供系统整体IOPS。同时业务系统也得由于使用对象存储系统而修改IO读写的访问接口,这对于很多用户来说是很难以接受的方案。
文件系统作为平常最常见的存储方式,还是受广大的用户喜欢。但是传统NAS具有机头瓶颈,海量小IO的并发下性能会很差。分布式存储发展起来后,通过横向扩展,方便的解决传统存储带来的瓶颈问题。一般来说文件系统一定需要元数据,每次数据的读写都会涉及到元数据的访问或者修改。所以元数据服务器的还是会成为分布式文件系统处理海量小文件时的瓶颈。
随着数字世界的不断庞大,海量小文件场景越来越常见。我们也看到业界很多产品通过各种方式的优化,支持百亿级别的数据访问。但是LOSF问题是公认的难题,需要针对不同的业务场景进行专门的优化,一个产品没法吃遍天下。
全部0条评论
快来发表一下你的评论吧 !