Thursday, October 15, 2015

LOSF(lots of small files) - MogileFS



http://blog.csdn.net/liuaigui/article/details/9981135
目前的文件系统,包括本地文件系统、分布式文件系统和对象存储系统,都是主要针对大文件设计的,比如XFS/EXT4、Lustre、GlusterFS、GPFS、ISLION、GFS、HDFS,在元数据管理、数据布局、条带设计、缓存管理等实现策略上都侧重大文件,而海量小文件应用在性能和存储效率方面要大幅降低,甚至无法工作。针对LOSF问题,出现一些勇敢的挑战者。EXT4主要对EXT3进行了两方面的优化,一是inode预分配,这使得inode具有很好的局部性特征,同一目录文件inode尽量放在一起,加速了目录寻址与操作性能。因此在小文件应用方面也具有很好的性能表现。二是extent/delay/multi的数据块分配策略,这些策略使得大文件的数据块保持连续存储在磁盘上,数据寻址次数大大减少,显著提高I/O吞吐量。因此,EXT4对于大小文件综合性能表现比较均衡。Reiserfs对小文件作了优化,并使用B* tree组织数据,加速了数据寻址,大大降低了open/create/delete/close等系统调用开销。Reiserfs的tail package功能可以对一些小文件不分配inode,而是将这些文件打包,存放在同一个磁盘分块中。对于小于1KB的小文件,Rerserfs可以将数据直接存储在inode中。因此, Reiserfs在小文件存储的性能和效率上表现非常出色。Facebook 推出了专门针对海量小文件的文件系统Haystack,通过多个逻辑文件共享同一个物理文件、增加缓存层、部分元数据加载到内存等方式有效的解决了Facebook海量图片存储问题。淘宝推出了类似的文件系统TFS(Tao File System),通过将小文件合并成大文件、文件名隐含部分元数据等方式实现了海量小文件的高效存储。FastDFS针对小文件的优化类似于TFS。国防科学技术大学对Lustre进行了小文件优化工作,在OST组件中设计并实现了一种分布独立式的小文件Cache结构:Filter Cache,通过扩展Lustre的OST端的数据通路,在原有数据通路的基础上,增加对小对象I/O的缓存措施,以此来改善Lustre性能。

衡量存储系统性能主要有两个关键指标,即IOPS和数据吞吐量。
影响磁盘的关键因素是磁盘I/O服务时间,即磁盘完成一个I/O请求所花费的时间,它由寻道时间、旋转延迟和数据传输时间三部分构成。因此可以计算磁盘的IOPS= 1000 ms/ (Tseek + Troatation + Ttransfer),如果忽略数据传输时间,理论上可以计算出磁盘的最大IOPS。当I/O访问模式为随机读写时,寻道时间和旋转延迟相对于顺序读写要明显增加,磁盘IOPS远小于理论上最大值。定义有效工作时间Pt=磁盘传输时间/磁盘I/O服务时间,由此可知随机读写单个文件效率要低于连续读写多个文件。对于磁盘文件系统来说,无论读写都存在元数据操作。以EXTx文件系统写数据为例,向磁盘写入数据进行大量的元数据操作,包括更新inode目录、目录、inode和数据块位图等。定义有效数据读写率Pd=所需数据/实际磁盘读写数据,其中实际磁盘读写数据为磁盘元数据与所需数据之和。当操作连续大文件时,对元数据的操作开销可被庞大的数据操作开销分摊,但小文件的有效读写率小于大文件的,当小文件数量急剧增加时,对大量元数据的操作会严重影响系统的性能。

(1)  元数据管理低效
磁盘文件系统中,目录项(dentry)、索引节点(inode)和数据(data)保存在存储介质的不同位置上。因此,访问一个文件需要经历至少3次独立的访问。这样,并发的小文件访问就转变成了大量的随机访问,而这种访问对于广泛使用的磁盘来说是非常低效的。同时,文件系统通常采用Hash树、 B+树或B*树来组织和索引目录,这种方法不能在数以亿计的大目录中很好的扩展,海量目录下检索效率会明显下降。正是由于单个目录元数据组织能力的低效,文件系统使用者通常被鼓励把文件分散在多层次的目录中以提高性能。然而,这种方法会进一步加大路径查询的开销。

