1 引言
?
随着大数据时代的到来,云计算、大数据、物联网、云数据中心以及对虚拟化的进一步应用都是最热门的话题。科技及电子产品日新月异,它们产生的数据出现爆炸性的增长,数据成为企业发展及个人日常生活中关键的资源,如此巨大数据的安全有效存储倍受关注。近年来,基于云平台的数据存储慢慢融入人们生活,目前市场上出现越来越多的网络公司提供各种形式的远端云平台的数据存储。但是这类云存储网络硬盘目前还处于发展阶段,各种技术和相应的法律法规还不够成熟和完善,因此在云端存储数据也存在一些问题。首先,存储容量对于大数据来说是一个永久的话题,供应商提供给用户的免费容量都是有限的,不能达到用户按需存储。其次存储效率问题,为了提高系统可用性和数据访问的性能而不可避免地引发影响存储读写效率等问题。
?
因此,本文提出将Linux系统中广泛使用的网络块设备应用到云存储中,设计一个能够充分利用闲置或廉价设备实现用户按需动态扩容且不影响读写速率的云存储系统。经分析后选取网络块设备作为用户与远程存储磁盘连接的一种方式,采用Hadoop HDFS作为虚拟磁盘后台存储,结合Hadoop HDFS组件的强大功能,该系统能使用户享受到不一样的云存储功能体验。
?
2 网络块设备与Hadoop HDFS
?
2.1 网络块设备
?
网络块设备能够把远程存储设备映射成为本地块设备的虚拟驱动。每次客户端进行读写网络块设备时,网络块设备内核驱动要通过TCP发送相应的请求,服务器端执行请求,并回应给客户端。网络块设备能够在较少的磁盘空间或者没有磁盘空间的机器上,将其他服务器上的闲置空间当做自己的空间使用。和NFS 网络文件系统(Network File System)不同,NFS只是提供一个挂载点供客户端使用,客户端无法改变这个挂载点的分区格式。而Linux下网络块设备能够在虚拟的磁盘上创建任何想要的文件系统。
?
网络块设备结构简单,将远程计算机上的磁盘映射成为一个本地块设备,用户可以通过这个挂载到本地的虚拟块设备实现对远程磁盘的透明访问。客户端和服务器端使用相关协议建立连接,客户端还需要安装内核驱动,实现与服务器端的数据传输。
?
网络块设备主要包括三个部分:网络块设备驱动程序、客户机端进程、服务器端进程。1)网络块设备驱动在客户端,是整个网络块设备的基础,主要负责与本地文件的交互以及给网络发送读写请求。网络块设备的网络传输部分是在TCP的基础上,两端都使用BSD Socket接口进行网络传输。Li-nux系统中可以提供多达256个网络块设备。2)网络块设备客户端不但要和网络块设备驱动打交道,作为响应块读写请求的服务方;另外还要向网络块设备服务器端发送请求,作为服务器端的客户方。客户端的核心对象是nbd_client,自己来完成与驱动层的交互,而将网络传输交给其子对象Stora-geserver来完成,传输通道用对象channel来实现。这样一方面能够使程序更加清晰,另一方面也可以在不同的对象上添加多种功能。3)网络块设备服务器端。服务器端主要的核心对象是nbd_server,由通道对象channel来实现网络传输的,由文件服务器fileserver来实现读写数据集操作。服务器端分三级来实现,第一级进程初始化数据文件集和一些基本参数后进行无限的循环等待,接受来自不同用户的登录。一旦有某一用户登录成功就为之派生出一个第二级进程,该进程派生出若干个第三级线程,然后等待这些线程的完成。线程都结束表示传输完毕,客户端已退出,因此该进程也自行退出。传输线程接收从客户端传来的读写请求,若是读请求,就直接将该请求交给文件服务器对象来处理;若是写请求,则从网络上接受要写的块。再将其交给文件服务器。
?
2.2 Hadoop HDFS
?
Hadoop是Apache基金会旗下的一个开源分布式计算平台。它是以Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)和MapReduce(Google MapReduce的开源实现)为核心,为用户提供了系统底层细节透明的分布式基础架构。HDFS的高容错性、高伸缩性等优点,Hadoop是一个能够让用户轻松架构和使用的分布式计算平台。用户可以轻松地在Hadoop上开发运行处理海量数据的应用程序,它的主要优点包括:
?
1)高可靠性。Hadoop按位存储和处理数据的能力值得信赖。
?
2)高扩展性。Hadoop是在可用的计算机集群间分配数据完成计算任务的,这些集群可以方便地扩展到数以千计的节点中。
?
3)高效性。Hadoop能够在节点之间动态地移动数据,确保各个节点的动态平衡,因此处理速度非常快。
?
4)高容错性。Hadoop能够自动保存数据的多份副本,并且能够自动将失败的任务重新分配。Hadoop的HDFS是一个分布式文件系统。
?
它具有高容错性的特点,因此能够部署在低廉的硬件上。HDFS是典型的主从式结构,整个集群由多个数据节点(DataNode)和一个主节点(NameNode)组成。在HDFS中,NameNode的作用是用来管理文件系统的命名空间。NameNode能够把所有的文件和文件夹的元数据保存在一个文件系统树中,同时还保存了一个文件包含哪些数据块,分布在哪些DataNode上,这些信息都是在系统启动时从DataNode收集到的,并没有在硬盘上进行存储。
?
DataNode在HDFS中是真正存储数据的地方,客户端和NamdNode通过向DataNode发出请求对数据块进行读写操作,而DataNode则周期性的向NamdNode汇报其数据块的相关信息。
?
3 云存储中网络块设备的应用
?
本文将Linux系统中网络块设备模块应用到云存储系统中,实现一个可以供用户远程使用的原则上无限大容量的云存储系统。
?
该系统的客户端包括用户空间和Linux内核空间,客户端需要处理本地网络块设备的文件请求,并经过网络传输到远程的服务器端守护进程。客户端通过Socket机制与服务器建立连接。Socket是面向客户/服务器模型而设计的,是TCP/IP网络的API,针对客户端和服务器端程序提供不同的Socket系统调用。客户端随机申请一个Socket,系统为之分配一个Socket号;服务器端拥有一个自己的Socket,客户端可以向它发出连接请求和信息请求。服务器端启动,服务器端随之启动后台进程,并在某端口进行监听,如果对应的客户端启动,那么它们之间就可以通过Socket来建立连接。
?
当客户端与服务器端连接之后,为了提供可靠的连接服务,在客户端和服务器端都有negotiate()函数,服务器端在这个函数中通过Socket给客户端发送一些验证信息,之后客户端在自己本身的这个negotiate()函数中进行验证,如果一切正确,才会继续接下来的通信。客户端首先要加载网络块设备内核模块,网络块设备内核主要负责维护16个网络块设备节点(/dev/nbd0–/dev/nbd15),创建网络块设备驱动程序,以及向网络块设备服务器端发送请求和接收来自客户端的回应请求。一旦客户端用户空间有请求,就会被放入等待队列,内核空间会根据传递过来的操作类型来创建一个内核线程对等待队列进行相应的处理。
?
服务器端主要的任务是:服务器端与HDFS集群结合,建立数据存储后台、建立与客户端连接、监听客户端、接收由客户端的内核空间发送来的请求,最后根据客户端发出的请求不同,采用对应的处理方式。具体可以四部分:1)主进程。主要作为一个监听的进程,主进程创建TCP套接字、初始化各种参数,然后通过serverloop()函数监听Socket端口。2)处理线程。该线程负责检查连接请求的合法性、与客户端协商参数、为客户端分配相应的数据集和文件集,从而保证客户端的独立性和安全性。3)循环程序。这段循环程序主要任务是不断接受和处理客户端的请求,直到请求为空或者异常出错。4)数据存储模块。数据存储模块主要功能是将服务器处理完的数据进行存储。本文的后台存储是基于HDFS的,因此这些数据都将存储到HDFS分布式文件系统中。
?
HDFS采取的并行扩容的方式,动态扩展能力高。传统的存储设备一般使用的是串行扩容方式,这样扩展能力很有限。然而HDFS采用的是并行扩容,需要增加存储容量时,只需要增加新的存储服务器,容量立刻增加,不需要宕机或者人工干预。这种方式几乎是没有容量大小限制的。
?
本系统中为了保证数据的正确性和同一份数据的一致性,首先,每一个数据块都有一个版本标识,一旦数据块上的数据有所变化,此版本号将向前增加。在NameNode上保存有此时每个数据块的版本,一旦出现数据服务器上相关数据块版本与其不一致,将会触发相关的恢复流程。这样的机制保证了各个数据服务器上的数据块基本上都是一致的。但是,由于网络的复杂性,简单的版本信息无法保证具体内容的一致性。因此,为了保证数据内容上的一致,必须要依照内容给出签名。当客户端向数据服务器追加写入数据包时,每一个数据包的数据,都会切分成512字节大小的段,作为签名验证的基本单位。在每一个数据包中,都包含若干个传输块以及每一个传输块的签名,一旦发现当前的传输块签名与在客户端中的签名不一致,整个数据包的写入被视为无效。
?
4 验证测试结果
?
系统测试平台为一台运行Ubuntu的Linux客户端和一台运行Ubuntu的Linux服务器。内核版本都为linux3.5.4,Linux内核中网络块设备版本为3.8,客户端已经加载NBD内核模块。在服务器上搭建HDFS云存储平台,网络环境为广域网全双工百兆网络环境,在该平台上进行试验。
?
本节主要注重测试网络块设备在云存储系统应用中,当存储容量不够时向集群中添加节点来增加集群存储容量,并且新的节点在添加之后能够正常的运行及发挥作用。
?
在上述系统中,对存储进行扩展性测试,由于资源有限,本文分别在集群中放置1个、2个、3个datanode节点,并向系统中写入数据,观察系统随着datanode数量的变化性能的改变。通过测试结果可以看出,随着datanode数量的递增系统的读写传输速率相对稳定。
?
5 结语
?
本文在分析Linux中网络块设备及HadoopHDFS的基础上,提出将Linux系统下网络块设备应用在云存储中。该方法可根据用户需求以及实际问题,将适用于远程存储的网络块设备和适用于大数据存储的Hadoop HDFS结合起来。这种方式在一定程度上扩大了存储容量且具有可扩展性。下一步计划对该系统进行进一步优化。