版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
研究生毕业论文(申请工程硕士学位)可扩展网络附属存储系统集群模块的设计与实现TheDesignandImplementationofClusteringModuleinScalableNetworkAttachedStorage摘要随着信息技术的发展,企业的生产经营对于电子数据的依赖越来越大。很多企业面对大量数据存在存储,管理,使用等一系列问题。网络附属存储(NetworkAttachedStorage,简称NAS)产品在数据存储领域由于具有用途专一,性价比高,支持多种数据传输协议的特点而被很多企业采用。传统的NAS产品是基于单个节点,存在先天性的缺陷。其可靠性差,扩展困难等缺点难以适应当代企业全天候数据服务的需求。本文将介绍一个可扩展的NAS产品,它是基于IBM公司的通用并行文件系统,可以在提供数据服务的同时进行扩展,备份等操作。可扩展NAS产品提供了基于B/S的管理系统,易于部署和管理。此外,企业可以根据当前数据量对节点数目进行调整,可以有效降低采购和运营成本。本文以可扩展NAS产品为项目背景,详细介绍了其集群模块的分析,设计和实现。本文首先介绍了可扩展NAS产品的背景,以及国内外NAS产品发展的现状。介绍可扩展NAS产品集群模块在项目中的作用和地位。介绍了产品网络层,数据层,服务层,表现层的四层架构。接着本文介绍了在集群模块开发过程中使用的技术和工具。然后,本文在需求分析的基础上介绍了集群模块的设计和实现。详细分析了集群模块的四个主要的功能子模块,网络通信子模块,节点管理子模块,权限管理子模块和性能监控子模块。本文对各个子模块的功能设计,关键流程设计进行了阐述,并且详细分析了关键的实现细节。最后,本文对所做的工作进行了总结,并且指出了集群模块在节点管理方面可以继续展开的工作。关键词:可扩展NAS、网络通信、Django框架、权限管理、性能监控
AbstractWiththedevelopmentofinformationtechnology,theenterprisesdependonelectronicdatamorethaneverbefore.Theenterpriseshavetosolveaseriesofproblemssuchasdatastorage,managementandusage.Instoragefield,networkattachedstorage(forshort,NAS)productshavealotofadvantages,sotheyareusedalot.Theyareproductsdesignedforaspecialpurposewithlow-priceandfeaturessupportformultipledatatransmissionprotocol.Unfortunately,traditionalNASproductsarebasedonsinglecomputingnode.Theyarehardtoextendandnotreliable,sotheneedofround-the-clockservicecannotbesatisfied. ThispaperwillintroduceascalableNASproduct.ItisaclusterNASbasedonGeneralParallelFileSystemofIBM.Withthefeaturesofdistributedfilesystemandmanagementsystem,thisproductprovidesextentionandmanagementoperationwhileworking.ScalableNASmanagementsystemisbasedonB/Sarchitecture.Theenterprisescanadjustthenumberofcomputingnodesaccordingtothesizeofdata.Thispolicycaneffectivelyreducethepurchaseandoperatingcoses.BasedonthescalableNASproductasbackground,thispaperwillintroducetheayalysis,designandimplementationoftheclustermoduleinthisproject. Firstly,thispaperintroducesthebackgroundofsaclableNASproductandthesituationofresearchinNASarea.Theroleandfunctionsoftheclustermoduleinthisprojectwillbeintroduced.Theproducthas4-layerarchitecture.Frombottomtoup,theorderisnetworklayer,datalayer,servicelayerandpresentationlayer. Secondly,thispaperintroducesthetechnologyandtoolsusedintheproject. Thirdly,thispaperintroducestherequirementanalysisintheproject.Afterthat,thedesignandimplementationofclustermoduleisintroduced.Clustermodulehas4majorsubmodules,thenetworksubmodule,thenodemanagementmodule,theprivilegemanagementsubmoduleandtheperformancemonitoringsubmodule.Inthispaper,functiondesignforeachofthesubmodule,keyprocessoftheproductisdiscussedindetail. Finally,thispapermakesaconclusion,andpointsoutwhattheclustermodulecanbedoneinthefuture,suchasimprovingtheautoload-balance.Keywords:ScalableNAS,NetworkCommunication,Django,AuthorityManagement,PerformanceMonitoring目录摘要 IAbstract II图目录 VII表目录 IX第一章引言 11.1项目背景 11.2国内外相关领域发展现状 21.2.1NAS产品发展现状 21.2.2NAS与分布式文件系统的集成 41.3本文主要进行的研究工作 61.4本文的组织结构 6第二章技术综述 72.1Django框架 72.1.1MVC设计模式 72.1.2Django框架概述 82.1.3Django框架的结构 92.1.4Django请求响应流程 102.2Python中数据处理技术 112.2.1XML处理 112.2.2数据序列化技术 122.2.3网络数据传输 132.3GPFS文件系统 152.3.1GPFS简介 152.3.2可扩展NAS中GPFS架构 162.3.3GPFS的配置和管理 172.4RRDtool工具 182.4.1RRDtool简介 182.4.2RRDtool的python调用 192.5本章小结 20第三章集群模块的分析与设计 213.1可扩展NAS的总体规划 213.2集群模块的需求分析 223.2.1集群模块的业务需求 223.2.2集群模块的用户需求 233.2.2集群模块的功能需求 263.2.3集群模块的非功能需求 283.3集群模块的概要设计 283.4网络通信子模块分析与设计 303.4.1网络通信子模块流程设计 303.4.2 元数据设计 333.4.3 网络通信子模块详细设计 343.5节点管理子模块分析与设计 373.5.1 节点管理子模块流程设计 373.5.2 节点管理子模块结构设计 383.6用户管理子模块分析与设计 393.6.1 用户管理子模块数据库设计 393.6.2用户管理子模块结构设计 403.7性能监控子模块分析与设计 423.7.1 性能监控子模块流程设计 423.7.2 RRDtool设计与使用 433.8本章小结 43第四章集群模块的实现 444.1网络通信子模块实现 444.1.1 初始化工作实现 444.1.2 网络通信机制实现 454.1.3引导界面实现 484.2节点管理子模块实现 494.2.1 元数据存取实现 494.2.2 节点管理界面实现 514.3用户管理子模块实现 524.4性能监控子模块实现 564.4.1性能图表生成实现 564.4.2性能图表展示实现 584.5集群模块实现效果分析 584.5.1测试环境及测试用例 584.5.2效果分析 604.6本章小结 60第五章总结与展望 615.1总结 615.2进一步工作展望 61参考文献 62致谢 65版权及论文原创性说明 66图目录TOC\h\z\t"图目录4"\c图1.1共享存储集群NAS架构 3图1.2统一文件系统集群NAS架构 3图1.3GPFS特性与NAS需求映射关系 5图2.1MVC框架 8图2.2Django组件结构 9图2.3DOM树形结构 11图2.4使用cPickle进行序列化 12图2.5使用cPickle进行反序列化 13图2.6socket连接过程 14图2.7SocketServer模块类关系 14图2.8RRDtool合并算法 19图3.1可扩展NAS产品整体架构 21图3.2节点管理子模块用例图 23图3.3用户管理子模块用例图 24图3.4性能监控子模块用例图 25图3.5popen与shell交互 27图3.6集群模块的分层架构 29图3.7系统初始化流程图 31图3.8节点初始化流程图 32图3.9元数据树状结构 33图3.10网络通信子模块类图 35图3.11文件系统相关类图 36图3.12节点状态转移图 38图3.13节点管理子模块系统结构图 39图3.14用户管理子模块的实体关系图 40图3.15用户管理子模块的系统结构图 41图3.16性能监控子模块的泳道图 42图4.1节点初始化脚本 44图4.2TCPServer实现 46图4.3发送端文件传输方法 47图4.4接受端文件传输方法 47图4.5初始化监控界面 48图4.6元数据读取方法 49图4.7元数据保存方法 50图4.8节点管理界面 51图4.9磁盘管理界面 52图4.10用户管理界面 52图4.11UserCreationFrom类对字段的定义 53图4.12用户创建页面 54图4.13UserCreationFrom类中的save方法 55图4.14用户和群组映射关系管理界面 56图4.15内存图表的生成方法 57图4.16性能监控页面效果 58
表目录TOC\fF\h\z\t"表目录2"\c表2.1GPFS启动过程中涉及的命令 17表2.2RRDtool提供的函数 20表3.1用户表的字段 40表4.1测试服务器配置 59第一章引言1.1项目背景信息技术正在以前所未有的方式改变着人们的工作和生活方式。如何应付伴随着信息的高速增长而带来的海量数据的存储,成为摆在业界人士面前的一道难题。为了高效且经济的提供数据的统一管理,在存储领域的各大公司均推出了针对企业用户的NAS产品。NAS是一种通过网络提供的集中式数据访问服务,计算节点通过文件传输协议从NAS设备处获得数据。NAS相比于传统的文件服务器而言,有很多优点。由于NAS设备用途更为单一,所以硬件以及软件配置更为精简,只提供数据访问以及相应的管理功能,可以节约资金;因为通过标准的协议获取数据,可以达到不同平台之间的文件共享;可以充分的利用LAN网络结构,便于存储系统的升级;通过冗余措施来保障数据服务的可靠性。[张继波等,2005]现有的NAS产品分为单节点和多节点两种。单节点NAS架构简单,造价低,被广大中小企业采用。缺陷也很明显,只针对单个设备导致存储的可扩展性受限,单纯的通过增加磁盘来扩展存储会使得存储效率下降,通过增加NAS设备又破坏了对数据的统一管理;单个设备无法实现动态的扩容,在增加磁盘时往往需要停止服务;同时基于单个设备的NAS可靠性不高,节点的故障会导致数据服务瘫痪。多节点NAS是近几年来业界发展的新方向,各大存储设备厂商纷纷推出该类型NAS产品,例如EMC的ISILON,IBM的SONAS等。多节点NAS产品可以通过软件和硬件架构解决单节点NAS的缺陷。现有的多节点NAS产品都是面向中高端市场,造价不菲。调查显示,随着时间的推移,可扩展NAS产品相比单节点NAS提供了更多的成本优势,但是对于评估新的NAS系统的用户而言,初始成本比可扩展NAS系统的先进特性和功能更重要[Gahmetal.,2010]。很多中小企业用户业务发展很快,但是采购时初始需求不高,预算有限。很多企业在采购了单节点NAS之后不久就面临扩展受限,不得不进行数据迁移的境况。在本论文介绍的可扩展的NAS产品,其客户群体是发展中的中小企业,特点是可根据业务量调节节点数目,从而达到低初始投入和高可扩展性的目的。 可扩展NAS产品基于分布式文件系统,本身也是一个集群系统。在部署和管理上集群系统存在一系列的问题,包括如何自动化安装,如何统一权限管理,如何进行性能监控等。通过集群模块的支持,可以解决上述的缺陷。同时可以充分的利用分布式文件系统的特性,提供安全,稳定,可扩展的数据服务。1.2国内外相关领域发展现状1.2.1NAS产品发展现状面对企业对存储需求的快速增长,广大厂商均给出了NAS系统扩展方案。总体而言,NAS系统的扩展方式有scale-up和scale-out两种。Scale-up方式是指通过对单个NAS机器进行硬件升级来获取更高的存取速度,更大的存储空间和更快的传输速度。Scale-out是指通过扩展节点数目的方式达到相同的目的。现有的单节点NAS升级只能采用Scale-up的方式,产品技术比较落后。“横向扩展存储将成为匹配性能和容量实现更快投资回报的必然要求。”[2012,范平]采用scale-out方式进行扩展的NAS产品,其架构有两种方案,一种是多个单节点产品组成NAS群组,群组外部提供单独的调度模块对数据请求进行分配,维持负载均衡。这种架构节点之间耦合度低,扩展比较方便。缺点是本质上这种系统是单个NAS系统的堆叠,单节点NAS存在的缺陷并没有消除,同时多个节点也带来了管理上的诸多问题。另一种是集群NAS(ClusterNAS)架构。集群NAS在多个节点之间的协同上进行了软件或者硬件的支持,提供高效,稳定,负载均衡的NAS服务。目前的集群NAS有三种架构:1)共享存储架构。其架构如图1.1所示,局域网中存在两种节点,数据服务节点和存储节点。所有的数据服务节点共享所有的存储节点,数据服务节点对外提供数据服务,存储节点被隐藏。通过采用高性能的存储网络保障内部数据传输速度,通过扩展存储节点增加存储空间,通过增加数据服务节点提高数据服务能力。缺点是存储节点采用专有存储设备,成本比较高,数据服务节点存储能力被浪费,配置和管理都比较复杂。[赵聪,2003]图1.1共享存储集群NAS架构2)统一文件系统架构。其架构如图1.2所示,局域网中所有节点采用通用服务器,每个节点均提供存储能力和数据服务。所有的服务器存储设备组成一个整体的文件系统,在逻辑上统一命名空间。每个节点都可以通过访问该文件系统中所有存储设备上的文件。节点之间采用高速网络互联,提高文件系统的数据传输效率。由于数据服务和存储设备共用节点,可以减少设备数量。优点是采用通用设备,成本低,部署简单。缺点是,设备很容易故障,需要采用合适的机制保障可靠性,往往需要在安全性和存储利用率之间采取折中。[谢长生等,2005]图1.2统一文件系统集群NAS架构3)利用对象存储设备(Object-basedStorageDevice,OSD)构建NAS架构。对象存储设备可以自动构建集群并智能管理数据分布,数据服务节点只需要将I/O数据交给OSD设备处理。[苏勇等,2007]该架构将数据通路和控制通路分离,架构简单,性能优秀,可扩展极佳。缺点是设备造价高,而且OSD设备处于试验阶段,离商业化产品的出现时间还很长。统一文件系统架构采用通用服务器,价格低,可扩展性高。虽然通用设备故障率较高,但是通过对元数据的备份和恢复,以及分布式文件系统提供的安全策略,可以消除单个存储设备或者单个节点故障对服务造成的影响。因此在本产品中采用了统一文件系统架构方案。1.2.2NAS与分布式文件系统的集成NAS产品的核心功能是数据的传输和存储。传输数据功能体现在各种数据服务器,支持常用的数据传输协议,例如FTP,CIFS,NFS等;存储包括围绕在数据存取周围的所有功能,包括数据分区,备份功能,快照功能等。这些功能构架在文件系统之上,需要利用文件系统提供的接口进行实现。文件系统作为一个独立的产品,具有一定的普适性,除了提供特性之外,一般需要遵守POSIX标准。NAS产品通过调用POSIX标准接口使用文件系统功能,保证系统的可移植性。缺点是效率较低,无法利用文件系统的特性。本案中可扩展NAS产品底层采用了IBM的GPFS(GeneralParallelFileSystem,通用并行文件系统)文件系统。该文件系统是一个分布式文件系统,在设计和实现中都对于数据存取进行了独特的设计,与集群NAS产品的很多理念高度一致。如图1.3所示,GPFS提供了fileset的概念可以用于NAS的数据分区,GPFS提供基于fileset的备份,快照,也可以直接为NAS产品采用。GPFS提供了统一的逻辑存储空间,在任何一个节点上均可访问所有数据,在NAS产品元数据的备份和恢复操作上也可以调用相关功能。通过与底层文件系统的集成,可扩展NAS产品可以有效的利用文件系统中已有的特性,减少重复功能的开发,减少工作量的同时提高了整个产品的性能。功能的简化使得产品的部署难度下降,提高了可扩展性。图1.3GPFS特性与NAS需求映射关系在集成过程中,需要解决下述问题:GPFS是面向通用功能开发的,提供了多种配置选项,需要针对NAS产品的需求将不会用到的特性去除,将配置选项复杂度降低。可扩展NAS产品的定位是针对中小企业的简单易用的产品,需要引入自动化配置,与文件系统的集成过程自动化是一个难题。在GPFS中使用热备份技术或者软件RAID的方式来保证数据安全和服务可靠性。需要收集节点的磁盘信息,根据一定的算法来进行数据备份。所以需要动态采集节点的磁盘信息。通过不同节点访问GPFS系统时,用户权限需要保持一致。因此需要在集群间引入统一的权限机制。NAS产品的性能监控非常重要,用户需要对集群内每一个节点的各项性能指标进行统一的监控。为了解决上述问题,项目在集群文件系统的架构下添加了一个新的集群模块,该模块对系统的伸缩性提供支持。集群模块主要分为四个子模块,网络通信子模块,节点管理子模块,权限管理子模块和性能监控子模块。其中网络通信子模块是基础,其中有一套完整的机制来保障集群的建立与运行期间的可靠性,包括主节点推选机制,节点整体迁移机制,失效节点组机制。节点管理子模块用于方便用户管理。网络通信子模块还提供了元数据备份,集群中节点间的数据同步和文件传输等接口,来支持权限管理子模块和性能监控子模块。权限管理子模块包括文件系统的挂载,数据服务的权限配置,统一用户权限管理。性能监控子模块包括性能数据的收集,分析与展示。1.3本文主要进行的研究工作本文以可扩展NAS产品项目为背景,介绍了其集群模块的分析,设计与实现。可扩展NAS产品面临的主要挑战在两个方面,一是提供具有伸缩性的集群产品,二是对用户隐藏集群的复杂性,提供简易的管理系统。为解决上述问题,系统中引入了集群模块。集群模块实现了基于网络通信的集群自动化配置,此外提供了基于Django实现的管理系统,方便用户对集群的管理和监控。集群模块的引入使得可扩展NAS产品更为完整和易用。本文的主要贡献包括:本文提供了一种基于统一文件系统架构的集群NAS的设计。该产品底层文件系统采用分布式文件系统,产品支持用Scale-out的方式进行扩展,随着节点数目的增加可以获得存储能力和数据服务能力的同时提升。设计和实现了集群管理系统对集群的扩展和管理提供支持。管理系统中提供了网络通信机制用于节点信息的收集和传输。在信息收集的基础上提供了基于web的管理界面供用户进行集群管理和监控。集群模块利用linux系统自带的定时任务工具和RRDtool,在网络数据传输的基础上,提供了对Linux集群进行性能监控的一种实现。1.4本文的组织结构本文的组织结构如下:第一章引言部分。介绍了项目背景,介绍了NAS在国内外的发展现状。对论文的工作和组织结构进行了概括。第二章技术综述。将项目所要涉及的技术和框架做了介绍,包括python数据处理技术、Django框架、GPFS文件系统、RRDtool。第三章可扩展NAS产品集群模块的分析与设计。提出了产品的总体设计以及集群模块的需求。提出项目基本需求,对模块总体进行了设计,根据功能需求划分了子模块,对关键流程和数据结构进行了设计。第四章可扩展NAS产品集群模块的实现。根据设计,给出了集群模块的四个子模块的实现细节。第五章总结与展望。总结论文期间所做的工作,给出未来工作的展望。第二章技术综述本文介绍的集群模块,提供了管理系统和数据管理机制。管理系统使用了基于MVC的Django框架。数据收集管理机制中,使用了python标准库和扩展库中的数据处理模块进行数据的采集,传输,存储。对于性能数据,系统采用了RRDtool这一专门的工具进行数据收集和展示。此外,集群模块还需要用到GPFS文件系统提供的命令。本章将对集群模块的设计和实现中涉及的技术和工具进行介绍。2.1Django框架可扩展NAS产品提供了基于B/S架构的管理系统,该系统对业务逻辑复杂度的需求较高,对并发请求支持的需求不高,因此在开发中需要选择一个支持快速开发的框架。Django是基于python语言开发的开源框架,并且遵循MVC的分层原则。[Django,2013]2.1.1MVC设计模式浏览器/服务器结构,简称B/S结构,伴随着互联网的发展得到了大规模的应用。在B/S结构中,业务逻辑部分被放在服务器端实现,浏览器负责展示数据和命令操作,相比于客户端/服务器架构,虽然对服务器的能力要求较高,但是在程序的维护和升级上更容易操作。HTTP协议被用作B/S结构中浏览器端和服务器端的双向通信,它封装了浏览器端到服务器端的request和从服务器端到浏览器端的response。在这种结构下,程序员只需要关心浏览器端的表现形式和服务器端的应用逻辑,简化了开发工作。[王心路等,2004]模型-视图-控制器设计模式,即MVC设计模式,是B/S结构的应用中常用的编程范式。在MVC模式中,应用程序分为Model,View,Controller三个组成部分。这三个组成部分彼此间相互独立,遵循MVC模式的应用程序可以达到逻辑处理和数据表现相互分离的目的。每个组件只关心内部逻辑,达到高内聚,低耦合的效果。分层的思想可以有效的提高开发效率,同时在后期维护时,可扩展性和易维护性的需求都可以得到满足。[周辉等,2012]MVC设计模式中视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则,从而达到低耦合的效果。同时MVC模式允许你使用各种不同样式的视图来访问同一个服务器端的代码。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。从而便于重用。而分离视图层和业务逻辑层使得WEB应用更易于维护和修改。如图2.1所示,在MVC模式中,业务流程是由浏览器发起的,浏览器发出request,控制器获得请求,与数据模型交互,更新数据模型。控制器刷新视图,视图渲染浏览器页面,用户得到反馈。图2.1MVC框架2.1.2Django框架概述在2005年,Django开源之前,已经存在很多基于MVC的开发框架。然而Django迅速得到了业界的认同,成为迄今为止最为成功的基于python的web开发框架。这是由两个方面决定的,Django与python语言理念的一致和在设计之中对快速开发的支持。[高昂,2009]Django遵循python的普遍原则。“Python的用户一般都希望尽量清楚地描述问题,并且符合语言自身的理念,即Pythonic。”[Jeff.F,2009]Django中很多理念,比如尽量清楚的描述问题,对每种简单任务只有一种正确的做法,不依赖默认行为以及不要做重复性工作,都与python理念保持一致。Django提供了很多组件,应用程序员可以根据项目的需要选择组件进行组装,同时Django也允许用户将内置组件换成其他的工具。例如Django内置数据库管理组件,调用该组件可以轻松的进行数据持久化的工作,同时Django也提供了对其他数据库的支持,用户可以根据自己的喜好自行选择。由于理念一致,越来越多的python程序员加入到Django的开发,并贡献了各种组件的源代码。[王冉阳,2009]Django在设计之初就充分考虑了快速开发。Django起源于在线新闻的站点,因此在设计之初就设计了一组快速实现业务逻辑的组件。在初始化时使用Django的admin组件可以进行自动化的快速部署。admin.py结合了配置文件,自动化脚本和命令行的功能。通过对该文件修改以及调用命令可以轻松的完成组件的选择,数据库的配置等功能。2.1.3Django框架的结构 Django遵循了MVC设计模式,但是在实现上与其他的框架有所不同。其组件结构如图2.2所示。图2.2Django组件结构浏览器发出的请求首先交由URL映射器处理。HTTP请求的核心是URL,J2EE,.NET等框架将URL解析过程封装,对应到同名方法中,用户在方法中进行编程。而在Django中,程序员需要自己定义URL的解析,其遵从正则表达式规则,更加灵活和直观。Django接收到请求后,根据URL配置和urls.py文件里定义的规则逐条匹配,找到对应的视图方法和视图模板。 视图方法不同于MVC中的视图模板,在视图方法中封装了真实的业务逻辑。它和URL映射器共同担当了MVC范式中控制器的角色。URL映射器封装了URL到视图方法的映射关系,视图方法则将数据模型和视图模板联系起来,定义了需要展示的数据。在视图方法中,也支持Ajax技术,允许浏览器端的javascript发出的非顺序性的访问请求。在Django中视图方法存放在views.py中。 视图模板是Django抽象出来的一个模块,如果为每个请求写一个对应的HTML页面,会造成大量的重复性工作,并且给后期的维护带来很大的问题。视图模板是具有标签的文本,标签允许程序进行动态的替换,支持简单的逻辑结构,如选择结构或者循环结构。多个视图方法可以调用同一个视图模板,使用不同的数据并对其进行渲染得到最终的HTML页面。而且在实际使用中,视图模板不仅仅支持HTML,甚至是其他格式的文件供用户下载。在Django中,视图模板存放在templates文件夹下。 数据模型是对真实世界的抽象,数据模型实例化的对象保存的是当前系统的状态,视图方法可以改变数据模型的值,同时也需要调用数据模型的值呈现给用户。数据模型需要与数据库中的对象保持一致。在Django中数据模型通过manage.pystartapp命令建立,保存在models.py文件中。 ORM组件即对象关系映射组件,将数据库中的数据与程序中的对象进行映射,它封装了数据库的调用,将动态的对象自动与数据库记录进行状态同步,降低了开发者的工作量。同时pythonDB-API的支持减少了在程序移植时可能出现的数据库兼容的问题。2.1.4Django请求响应流程Django对HTTP请求的处理流程如下:服务器接收到浏览器发出的服务请求,传给Django。Django将request转换为请求对象,该对象的结构是Django专门为request设计的字典结构,可以应对HTTPCGI的需求。Django在URL配置文件里寻找请求对应的views.py里的处理函数。Django以请求对象为参数传入该视图函数。视图函数创建一个response对象。Django将response对象与Template中的文件结合,生成HTML文件。Web服务器将页面传送给客户端。2.2Python中数据处理技术集群模块中涉及到对包括XML在内的多种数据格式处理以及跨节点的数据传输。Python作为解释性语言,对于数据处理非常擅长,常常被用于混合编程中的粘合剂[罗霄等,2004]。在Python的标准库和扩展库中提供了多个模块对数据处理进行支持。[Python,2013]2.2.1XML处理XML即可扩展标记语言,由于XML具有结构化,跨平台等优点,在很多领域XML已经成为事实上的信息交换标准。[候要红等,2007]Python是一种解释性语言,在处理文本和解析复杂的数据结构方面具有先天性的优势。Python很早就内建了对XML的支持。在Python标准库中附带了用C语言编写的Expat解析器,Expat可以直接把XML文件转换为内存中的以元素为叶子的树状结构。图2.3DOM树形结构W3C推荐的对XML和HTML的解析标准是通过文档对象模型(DocumentObjectModel,简称DOM)。[Kamiretal.,2009]“DOM是一种平台和语言独立的接口,它允许程序或者脚本动态的访问更新文档的内容、结构和样式。文档可以被深度处理,并且处理的结果可以更新原有的文档.”[W3C,2005]图2.3展示了一个HTML页面的DOM的树形结构。由于Expat只实现了DOM的一个子集,所以Python提供了扩展包PyXML实现了完整的DOM对XML的访问接口。除此以外PyXML还实现了XML验证工具。PyXML极大的简化了XML处理工作,当然这种便利性伴随着性能的下降。[Lutz,2010]在可扩展NAS的集群模块中,存放节点信息和磁盘信息的元数据对集群中所有节点是透明的,这部分的信息存在格式固定,读取频率远大于写入频率的特点,因此采用XML格式存储,项目中采用了PyXML获得较高的可扩展性。2.2.2数据序列化技术在Python中数据是由基本的Python对象组成的,为了避免转换为XML带来的性能损失,Python提供了序列化功能可以完成对象和字符串之间的相互转化。在可扩展NAS产品的集群模块中,除了元数据以外其他中间状态数据采用序列化技术保存在磁盘上或者在节点之间进行共享。importpickletum1={'d':[1,3.0,4,4+5j],'e':('somestring',u'Unicodestring'),'f':None}reference_list=[‘a’,’b’,’c’]reference_list.append(reference_list)output=open('test.dat','wb')#picklethedata.pickle.dump(tum1,output)pickle.dump(reference_list,output,-1)output.close()图2.4使用cPickle进行序列化Python提供了marshal模块进行数据的序列化,该模块提供了dump()和load()两个方法完成序列化和反序列化。由于marshal模块仅支持python的基本数据类型和它们的组合,同时在不同的发行版本之间不能保证反序列化的成功。本项目中采用了Pickle模块,该模块与marshal作用相近,但是可以获得更好的版本兼容性。可以序列化和反序列化python的基本数据类型以及类生成的实例。使用C语言实现的cPickle和Pickle具有相同的功能,并且具有更高的效率。图2.4展示了序列化的过程。cPickle.dump()方法默认是使用版本兼容的序列化方法,但是也提供了可选参数牺牲兼容性达到与marshal模块相同的序列效率。通过dump()方法得到的字符串可以用于存储,网络传输或者加密。只要字符串本身的结构和内容没有发生改变,都可以被load()方法识别,load()方法会遵守dump()的顺序取出对象,在到达末尾时返回EOF标志。图2.5展示了对应上文的反序列化的过程。importpickletest_file=open('test.dat','rb')a=pickle.load(test_file)print(a)b=pickle.load(test_file)print(b)test_file.close()图2.5使用cPickle进行反序列化为了解决采用不同存储协议带来的反序列化问题,Python在存储时会将协议和数据同时放入文件,Pickle模块在反序列化的时候,load方法可以检测出自身需要采用的协议,传入的对象参数只要带有read()方法即可。同时,Python支持在序列化的同时进行压缩,保证数据在存储和网络传输时更有优势。[Martellietal.,2010]2.2.3网络数据传输在可扩展NAS系统集群模块中,节点发现和通信用到了网络通信技术。在基于TCP/IP协议的网络中,数据传输的基石和基本通信单元是套接字(socket)技术。[Stevensetal.,2010]应用程序可以利用操作系统提供的socket接口,实现在不同进程或者网络中不同节点的数据传输。图2.6显示了建立socket连接的基本过程。Socket通信发生在服务器端和客户端,服务器端创建socket并且绑定端口,之后进入监听状态。请求连接由客户端发起,双方建立TCP或者UDP连接,进行数据的传输。图2.6socket连接过程Server端的编程在网络通信中比较复杂,涉及到端口绑定和监听,生命周期控制,并发处理等问题。在python中,提供了SocketServer模块简化了server端的编程工作。图2.7显示了SocketServer模块的类之间的关系。图2.7SocketServer模块类关系BaseServer是接口类,定义了服务器需要实现的方法,TCPServer使用TCP协议传输数据,UDPServer使用UDP协议,可能会发生数据包顺序不一致或者丢失。基于二者的UnixStreamServer和UnixDatagramServer只被UNIX平台支持,所以较少使用。BaseRequest定义了请求处理的接口,它的子类需要实现finish,handle,setup接口,定义接收到请求各个步骤的处理方法。Server端一般同时需要处理多个客户端发出的请求,TCPServer和UDPServer都是单线程的server,只能同步处理请求,同一时间建立一个socket连接请求,其他的请求需要排队。为了同时处理多个请求,防止请求超时,SocketServer模块提供了ForkingMixIn和ThreadingMixIn两个类,这两个类的实例和server类的实例可以通过组合得到ThreadingServer,该server接收到socket请求后,启动一个线程来处理请求,达到并发的效果。2.3GPFS文件系统2.3.1GPFS简介GPFS文件系统是IBM公司的一个集群文件系统,它可以提供多个节点对一个文件系统或者多个文件系统集的并发访问。[GPFS,2013]这些节点可以分布在局域网或者广域网中。这些特性保障了对数据的高效访问,GPFS文件系统支持scale-out扩展方案。“除了支持通用数据存取之外,GPFS文件系统还支持包括数据同步,基于存储管理政策和跨节点操作等多种特性,GPFS可以基于AIX集群,Linux集群,Windows服务器集群或者三种平台的混合集群。”[IBM,2012]GPFS文件系统作为分布式文件系统,有如下的优点:GPFS在集群中的节点之间提供了统一命名空间和共享文件存储。集群中的任意节点通过GPFS文件系统的挂载点可以访问整个文件系统目录,扩展了存储空间。GPFS文件系统内部提供了锁机制,避免不同节点对数据并发访问带来的数据同步问题。GPFS文件系统提供了高可用性和高可恢复性,GPFS通过对recoverygroup的定义,把数据块打散,存放在不同的物理磁盘上,允许集群中节点级别的灾难恢复。GPFS对网络条件要求不高,可以根据网络环境进行算法优化,达到最优的系统性能。GPFS允许不停止服务的情况下对文件系统进行修改,文件服务的配置修改不会对服务本身造成影响。所以GPFS文件系统适应对服务稳定性要求高的场合。事实上IBM很多企业级的服务,包括数据库服务等都是基于GPFS文件系统。GPFS提供了管理命令,适应了大规模的集群。GPFS的关于集群的命令在任一节点上执行都可以达到同步执行的效果。省去了管理时需要登录多个子节点的工作。2.3.2可扩展NAS中GPFS架构 GPFS的配置可以根据实际情况采用多种方式,首先GPFS支持多种类型的操作系统,包括AIX,Linux,WindowsServer。在网络结构上,所有的节点可以都位于同一个局域网或者几个局域网和广域网的组合。同一个节点可以处于一个或者多个gpfs集群中。一个集群也可以有一个或者多个节点。在GPFS中定义了两种节点,NSDServer和NSDClient。NSDClient往往是计算能力较高的机器,从根据用户请求从NSDserver获取数据进行计算,NSDServer直接挂载磁盘,存储能力强。GPFS一共有四种基本架构:所有节点组成一组逻辑单元;通过NSDClient访问;多个sites组成一个集群;多个集群共享数据。可扩展NAS在选择架构时,需要参考如下的因素:应用对I/O性能的要求,NAS是提供数据服务的,对I/O性能要求比较高,所以应该采用局域网结构,多个节点共享数据,防止大规模数据交换带来的性能下降。对可靠性的需求,单节点的GPFS系统数据的安全性和服务可靠性不高。用户在初始时可以考虑,当后期有节点加入时,需要切换到集群配置。切换的同时不能影响数据服务的提供。底层硬件的属性。可扩展NAS使用的是通用的服务器,而且NAS服务对计算的要求不高,所以全部的机器均扮演NSDServer角色,另外在硬件层面需要提供保障,提高通用服务器组成集群的网络性能。对管理和安全性的考量也会影响GPFS的配置。这些指标和性能之间会有冲突,需要达成妥协。根据上述的因素,最终选择了所有节点组成一组逻辑单元,这种结构中,所有节点都是对等的,提供存储服务和数据访问服务。同时对扩展的支持较好,可以从单个节点开始扩展。2.3.3GPFS的配置和管理在可扩展NAS的集群模块中需要对GPFS进行两方面的操作,启动和节点管理。表2.1展示了启动和管理过程中需要用到的GPFS命令:表2.1GPFS启动过程中涉及的命令命令作用mmcrcluster-N{NodeDesc[,NodeDesc...]|NodeFile}–CClusterName–pHostName–rShell–RRemoteCommand创建GPFScluster,并且指定cluste名称以及用于管理文件系统的shell位置。mmchlicense{server|client}–-accept–N{NodeDesc[,NodeDesc...]|NodeFile}指定接受的协议类型,以及接受协议节点。mmaddnode-N{NodeDesc[,NodeDesc...]|NodeFile}–CClusterName–pHostName–rShell–RRemoteCommand向已经存在的GPFScluster中添加节点。mmdelnode-N{NodeDesc[,NodeDesc...]|NodeFile}删除GPFS中的节点。MmcrfsFileSystemName–Fnsdfile–BBlockSize–TMountPoint创建文件系统并且指定文件系统的挂载点。mmcrnsd–Fnsdfile创建NSD格式磁盘。mmdelnsd–Fnsdfile删除NSD磁盘。mmstartup{-N|-a}在节点上启动GPFS。mmshutdown{-N|-a}关闭GPFS服务。mmadddiskClusterName–Fnsdfile向GPFS中添加磁盘。mmdeldiskClusterNameNSDName把磁盘中数据迁出,并将磁盘移出集群。Mmmount–Fnsdfile删除NSD磁盘。启动GPFS包括如下步骤,建立集群。根据传入的节点参数,创立集群。选择需要接受的GPFS协议类型,NSDclient或者NSDserver。传入磁盘参数,将磁盘格式化为gpfs可以识别的NSD(NetworkSharedDisk,即网络共享磁盘)。创建文件系统。在所有节点上启动GPFS文件系统。将文件系统挂载到节点的本地目录下。添加节点的步骤包括:将节点加入集群。选择需要接受的GPFS协议类型。传入节点的磁盘参数,格式化为NSD。在新加入的节点上启动文件系统。将文件系统挂载到新加入的节点的本地目录下。添加磁盘的步骤包括:将磁盘格式化为NSD类型。将NSD类型磁盘加入到指定的文件系统中。删除磁盘的步骤包括:从集群中将磁盘删除,该步骤会将磁盘中的数据转移到其他磁盘下。删除NSD,该步骤会将磁盘格式化为操作系统可以识别的格式。删除节点之前需要将该节点下的磁盘删除,否则命令将失败。删除节点的步骤包括:在该节点下停止GPFS文件系统服务。从集群中删除节点。2.4RRDtool工具2.4.1RRDtool简介RRDtool即RoundRobinDatabase工具,RRDtool是MultiRouterTrafficGrapher(简称MTRG)包的组成部分,但是在实际应用中,该工具不仅仅用于网络流量监控,它可以用于收集和存储,展示各种状态信息。RoundRobin结构采用固定大小的循环链表来存储信息,当存储空间耗尽时,会覆盖最早存入位置的数据。该存储结构定义为RoundRobinArchieves(简称RRA),其优点是占用存储空间小,存储效率高。缺点是只能保存最近一段时间内的原始状态信息。[江竟敏,2011]RRD工具的使用非常灵活,在生产中可以通过多个RRA的相互配合以及采集算法和合并算法的共同使用达到需要的监控效果。针对单一数据源,RRDtool可以同时提供多种粒度的采集算法,记录在不同的RRA文件中,多种采集算法彼此之间并不相互影响。在系统管理中,原始数据有时并不重要,对原始数据进行加工得到的数据往往更被系统管理员关心。RRDtool允许用户自定义存储策略,可以根据数据特点进行压缩。在系统监控中,平均值和峰值是需要记录的两项指标,假设系统需要保存过去一天的每小时详细数值和过去一周中每天的峰值和平均值,图2.8展示了RRDtool针对数据源的单一采集算法和多种合并算法。数据采集程序每个小时运行一次,将数值循环填入数据档案RRA1中,24小时之后第一个小时收集的数据将被覆盖。系统定义了两个合并算法,MAX()和AVG(),将RRA1中的数据进行处理,平均值被记录到数据档案RRA2中,最大值被记录到数据档案RRA3中。这样一来虽然细粒度的数据被丢失,但是系统监控需要的数据被记录下来。该系统中时隔一周的峰值和平均值数据会被覆盖。如有需要也可以对这两个RRA向上提供合并算法。图2.8RRDtool合并算法RRDtool在数据收集和存储的基础上还提供了强大的图表生成能力。允许用户定义图表名称,横轴,纵轴的名称和度量单位。在生成图表时,RRDtool不仅仅支持单个数据源,还可以多个相似的数据源进行比较。通过自定义折线的颜色提供鲜明的对比。缺点是RRDtool导出的图表是图片形式的,如需对数据进行更近一步计算,需要根据API获取RRA的数据。2.4.2RRDtool的python调用RRD工具是用C语言编写的,但是针对多种语言提供了调用支持。“RRDtool功能可以直接通过python语言调用,作者通过scratch实现了python封装。”[T.Oetiker,2000]在使用中完全遵从RRDtool的操作函数。在安装了rrdpython模块之后,就可以使用python调用RRDtool提供的函数,这些函数如表2.2所示。表2.2RRDtool提供的函数函数名称参数作用rrdtool.create()‘SSAname’;\\档案名称‘startsize’;\\档案大小‘datasource’\\数据源‘合并函数’创建SSArrdtool.update()‘SSAname’;\\档案名称‘template|value’更正SSA中某一点的数值或者SSA结构rrdtool.graph()‘path’;\\输出路径‘imageformat’;\\图片格式‘width’;\\宽带‘height’;\\长度‘startpoint’\\起始时间‘endpoint’\\终止时间‘Verticallabel’;纵坐标‘title’;\\图片标题‘lowerlimit’;\\最低数值‘outputsource’\\输出源打印图表()‘SSAname’显示档案信息rrdtool.first();rrrdtool.last()‘SSAname’显示档案里最早和最晚的数据rrdtool.resize()‘SSAname’‘grow|shrinkrows’变更档案大小 2.5本章小结本章总结了在可扩展NAS系统中,集群模块的构建中使用的技术以及工具。包括用于构建管理界面的Django框架,Python中用于处理数据的一些基本模块和扩展模块,可扩展NAS底层的GPFS文件系统以及用于性能监控的工具RRDtool。
第三章集群模块的分析与设计本章首先对可扩展NAS的总体架构进行了介绍,分析了集群模块在系统中的地位和作用。然后对集群模块进行需求分析,在需求分析的基础上对集群模块进行子模块划分,并对各个子模块的详细设计进行了介绍。3.1可扩展NAS的总体规划可扩展NAS产品的目标是建立一个可以进行Scale-out扩展的NAS系统,系统支持节点数目1到N的扩展。在系统的建立过程中,有如下几个目标:系统中的每个节点都可以提供数据服务。在单个节点失效的情况下,数据不会丢失,也不会影响集群中其他节点的正常工作,并且可以快速的重建该节点。提供统一的管理界面,使用者可以通过该节面完成所有的NAS管理,包括数据服务管理,用户管理,集群管理,性能监控等。尽量使用GPFS文件系统已经提供的功能,避免重复功能的开发,同时需要对GPFS文件系统的自动化部署提供支持。图3.1可扩展NAS产品整体架构可扩展NAS产品共有三个部分组成,文件系统,集群模块,数据服务,其中文件系统使用成熟的的GPFS分布式文件系统,数据服务部分由两个子模块组成,数据服务器配置模块和数据服务器管理模块。集群模块作为中间模块衔接了文件系统和数据服务。对底层的文件系统的自动化配置提供支持,同时对数据服务隐藏了集群细节,使得数据服务模块专注于自身业务逻辑的实现。图3.1是可扩展NAS产品的整体架构,该集群现在由三个节点组成。集群模块的网络通信子模块会给GPFS文件系统提供节点的详细信息,完成GPFS的自动化部署。数据服务的提供除了依赖数据服务器之外,还需要需要依赖集群模块提供的用户信息和节点信息。3.2集群模块的需求分析在集群NAS中,每个节点都需要提供数据服务。如果每个节点单独提供配置管理系统,管理员对系统进行设置时,需要对每台机器进行配置。后期维护出现问题,需要首先定位出问题的节点,之后再登陆该节点进行维护工作。这对用户而言是不可以接受的。所以必须提供统一的管理界面。允许用户登陆系统后可以对所有的节点进行操作。集群模块作为中间模块,需要衔接文件服务和数据服务,同时提供用户对集群的管理和状态监控。本小节从业务需求,用户需求,功能需求和非功能需求几个角度对集群模块进行需求分析。3.2.1集群模块的业务需求集群模块协对上层的数据服务模块隐藏了底层文件系统的分布式细节,因为对于数据服务而言,用户对集群NAS产品和单节点NAS产品的需求是一致的,数据服务模块的设计实现与单节点NAS也相差不大。对于底层的文件系统而言,也不会关心使用的场景,GPFS设计是为了应对大规模数据的情况,具有普遍的适用意义。在GPFS集群建立的时候需要用户根据用途和硬件情况进行相应的配置。集群模块的设计必须考虑到产品整体,满足其他模块的要求。因此,集群模块的业务需求如下:收集GPFS自动化部署需要的信息,并且完成系统建立时的自动化部署。针对可扩展NAS产品的用户需求,将需要的GPFS命令加以组织,以对用户友好的界面方式呈现给用户,隐藏GPFS的命令细节。为数据服务模块只提供必须的数据,包括用户信息,系统中的节点信息,隐藏其他的细节。产品可以从单节点开始扩展,GPFS对单节点和多节点的配置是不同的,集群模块需要对切换过程进行支持。对节点的备份和恢复提供支持,这就要求节点信息对于集群中所有节点是透明的,每个节点需要了解到集群中所有节点的实时情况。3.2.2集群模块的用户需求集群模块分为四个子模块,网络通信子模块,节点管理子模块,用户管理子模块,性能监控子模块。其中网络管理子模块负责为上层的子模块提供支持,不需要与用户发生交互。其余三个子模块均需要满足用户对系统的不同角度的需求。图3.2节点管理子模块用例图节点管理子模块中,用户需要查看集群中每个节点的信息,包括节点名称,网络信息,节点当前的状态等。对节点的操作包括将新发现节点加入系统,将系统中节点删除。用户除了对节点操作以外,还可以对节点中的磁盘进行单独操作,查看磁盘信息,如磁盘的容量和使用率等,将磁盘加入文件系统,将磁盘从文件系统删除等操作。这些操作都需要批量化的支持。图3.2是节点管理子模块的用例图。用户管理子模块中,用户需要查看现有系统中已有的用户信息,包括UID,名称,权限,归属群组等,对用户的操作包括添加新用户,修改用户信息,冻结用户,恢复用户权限,删除已有用户等。对群组的操作包括查看群组的权限,查看群组中用户列表,添加群组,删除群组等。用户管理子模块的用例图如图3.3所示。图3.3用户管理子模块用例图在性能监控子模块中,用户可以对系统中所有节点的性能指标进行考量。首先,用户会关注系统的整体性能指标,包括整体的总存储容量,空间利用率。其次集群中每个节点的性能指标,包括CPU使用率,内存使用率,网络流量,存储空间大小和使用率都是用户关心的。此外,用户需要在不同的时间粒度上进行考量,度量单位包括,小时,天,星期,月和年。用户可以在不同时间粒度之间进行切换,直观的了解过去一段时间系统的各项性能指标反映出的情况。用户还可以在节点之间进行切换,考察集群中不同节点的性能指标。图3.4是性能监控子模块的用例图。图3.4性能监控子模块用例图除此以外,在系统初始化阶段,需要提供给用户引导程序,合并简化配置选项,隐藏GPFS文件系统复杂的配置信息。3.2.2集群模块的功能需求针对用户需求,集群模块的功能应该包括提供支持的网络通信机制,节点管理,用户管理,性能监控。集群模块根据功能划分为4个子模块,下面是集群的功能需求。在系统初始化时,用户需要了解初始化的状态以及每个配置选项的含义,系统初始化包括如下的步骤:节点发现阶段,节点初始化时会执行初始化模块,该模块通过网络通信发现局域网中的已有集群。系统初始化阶段尚无集群存在,所有节点进行信息交换,推举主节点,然后进入等待状态。用户在管理界面可以查看局域网中的节点,选择其中一个或者多个节点,建立集群。系统收集节点信息和磁盘信息,该信息在集群之中进行共享。同时提供接口给其他模块读取使用。GPFS系统根据节点和磁盘信息,完成初始化。用户通过web界面访问NAS系统,进行管理工作。在系统完成初始化的过程中,网络通信还需要支持集群级别的操作。首先,需要支持命令在集群上的同时执行,在系统中大部分命令都是针对集群中的所有节点,需要进行同步执行,因此需要实现一定机制,支持集群命令。其次,需要实现节点的心跳检查,集群中的元数据保存了节点信息,该信息需要进行实时的更新,因此需要定时对集群状态进行检查,当节点没有反馈,应该更新元数据,并通知上层做出反应。然后,还需要实现文件的共享机制,提供接口给上层模块,允许文件级别的数据传输。节点管理子模块负责节点以及节点下磁盘的管理,需要支持节点加入文件系统,该过程包括如下几个步骤:显示系统中新加入的节点。新加入的集群的节点并没有加入文件系统,需要与其他节点加以区分。用户选择要加入磁盘的节点,用户可以一次性加入多个节点。在每个节点中选择要加入文件系统的磁盘,用户可以选择性加入节点中的磁盘,操作系统所在磁盘需要和其他磁盘进行区别,不允许用户将操作系统所在磁盘加入文件系统,防止错误格式化。将选好的节点和磁盘加入文件系统。对节点操作还包括将节点从文件系统系统删除。该过程的步骤如下:选择要删除的节点。删除该节点下所有加入文件系统的磁盘,在删除磁盘时,GPFS文件系统会将删除磁盘上的数据转移到其他节点的磁盘上。删除节点。这个模块包含了对文件系统操作的抽象,实际上每个操作都代表了一系列的GPFS命令。对GPFS的操作需要依赖GPFS提供的shell命令。因此python需要通过shell来对GPFS进行操作。因此该模块功能需求还包括对shell的操作。如图3.5所示,python通过popen功能获得与shell的交互。Python中的Popen与标准C中的popen库函数是一致的,该函数封装了创建管道,fork子进程,以及父子进程之间的管道通信。[赵毅等,2003]图3.5popen与shell交互用户管理方面,功能需求是同一个用户在群组中所有节点上拥有相同的用户权限。所以首先要有统一的用户管理界面,可扩展NAS对用户管理采用了类似于Linux系统的机制,引入了用户和群组的概念。每个群组可以拥有多个用户,每个用户可以分属于多个群组。对用户操作的功能需求包括添加新用户,修改用户信息,删除用户。其中用户的信息包括用户名,用户主目录,用户所属的群组。对群组操作的功能需求包括添加新群组,删除群组,修改群组权限,修改群组中用户。用户和群组的对应关系在两者的管理模块都可以进行操作,需要保持一致。用户通过管理界面制订的用户和群组规则还要被保存和应用在集群中的每个节点上。群组之间的性能监控的功能需求包括以下几个方面:在每个节点上定义需要采集的性能信息,包括CPU使用率,内存使用率,网络流量,存储空间等。定义信息采集的时间间隔,并且在每个时间间隔进行一次信息采集。对采集的信息进行保存,由于对性能信息采集频率较高,需要采用一定的算法控制性能数据的规模,防止数据占用较大的空间。将性能信息进行集中,管理系统需要将所有的性能信息集中到一个节点上,涉及到网络通信。给用户呈现性能数据。就表现形式而言,图形化的界面是最为直观的。其次,用户可以根据需要查看某个节点的所有性能数据,或者单个性能数据在不同时间粒度下的表现,甚至可以指定多个节点就某一个性能数据进行对比。3.2.3集群模块的非功能需求集群模块的非功能需求要求模块具有可替换性性,可靠性,安全性。模块与文件系统的交互部分应该独立出来,在集群模块升级时可以停止管理界面服务,但是不需要停止文件服务和数据服务。集群中单个节点停止服务了,不会对其他节点产生影响,在管理界面中应该提醒管理员节点失效,并且停止对该节点进行分配数据服务等操作。元数据在保存和传输的过程中要注意加密,防止信息被更改和破坏。3.3集群模块的概要设计可扩展NAS产品的集群模块采用分层架构,管理系统采用Django框架实现,分为表现层,业务层,数据层和网络通信层。网络通信层主要的工作包括集群中节点之间的通信和元数据的采集。集群模块的分层架构如图3.6所示,图3.6集群模块的分层架构表现层负责与用户进行交互,用户通过浏览器访问页面,页面给用户展示信息并提供操作。表现层的设计实现主要是HTML页面的制作,为了提供给用户页面风格的基本一致的网页,减少重复劳动,并且减少后期的维护工作。业务层主要负责用户需求的实现,采用Django的MVT架构。不同类型的业务被Django识别,根据URL配置的规则分发给不同的业务模块进行处理。对应到相应子目录views的处理方法中。在集群模块中,业务层的设计包括定义views.py中处理方法,定义系统方法调用等。业务层在进行计算时,把用户请求的内容作为参数,同时还需要数据,这就涉及到与数据层的交互。在集群模块中,数据层中包含多种形式的数据,本地配置信息,集群元数据,数据库。本地配置信息是不需要与集群中其他节点共享的信息,用于节点重启和恢复的信息,包括节点名称,节点的类型等,在形式上是python对象的序列化文件。元数据是XML形式的,保存了集群信息,具体包括集群中的所有节点基本信息,节点当前状态,节点下磁盘的信息等,元数据可以被每个节点访问。系统实现了专门的类,处理元数据的存取问题。网络通信层,通过建立socket请求,网络通信层采集元数据,并且实时更新元数据,避免出现不一致的情况。初次以外,本层还对GPFS文件系统的调用进行了封装,把文件系统抽象成对象,提供业务逻辑层调用的方法。集群模块在传统的三层架构下面增加了网络层,网络层通过对数据层操作,将与集群有关的状态信息实时更新。避免了在业务逻辑层直接去处理复杂的集群业务。分层架构也使得模块化成为可能,因为每一层只对自己的上一层负责,接口都是公共的,可以根据功能需求,进行模块划分。3.4网络通信子模块分析与设计网络通信模块向下需要对GPFS的建立和维护提供支持,向上需要需要抽象GPFS的操作,降低上层模块操作集群的复杂度。在系统初始化时,每个节点会运行启动程序,完成GPFS的配置工作。3.4.1网络通信子模块流程设计集群中每个节点上运行代理程序,代理程序通过彼此之间的通信,完成系统的初始化。集群初始化工作的流程如图3.7所示。使用SSH-KeyGen生成公钥和密钥。GPFS系统在建立之前,要求集群中的所有节点可以实现无密码直接登陆,通过SSH-KeyGen工具,节点将其他节点的公钥保存在自己的/root/.ssh/authorized_keys文件中,就可以实现节点的无密码登陆。[李俊照等,2006]图3.7系统初始化流程图建立UDP客户端,发送UDP广播,寻找主节点。初始状态中,局域网中没有集群,所以不会得到回应。节点启动HTTPserver,同时建立UDPserver等待连接。用户选择一个节点作为主节点,通过浏览器输入http://IP:80端口访问上一步中启动的HTTPServer,输入集群的名称。主节点建立TCPServer,等待其余节点建立连接。同时通过UDP客户端发出广播,通知其余节点。其余节点停止HTTP服务,建立TCPclient与主节点建立连接。主节点在连接过程中,根据用户输入的集群名称给所有节点重新命名。并且建立XML格式的元文件,记录节点信息和磁盘信息。主节点收集所有节点的公钥信息,生成authorized_keys文件。通过文件同步功能,将元文件和authorized_keys文件同步到所有节点之上。完成之后,将节点对象序列化保存在本地,节点重启之后会首先从该文件中读取信息,完成恢复工作。上述步骤完成之后,GPFS配置需要的环境已经搭建完毕,需要的节点和磁盘信息也已经采集完成。新加入集群的节点完成初始化的流程图如图3.8所示。图3.8节点初始化流程图使用SSH-KeyGen生成公钥和密钥。建立UDPclient,发送UDP广播,寻找已有集群。主节点给出回应。建立TCPclient,与主节点之间建立TCP连接。新加入节点与主节点交换信息,新加入节点从主节点处获得节点名称。并向主节点发送自身的磁盘信息,公钥信息等。主节点更新元数据,并重新生成authorized_keys文件。通过文件同步功能,将元文件和authorized_keys文件同步到所有节点之上。新加入节点将节点对象序列化保存在本地,节点重启之后会首先从该文件中读取信息,完成恢复工作。3.4.2 元数据设计 元数据是指集群级别的配置信息,以及集群中所有节点的信息和每个节点下面的磁盘信息。元数据是对所有的节点共享的,采用XML格式进行保存。图3.9展示了元数据的树状结构。图3.9元数据树状结构根节点的子节点包括:ClusterName记录集群名称,即用户在初始化界面输入的字符串。NodePolicy记录集群对新加入节点的政策。在配置界面中用户可以选择三种节点加入政策。不加入,集群发现新的节点之后,只完成节点的初始化工作,不把节点加入集群之中。用户在节点管理界面可以看到该节点,对其进行操作。加入集群,但是不把磁盘加入集群。用户可以在节点管理界面可以对节点下的磁盘进行操作,有选择的加入一个或多个磁盘进入文件系统。将节点自动加入集群,将磁盘加入文件系统。会自动将新加入节点除操作系统所在磁盘以外的所有磁盘加入,自动化程度最高。Network即网络信息,在可扩展NAS中,所有的节点都位于同一个局域网中,除了IP之外,其他的网络信息都一致,这里记录了包括netmask,gateway等信息。Nodes记录了节点信息。子节点是集群中所有的节点。节点信息包括:NodeName,记录了节点名称,节点的命名规则是集群名称_n,n代表了节点加入的先后顺序。NodeType,节点类型分为masternode和slavenode。运行管理系统的节点是masternode。两种节点在恢复时,流程是不同的。NodeIP,记录了节点的IP地址。NodeState,节点的状态包括以下状态:Synchronized,节点同步完成,但是还没加入集群。nsd-client,节点进入
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论