(2)  数据布局低效

磁盘文件系统使用块来组织磁盘数据,并在inode中使用多级指针或hash树来索引文件数据块。数据块通常比较小,一般为1KB、2KB或4KB。当文件需要存储数据时,文件系统根据预定的策略分配数据块,分配策略会综合考虑数据局部性、存储空间利用效率等因素,通常会优先考虑大文件I/O带宽。对于大文件,数据块会尽量进行连续分配,具有比较好的空间局部性。对于小文件,尤其是大文件和小文件混合存储或者经过大量删除和修改后,数据块分配的随机性会进一步加剧,数据块可能零散分布在磁盘上的不同位置,并且会造成大量的磁盘碎片(包括内部碎片和外部碎片),不仅造成访问性能下降,还导致大量磁盘空间浪费。对于特别小的小文件,比如小于4KB,inode与数据分开存储,这种数据布局也没有充分利用空间局部性,导致随机I/O访问,目前已经有文件系统实现了data in inode。



3.1硬件优化
硬件设备在性能上要做到匹配,尤其是磁盘和网络,否则容易导致性能瓶颈或者成本浪费

3.2Cache管理
Cache技术广泛应用于存储系统的各个领域,比如CPU L1/L2 Cache、文件系统、分布式存储系统等。Cache技术主要通过空间换时间的策略,利用数据访问的时间和空间局部性,尽量提高数据访问的缓存命中率,从而提高系统的性能。存储系统中的Cache位于最低层存储介质之上,其中缓存了应用程序需要的数据子集。对子集中的数据的读写先在Cache中异步进行,然后异步存储到低层稳定的介质上。Cache技术通过这种异步的数据I/O模式来解决程序中的计算速度和数据存储速度不匹配的鸿沟,减少了访问底层存储介质的次数,使存储系统的性能大大提高。增大Cache容量可以缓存更多的数据,减小cache的容量失效,从而显著提高Cache命中率。但cache的命中率并不随着容量呈线性增长,当cache容量达到一定阈值时,再增大容量命中率并不会显著提高,因此要根据成本和实际需要来选择cache容量。

对于小文件,可以根据局部性原理和I/O访问行为,预测最近可能访问的文件集合,提前预读到Cache系统中,通过减少文件读取时间提高存储系统性能。许多系统把数据访问请求当作是独立的事件,实际上数据请求并非完全随机,而是由用户或程序的行为驱动的,存在特定的访问模式。而这种模式常常被缓存系统所忽略。预取是主动缓存技术,它利用了数据的空间局部性,对将来可能发生的数据请求进行预测,在访问之前取出并缓存,以备用户访问,从而减少访问延迟。预测技术主要通过对数据本体或历史访问记录的分析,构造合适的预测模型,据此对未来的访问进行预测。用户执行应用程序去访问数据,连续访问的不同文件之间必然存在一定的关联。当用户以先前大致相同的顺序去请求数据时,或多或少会访问相同的文件集合,尤其对同一个用户来说。正确的预测可以提高系统的性能,而错误的预测不仅会造成缓存空间和I/O带宽的浪费,而且会增加正常访问的延时。

3.3     小文件合并存储

小文件合并存储是目前优化LOSF问题最为成功的策略,已经被包括Facebook Haystack和淘宝TFS在内多个分布式存储系统采用。它通过多个逻辑文件共享同一个物理文件,将多个小文件合并存储到一个大文件中,实现高效的小文件存储。为什么这种策略对LOSF效果显著呢?

