Haystack[转]业内公认难题,如何解决小文件存储

https://code.facebook.com/posts/685565858139515/needle-in-a-haystack-efficient-storage-of-billions-of-photos/ http://www.sohu.com/a/112191770_222486 作者简介 陈闯,花名“战士雷欧”,白山云科技超级攻城狮。 Linux内核、nginx模块、存储架构开发老司机,7年以上存储架构、设计及开发经验,先后就职于东软、中科曙光、新浪、美团,擅长独立进行Haystack、纠删码等各种项目研发,爱好不断降低IO、挑战冗余度底线。白山滑板车选手专业十级,会漂移,正积极备战方庄街道第6届动感滑板车运动会,家庭梦想是为爱妻赢得无硅油洗发水。 正文 背景: 当今互联网,数据呈现爆炸式增长,社交网络、移动通信、网络视频、电子商务等各种应用往往能产生亿级甚至十亿、百亿级的海量小文件。由于在元数据管理、访问性能、存储效率等方面面临巨大的挑战,海量小文件问题成为了业界公认的难题。 业界的一些知名互联网公司,也对海量小文件提出了解决方案,例如:著名的社交网站Facebook,存储了超过600亿张图片,专门推出了Haystack系统,针对海量小图片进行定制优化的存储。 白山云存储CWN-X,针对小文件问题,也推出独有的解决方案,我们称之为Haystack_plus。该系统提供高性能数据读写、数据快速恢复、定期重组合并等功能。 Facebook的Haystack简介: Facebook的Haystack对小文件的解决办法是合并小文件。将小文件数据依次追加到数据文件中,并且生成索引文件,通过索引来查找小文件在数据文件中的offset和size,对文件进行读取。 Haystack的数据文件部分: Haystack的数据文件,将每个小文件封装成一个needle,包含文件的key、size、data等数据信息。所有小文件按写入的先后顺序追加到数据文件中。 Haystack的索引文件部分: Haystack的索引文件保存每个needle的key,以及该needle在数据文件中的offset、size等信息。程序启动时会将索引加载到内存中,在内存中通过查找索引,来定位在数据文件中的偏移量和大小。 面临的问题: Facebook的Haystack特点是将文件的完整key都加载到内存中,进行文件定位。机器内存足够大的情况下,Facebook完整的8字节key可以全部加载到内存中。 但是现实环境下有两个主要问题: 1.存储服务器内存不会太大,一般为32G至64G; 2.小文件对应的key大小难控制,一般选择文件内容的MD5或SHA1作为该文件的key。 场景举例: 一台存储服务器有12块4T磁盘,内存为32GB左右。 服务器上现需存储大小约为4K的头像、缩略图等文件,约为10亿个。 文件的key使用MD5,加上offset和size字段,平均一个小文件对应的索引信息占用28字节。 在这种情况下,索引占用内存接近30GB,... Read More | Share it now!