海量数据的理想存储方案

随着信息化建设的不断深入,企业级的信息管理平台已经完成了从信息化建设到数据积累的职能转变,在一些信息化起步较早、系统建设较规范的行业,如通信、金融、大型生产制造等领域,海量数据的存储、分析需求的迫切性日益明显。

    以移动通信运营商为例,随着移动业务和用户规模的不断扩大,每天都产生海量的业务、计费以及网管数据,然而庞大的数据量使得传统的数据库存储已经无法满足存储和分析需求。主要面临的问题包括:

  1. 数据库容量有限:关系型数据库并不是为海量数据而设计,设计之初并没有考虑到数据量能够庞大到PB级。为了继续支撑系统,不得不进行服务器升级和扩容,成本高昂,难以接受。
  2. 并行取数困难:除了分区表可以并行取数外,其它情况都要对数据进行检索才能将数据分块,并行读数效果不明显,甚至增加了数据检索的消耗。虽然可以通过索引来提升性能,但实际业务证明,数据库索引作用有限。
  3. 针对J2EE应用来说,JDBC的访问效率太低,由于java的对象机制,读取的数据都需要序列化,导致读数速度很慢。
  4. 数据库并发访问数太多,会导致I/O瓶颈和数据库的计算负担太重两个问题,甚至出现内存溢出崩溃等现象,但数据库扩容成本太高。

    理想的解决方案是把大数据存储到分布式文件系统中:

  1. 只要增加机器和硬盘,则容量不限,理论上数据可以无限扩大;
  2. 并行取数容易,由于文件可以根据字节数来访问,可以直接定位从第n字节开始读取,到第m字节读取结束,不存在检索划分数据块的问题;
  3. 不存在IO瓶颈。由于分布式文件系统是把数据存储到不同机器上,并行/并发 读数时,分别从不同的机器读数,有效规避了IO瓶颈问题;
  4. 用java读数时,虽然同样存在序列化的问题,但是避开了JDBC,避免了JDBC带来的性能问题;
  5. 数据计算可以使用单独的计算引擎,计算引擎可部署于廉价的PC上,可以以很低的成本较为容易的实现并行,增加并行节点成本比数据库扩容成本低很多。

    当前比较流行的分布式文件系统包括:Lustre、HDFS、MogileFS、FastDFS、NFS等。

    Lustre是由SUN公司开发、在linux下运行的以C/C++开发的集群并行文件系统,采用分布式的锁管理机制来实现并发控制,元数据和文件数据的通讯链路分开。虽然在性能、可用性和扩展性上有一些优点,但其缺点也同样明显:需要特殊设备的支持,而且分布式的元数据服务器管理还没有实现。

    MogileFS是一个开源的分布式文件系统,主要特点包括:应用层组件、无单点故障、自动文件复制、具有比RAID更好的可靠性、无需RAID nigukefs支持等,缺点包括:用Perl编写,有依赖模块的问题,安装过程中需要其他库和模块的支持,对于不懂perl的人,安装和使用很困难。MogileFS不支持对一个文件内部的随机或顺序读写,不支持视频拖动,因此只适合做一部分应用,如图片服务、静态HTML服务等。另外,MogileFS过度依赖数据库,包括它的高可用性也需要靠数据库的HA实现,官方文档也比较缺乏,没有详细的使用说明。

    FastDFS是一个专用的文件系统,和MogileFS比较类似,需要使用专门的API来访问,不是通用的文件系统,不能mount成path的形式使用。只使用于一些特定的应用领域,比如网站存储图片、视频文件等。

    NFS。优点是:Linux直接在内核予以支持,使用方便,发展多年,比较成熟。缺点:可扩展性差,难以应用于大量存储节点和客户端的集群式(cluster)系统;文件服务器的定位(location)对客户端不透明,维护困难;缓存管理机制采用定期刷新机制,可能会产生文件不一致;不支持数据复制、负载均衡等分布式文件系统的高级特性,很容易出现系统的性能瓶颈;另外,NFS服务器的更换需要系统暂停服务,对于异地服务的支持能力不够。总的来说,NFS太老了,对于追求海量数据吞吐量、存在成千上万个客户端和存储节点的互联网应用来说有点力不从心。

    HDFS是Hadoop的文件系统,其目的是向应用数据提供高吞吐量访问的分布式文件系统,是GFS的开源实现。
其最大的优点包括:无需替换现有系统,而是利用该分布式文件系统增强现有系统的处理能力。一方面,HDFS可以从已有系统上接手海量数据的处理,使已有系统可以专注于其设计目的,如实时交易数据处理、交互式商业智能,这些海量数据处理包括但不限于同步数据吞吐、处理、交换大规模数据等。另一方面,HDFS可以从任意多的数据源吞入任何类型的数据,来自多个数据源的数据可以按任何需要的方式合并或聚合,从而实现任意单一系统无法实现的深度分析。

    HDFS不处理索引和关系,所以在HDFS中存储数据时不用考虑将来如何分析这些数据。在和数据库交互方面,HDFS支持JDBC,而大部分数据库都支持数据的批量导入/导出。所以无论哪种情况,将整个数据库中的数据经常性的或者以增量的方式导入到HDFS中很容易实现。大多数时候,HDFS可以被设计为存储海量数据以及按需要向任意系统传递数据,数据可以经常性地从关系型数据库系统导入到HDFS中,经过这样的调整,关系型数据库可以专门用来处理交互式任务,而复杂的分析工作就可以按离线的方式交由HDFS来完成,对实施系统没有任何影响。
综上所述,海量数据比较理想的存储方案是分布式文件系统,而分布式文件系统中,HDFS是比较理想的一款。

原文地址:https://www.cnblogs.com/zhwl/p/3643398.html