首先,减少了大量元数据。通过将大量的小文件存储到一个大文件中,从而把大量的小文件数据变成大文件数据,减少了文件数量,从而减少了元数据服务中的元数据数量,提高了元数据的检索和查询效率,降低了文件读写的I /O操作延时,节省了大量的数据传输时间。LOSF元数据开销所占比重大,大幅减少元数据,将直接导致性能的显著提升。合并后的大文件存储在磁盘文件系统之上,同时也大大降低了磁盘文件系统在元数据和I/O方面的压力,这点可以改善每个节点的存储性能。小文件的元数据和数据会一并存储在大文件中,并形成索引文件,访问时通过索引进行定位。索引文件采用预加载到Cache的策略,可以实现随机读写小文件只需要一次I/O。

其次,增加了数据局部性,提高了存储效率。磁盘文件系统或者分布式文件系统中,文件的元数据和数据存储在不同位置。采用合并存储机制后,小文件的元数据和数据可以一并连续存储大文件中,这大大增强了单个小文件内部的数据局部性。小文件合并过程中,可以利用文件之间的空间局部性、时间局部性以及关联,尽量将可能连续访问的小文件在大文件中进行连续存储,增强了小文件之间的数据局部性。这直接降低了磁盘上随机I/O比率,转换成了顺序I/O,能够有效提高I/O读写性能。另外,小文件单独存储会形成外部和内部碎片,而合并存储后存储碎片将大大降低,这极大提高了LOSF存储效率。

再次,简化了I/O访问流程。采用小文件合并存储后,I/O访问流程发生了极大变化,主要体现在存储节点磁盘文件系统上。根据之前的阐述,磁盘文件系统读写一个小文件,最大的系统消耗在open系统调用,需要进行路径查找do_path_lookup,将路径名进行分量解析,转换成对应文件在内核中内部表示。这个过程非常占用系统开销,尤其是深目录下的文件。而经过合并,很多小文件共享一个大文件,open操作转换成了开销小很多的seek操作,根据索引定位到大文件内部相应位置即可,也不需要在内核中创建相关VFS数据对象,这节省了原先绝大部分的系统开销。

大文件加上索引文件,小文件合并存储实际上相当于一个微型文件系统。这种机制对于WORM(Write Once Read Many)模式的分布式存储系统非常适合,而不适合允许改写和删除的存储系统。因为文件改写和删除操作,会造成大文件内部的碎片空洞,如果进行空间管理并在合适时候执行碎片整理,实现比较复杂而且产生额外开销。如果不对碎片进行处理,采用追加写的方式,一方面会浪费存储容量,另一方面又会破坏数据局部性,增加数据分布的随机性,导致读性能下降。此外,如果支持随机读写,大小文件如何统一处理,小文件增长成大文件,大文件退化为小文件,这些问题都是在实际处理时面临的挑战。

3.4元数据管理优化

分布式存储系统架构大致分两种,即有中心架构和无中心架构。在有中心架构的分布式存储系统中,通常有一个元数据服务器MDC来统一管理元数据。而在无中心的架构中,元数据会分散存储于各个存储节点上,通过一致性Hash等算法进行管理和定位。客户端在读写小文件数据之前,需要通过与MDC或存储节点进行通信获取位置信息,这一过程相当于额外增加一次网络传输开销和元数据服务访问开销。这对小文件I/O来说,开销影响非常大,尤其是对于延迟较大的网络而言。因此,元数据管理优化主要从减少元数据量、减少元数据访问次数、提高元数据检索效率等几个方面着手。

对于单个小文件,元数据包括位置信息、名称、guid、属主、大小、创建日期、访问日期、访问权限等信息。在分布式存储系统中,根据访问接口和语义需要,可以对元数据进行精简,保留足够的元数据即可,从而达到减少元数据的目的。比如,TFS/FastDFS通过在文件命名中隐含位置信息等部分元数据,对象存储系统可以不需要访问日期、访问权限等元信息,从而节省了元数据量。这带来的好处是,可以减少元数据通信延迟,相同容量的Cache可以缓存更多的元数据,从而提高元数据的访问效率。

