摘 要 针对目前企业对于不同厂家的存储设备无法有效的进行统一管理的现状,本论文在设计方法上通过对不同厂家存储设备的API接口进行分析和抽象,采用客户端/服务器结构,利用JAVA语言在SAN架构下编制可视化存储管理软件,从而生成一个新的通用型的存储设备接口来定义存储设备的种种操作,进而实现在单一控制平台上对不同厂家的存储设备进行统一管理的目标。 关键词 存储;软件;异构 20世纪90年代以来,随着信息量的急剧增加以及多媒体在各个领域的广泛应用,企业不断购买存储设备以满足日益增长的数据储存和管理的需要。数据以及信息的存储日益成为决定企业命运的最主要因素之一。然而在企业花费巨资购买各个厂家存储设备的时候,却不得不面临一个紧要的问题:来自各个厂家的信息存储技术和设备共存,甚至是在同一企业的不同部门都存在着不同的信息存储方案或是平台,如此复杂的环境使得高效能、低成本经济的信息数据存储管理变得很难顺利的实现。该项目的目的就是为了创建一个集中、简单、统一的管理软件,方便的管理来自不同供应商的存储设备。通过它,系统管理员将能够统一规划、分配SAN环境中的存储空间,从而实现优化资源利用,提高信息管理的效率。 研究的内容主要包括两大部分:客户端软件和服务器端软件。客户端软件主要完成一个图形化的操作界面,将采用Windows的界面风格,能够支持菜单、工具条、状态栏和详细浏览区等界面元素。服务器端软件主要完成对RAID(磁盘阵列)控制器的各种操作处理和监控。在此项研究中要解决的关键问题就是如何实现对SAN架构下不同厂商的存储设备的统一管理。采用的方法是,通过对各个厂家存储设备的API接口进行分析和抽象,从而生成一个新的通用型的存储设备接口来定义存储设备的种种操作,新设备只要实现这个接口便能够被支持和使用。1 应用该软件的系统结构 软件采用客户/服务器模式,系统结构图如图1所示。 管理服务器通过Fibre channel交换机和服务器、存储系统连接。通过fabre channel,管理服务器可以管理所有的存储设备。系统采用请求/应答方式工作。客户端负责图形界面显示和处理用户输入,然后将用户户命令转化成请求发送给服务器,服务器接受/处理请求,最后返回结果。客户端在图形界面上显示服务器处理结果。图1 系统结构图2 客户端软件的研制 客户端软件采用JAVA语言编写,可以运行在任何支持JAVA2的平台上。软件的界面由菜单条、工具条、对象树、对象列表和右键弹出菜单等组成。用户可以在对象树或对象列表中选中某个具体对象(比如Raid控制器、通道、硬盘、逻辑盘、逻辑卷等),然后在菜单条、工具条或右键菜单中选取某个操作项,进行操作。图2 客户端软件界面 鉴于客户端的设计采用的是常规界面的设计方法,以及本项目的创新集中在服务器端软件,客户端软件的设计将不再更详细说明。客户端软件界面如图2。3 服务器端软件的研制 管理服务器端采用Java编制,它主要负责对存储设备的数据采集及控制,通过Java接口与客户端通信。对于如何实现对不同厂商的存储设备的管理,在软件编制上我们通过对各厂家API接口的分析,在管理服务器端实现一个抽象的存储设备管理接口,这个接口和设备无关。这个接口定义存储设备的多种操作,新设备只要实现这个接口,管理服务器就能够支持这种新设备。设计时采用面向对象的思想,抽象出一些数据结构和方法的集合,从而构成一个可以描述RAID 控制器的类。对于不同类型的存储设备,我们构造出它的实例,通过这个实例对存储设备进行控制管理。设计时,我们为每种RAID控制器定义一个名称,并以该名称为唯一关键字,该链表中保存着该软件所支持的各类 RAID 控制器,该链表在服务器启动时初始化。出于跨平台的考虑,软件开发中要严格符合POSIX标准,使之能够运行于 Linux、AIX、Solaris 等主流操作系统上。RAID 类型链表结构:typedef struct { head_t head; char name[16]; long ip; int port; char password[32]; pthread_mutex_t lock; raidop_t *raidop; receiver_t *receiver;} raidtable_t; 当收到客户端发出搜索当前在线的RAID控制器的指令后,程序会循环调用raid_list中每种RAID控制器,然后将得到的对应的操作函数执行指令返回给客户端。这样客户端就可以对特定的RAID控制器做特定的操作。 当服务器端程序启动后,首先要初始化raid_list链表,将支持的RAID控制器的raidtable_t结构插入这个链表。然后等待客户端的指令。当软件收到客户端的搜索所有RAID控制器的指令后,它会循环调用raid_list中每种RAID控制器的搜索方法,然后将得到的结果返回给客户端。当服务器收到其它针对某个RAID的指令的时候,它会根据参数中的RAID名称等标示和操作类型在raid_list 链表中搜索对应的操作函数执行,将结果返回给客户端。其运行过程如图3。 对于来自客户端的对于各种RAID命令的处理,由于Raid命令非常的多,而且不同Raid控制器对于同一命令的处理不尽相同,为了使得系统结构清晰,并且能灵活地裁剪Raid命令,特设计了一系列的命令类,每一个命令类代表一种Raid操作,并且它们都继承了同一个超类,这样设计使得命令处理流程的高层都是一样的,只是具体的操作由它们各自的方法来完成,这样既提高了代码的重用性,又把修改某个具体命令对系统的影响降到了最低。图3 服务器端程序运行图 如图4所示,AbstractService类是服务器提供的服务的抽象,它里面最重要的方法就是exec,每一种具体的服务类必须实现该方法,以便完成该服务。出于扩展服务器端功能的考虑,比如服务器可能还要完成其他的服务(包括列节点的目录、共享节点的目录等在内的节点服务),所以所有的Raid命令都继承的是AbstractRaidService,该类进一步为所有Raid命令提供基本支持,比如每种命令产生的结果就在这个类中进行组装。图4:服务器端Raid命令(服务)的类关系图4 客户端与服务器端通信协议 通过客户端软件,对于某个Raid控制器功能的所有数据就被准备好了,通过通信子系统与服务器端进行通信,服务器再与底层硬件层通信,最终可完成某个Raid控制器的功能。服务器和客户端通信使用Java的java.io.InputObjectStream和java.io.OutputObjectStream类,直接在网络上传送java的Object对象。客户端上传的是Request类,服务器返回的是Response类。5 结论 存储技术已经成为提升企业竞争力的重要力量,存储被誉为“信息时代的第二次革命”,存储领域的各项研究已经成为信息技术的前沿亮点。本项目的创新点在于逻辑上将不同供应商的存储设备纳入到统一的一个存储虚拟池里,系统管理员实现对存储空间的自由分配和应用。在研究方法上,创造性地把不同厂家的存储应用接口进行抽象,形成一个“万能”的接口(抽象出一个虚拟的Raid控制器类),以便完成对各种不同类型存储设备的支持,也便于扩展。 参考文献[1] Robert Spalding (美).Storage networks: The Complete Reference.电子工业出版社. 05,2004. [2] 文武. 存储基础网络的发展趋势、思考及建议:存储在线 07,2005.[3] 李莉, 童小林.网络互联技术手册(第四版). 人民邮电出版社. 10,2004.[4] Tom clark(美) 王东等. IP SAN权威指南:实现光纤通道和IP SAN的实用指南(第二版).中国电力出版社. 08,2003.