前面刚刚提到TFS/FastDFS在文件名中隐含了位置信息,无需与MDC或存储节点交互就能够对文件进行定位,减少了一次元数据访问。元数据操作在小文件整个I/O过程占了大部分时间,对于大量并发元数据操作,可以对多个RPC请求进行合并,从而大幅减少元数据访问次数。最为重要的,可以在客户端对元数据进行缓存,利用Cache中元数据访问的时间局部性,结合预读策略, 显著减少元数据访问次数。每一次元数据访问都会产生可观的网络开销,因此降低元数据访问次数,能够有效提高元数据操作效率。

在MDC上或者存储节点上,元数据最终持久化存储在数据库、KV存储系统、磁盘文件系统目录上,甚至是单个文件中。同时,为了提高访问性能,会将部分或者全部元数据缓存在Cache中。为了达到高效的元数据检索,需要考虑大容量内存和快速磁盘(比如SAS磁盘或SSD),Cache系统采用可扩展性Hash等高效数据结构组织缓存的元数据。同时,还可以通过多级索引、BloomFilter等减少元数据操作过程的I/O访问次数,进一步加快元数据访问速度。


MogileFS是一个开源的分布式文件系统。主要特性包括:应用层的组件、无单点故障、自动文件复制、具有比RAID更好的可靠性、无需RAID支持等……核心角色如下:
       tracker节点:借助数据库保存各节点文件的元数据信息保存每个域中所有键的存储位置分布,方便检索定位数据位置的同时监控各节点,告诉客户端存储区位置并指挥storage节点复制数据副本,进程名为mogilefsd(7001)。
       database节点为tracker节点提供数据存取服务。
       storage节点:将指定域中的键转换为其特有的文件名存储在指定的设备文件中,转换后的文件名为值,storage节点自动维护键值的对应关系,storage节点由于使用http进行数据传输,因此依赖于perlbal,storage节点前端可以使用nginx进行反向代理,但需要安装nginx-mogilefs-module-master模块进行名称转换,进程名mogstored(7501),perbal(7500)
       Domain一个域中的键值是惟一的,一个MogileFS可以有多个域,域可以用来存储不同应用类型的数据的容器。
       Host每一个存储节点称为一个主机,一个主机上可以有多个存储设备(单独的硬盘),每个设备都有ID号,Domain+Fid用来定位文件。
       Class:复制最小单位,文件属性管理,定义文件存储在不同设备上份数。
       流程图如下:
032539679.png
       1、应用层发起GET请求到Nginx。
       2、Nginx根据负载均衡机制随机代理到后台Node one。
       3、Node one向从服务器发起查询请求。
       4、从服务器返回查询结果。
       5、Node one将查询结果返回给Nginx。
       6、Nginx将查询结果根据模块转换为合理的url方位Node three。
       7、Node Three将文件内容通过http协议返回给Nginx。
       8、Nginx将结果返回给应用层的请求。
   2.MogileFS特性
     1) 应用层提供服务,不需要使用核心组件
     2)无单点失败,主要有三个组件组成,分为tracker(跟踪节点)、mogstore(存储节点)、database(数据库节点)
     3)自动复制文件,复制文件的最小单位不是文件,而是class
     4)传输中立,无特殊协议,可以通过NFS或HTTP实现通信
     5)简单的命名空间:没有目录,直接存在与存储空间上,通过域来实现
     6)不用共享任何数据
   3.MogileFS的组成
     1)Tracker--跟踪器,调度器
        MogileFS的核心,是一个调度器,mogilefsd进程就是trackers进程程序,trackers的主要职责有:删除数据、复制数据、监控、查询等等.这个是基于事件的( event-based ) 父进程/消息总线来管理所有来之于客户端应用的交互(requesting operations to be performed), 包括将请求负载平衡到多个"query workers"中,然后让 mogilefs的子进程去处理.
       mogadm,mogtool的所有操作都要跟trackers打交道,Client的一些操作也需要定义好trackers,因此最好同时运行多个trackers来做负载均衡.trackers也可以只运行在一台机器上,使用负载均衡时可以使用搞一些简单的负载均衡解决方案,如haproxy,lvs,nginx等,
       tarcker的配置文件为/etc/mogilefs/mogilefsd.conf,监听在TCP的7001端口
     2)Database--数据库部分
         主要用来存储mogilefs的元数据,所有的元数据都存储在数据库中,因此,这个数据相当重要,如果数据库挂掉,所有的数据都不能用于访问,因此,建议应该对数据库做高可用
     3)mogstored--存储节点
       数据存储的位置,通常是一个HTTP(webDAV)服务器,用来做数据的创建、删除、获取,任何 WebDAV 服务器都可以, 不过推荐使用 mogstored . mogilefsd可以配置到两个机器上使用不同端口… mogstored 来进行所有的 DAV 操作和流量,IO监测, 并且你自己选择的HTTP服务器(默认为 perlbal)用来做 GET 操作给客户端提供文件.
  4.基本工作流程
   应用程序请求打开一个文件 (通过RPC 通知到 tracker, 找到一个可用的机器). 做一个 “create_open” 请求.
   tracker 做一些负载均衡(load balancing)处理,决定应该去哪儿,然后给应用程序一些可能用的位置。
   应用程序写到其中的一个位置去 (如果写失败,他会重新尝试并写到另外一个位置去).
   应用程序 (client) 通过”create_close” 告诉tracker文件写到哪里去了.
   tracker 将该名称和域命的名空间关联 (通过数据库来做的)
   tracker, 在后台, 开始复制文件,知道他满足该文件类别设定的复制规则
   然后,应用程序通过 “get_paths” 请求 domain+key (key == “filename”) 文件, tracker基于每一位置的I/O繁忙情况回复(在内部经过 database/memcache/etc 等的一些抉择处理), 该文件可用的完整 URLs地址列表.
   应用程序然后按顺序尝试这些URL地址. (tracker’持续监测主机和设备的状态,因此不会返回死连接,默认情况下他对返回列表中的第一个元素做双重检查,除非你不要他这么做..)
三、Nginx+mogilefs的实现
   1.拓扑图
wKioL1NumHjSeFsZAACZ6ZyV-8Y920.jpg
     说明:1.用户通过URL访问前端的nginx
           2.nginx根据特定的挑选算法,挑选出后端一台tracker来响应nginx请求
           3.tracker通过查找database数据库,获取到要访问的URL的值,并返回给nginx
           4.nginx通过返回的值及某种挑选算法挑选一台mogstored发起请求
           5.mogstored将结果返回给nginx
           6.nginx构建响应报文返回给客户端

http://www.cnblogs.com/xiaocen/p/3721390.html
相对地,在一个分享的磁盘文件系统中,所有节点对数据存储区块都有相同的访问权,在这样的系统中,访问权限就必须由客户端程序来控制。
MogileFS适用于处理海量小文件
Ceph是一个 Linux PB级别的分布式文件系统
MooseFS通用简便,适用于研发能力不强的公司
Taobao Filesystem适用于处理海量小文件
ClusterFS适用于处理单个大文件
Google FilesystemGFS+MapReduce擅长处理单个大文件
Hadoop Distributed FilesystemGFS的山寨版+MapReduce,擅长处理单个大文件
MogileFS 是一个开源的分布式文件系统,用于组建分布式文件集群
   第1个部分: 是server端,包括mogilefsd和mogstored两个程序。前者即是mogilefsd的tracker,它将一些全局信息保存在数据库 里,例如站点domain,class,host等。后者即是存储节点(store node),它其实是个HTTP Daemon,默认侦听在7500端口,接受客户端的文件备份请求。在安装完后,要运行mogadm工具将所有的store node注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。
   第2个部分:是utils(工具集),主要是MogileFS的一些管理工具,例如mogadm等。
   第3个部分:是客户端API,目前只有Perl API(MogileFS.pm)、PHP,用这个模块可以编写客户端程序,实现文件的备份管理功能,提供MogileFS.pm。

http://www.php-oa.com/2010/09/26/perl-mogilefs-1.html

Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts