磁盘阵列多终端管理系统的设计与实现*

2012-07-20 09:40宋玲玲蒋泽军王丽芳
微处理机 2012年1期
关键词:磁盘阵列队列命令

宋玲玲,蒋泽军,王丽芳

(西北工业大学计算机学院,西安 710129)

1 引言

磁盘阵列采用条带化技术和冗余技术,将多个普通磁盘组织成一个容量更大、访问速度更快,并具有一定容错能力的逻辑设备[1]。目前磁盘阵列已经成为构建大型存储系统的主要设备,磁盘阵列的各项功能通常利用专门的控制器软件实现[2-3],并能够以多种终端为多个用户提供服务。

磁盘阵列管理系统实现各种复杂的RAID(Redundant Array Of Independent Disks)功能,如驱动器管理、RAID 管理、逻辑卷管理、分区管理等。多个用户和多种功能交织在一起,需要有一个清晰的处理逻辑来保证系统高效、正确的运行。因此,结合具体磁盘阵列控制器的实例,介绍了一种可支持多个用户通过不同终端并发访问的磁盘阵列管理系统。该系统以软件分层设计思想为基础,充分利用了消息队列和XML 较强的数据格式表示能力,简化了软件的设计和开发,提高了系统的可维护性和扩展性。

2 磁盘阵列控制器软件架构

用户可以通过两种方式来使用磁盘阵列:一种是作为普通用户,只将磁盘阵列作为存储设备进行读写操作;第二种是作为管理员,主要实现对磁盘阵列的配置、管理。

如图1 所示。作为普通用户,主要实现阵列I/O,从上到下依次分为5个模块[3]:①目标器模块,接收读写命令,并返回应答和数据;②Cache 管理模块,实现高速缓存功能,通过预读及回写优化I/O 性能;③Raid 核心模块,根据不同RAID 级别的数据布局,将一个逻辑读写命令转换为一个或多个物理读写命令,并将返回的数据按RAID 级别进行组织;④I/O 调度模块,利用聚集技术实现有效的命令整合及I/O 调度;⑤启动器模块,完成实际的物理磁盘I/O 操作。

作为管理员,主要完成对阵列I/O 线路中各模块的配置,如设置缓存策略、RAID 级别、逻辑卷管理等,需要完成阵列管理这条线路,即实现磁盘阵列管理系统。磁盘阵列管理系统是阵列控制器的重要组成部分,分三层实现:①终端配置层,将阵列的信息呈现给管理人员,并将管理员对阵列的配置命令发送给队列管理层。终端配置层为管理人员提供了三种配置访问界面:web 配置终端、串口配置终端、LCD 配置终端。②队列管理层,实现了多种队列,将多个用户的请求统一处理,使请求命令的并发操作串行化;并且其上下两层通过非结构化的消息进行通信,将层间耦合度降到最低,提高了系统的开发效率和可维护性。③全局配置层,实现对磁盘阵列的配置工作,如RAID 配置、逻辑卷配置、通道配置、参数配置等。

图1 磁盘阵列控制器软件架构

3 磁盘阵列管理系统的设计和实现

3.1 基于XML 建模的终端配置层

终端配置层用于生成用户交互界面,为用户提供了三种终端访问方式:Web 界面、串口界面和LCD 界面,每种终端每次只能由一个用户使用,但是不同的用户可以同时通过三种终端对阵列进行配置。

终端配置层借鉴MDA(Model Driven Architecture)的思想[4],采用XML(Extensible Markup Language)描述用户界面。如图2,界面管理模块作为核心部分实现了终端配置层的运行逻辑,当一个用户请求到来时,如果是需要下层处理的配置命令,则把捕获的界面参数通过界面数据管理模块封装成消息加入命令队列;如果需要进行页面更新,则调用XML 解析器,解析页面描述XML 文件,获取界面静态元素信息(菜单、列表选项、对话框等),界面的动态信息则是界面数据管理模块从响应队列或者报告队列中获取的命令响应结果,最后根据页面布局组装界面静态元素和从下层获取的动态信息形成新的界面。

图2 终端配置层

基于XML为用户界面建模,使得用户界面的开发和维护更加便捷,对于界面管理模块已经支持的页面布局,实现一个新的界面只需编写相应的XML,并且加载新页面不需要重新编译程序,实现了界面风格统一的“零编码”开发。

3.2 基于XML 消息的队列管理层

如图3,队列管理层为系统维护一个命令队列、一个报告队列和多个响应队列。不同配置终端把命令发送到同一个命令队列中,由全局配置模块统一处理,实现了并发操作的串行化。全局配置模块将同步命令(如查看RAID 信息等可立即返回的命令)的处理结果填入响应队列,将异步命令(如创建RAID 等非常耗时的操作)的处理结果或者系统监控到的异常情况填入报告队列。由于响应队列较报告队列应用频繁,通常为每个配置终端分配一个响应队列,简化了队列中响应信息的解析和分配。

队列中的基本存储单元是消息,每条消息都是按照XML 数据组织方式构成的可变长字符串,如下是一条查询RAID 详细信息的消息,消息标签赋予了消息较强的可读性。

其中标签的第一个字符代表消息的类型,i 表示整形,f 表示浮点型,s 表示字符串。每条消息可由四部分组成:①操作码,定义消息对应的操作。②命令索引,随机生成的整型值,用于区别同一个用户的不同命令。③响应队列,指定命令结果的存放队列。④参数,对于请求命令是指执行命令的参数,对于结果消息是指命令的执行结果信息。

图3 队列管理层

基于XML 消息的队列管理利用共享内存机制实现,分成三个模块完成:

(1)队列注册,为用户在共享内存中申请队列空间,并利用三元组(ServiceID,QueueID,Offset)唯一标识用户所注册的队列。其中ServiceID 表示队列的服务对象,可用于区分多个用户;QueueID 表示队列ID,是识别队列的唯一标识,以易于理解的标识符给出,其中同一个用户可以同时注册命令队列、响应队列和报告队列三种不同的队列,不同的用户也可以注册同一个队列,即命令队列和报告队列;Offset是队列在共享内存中的偏移地址,用于实现逻辑地址到物理地址的转换。

(2)队列管理,该模块采用FIFO的方式对XML消息进行入队和出队管理,在队列操作中不需要处理消息自身,因此对消息队列的并发访问效率可明显提高。同时为了保证临界资源的一致性,队列管理模块还提供了队列的互斥操作,在操作队列前加锁,操作完后解锁。

(3)队列消息解析,对外提供XML 格式消息的封装和解析接口,主要完成各种数据到消息的组装,以及从消息到所需数据格式的解析。

3.3 全局配置层

全局配置层实现磁盘管理系统的业务逻辑,它从命令队列中读取命令并进行处理,然后再将处理结果以消息的形式分类放到响应队列和报告队列中。全局配置层分5个模块,分别负责不同的职能:

(1)全局配置信息模块,该模块利用共享内存记录所有的磁盘阵列配置信息,并将这些信息作为一种全局变量供系统各模块间共享。为了避免共享数据的不一致问题,在对全局配置信息进行操作时,利用Linux 系统的读- 写锁机制对其进行加锁处理;同时,为了保证全局配置信息在系统重启后仍有效,需要将配置信息在FLASH 中进行同步。

(2)命令处理模块,该模块从命令队列中逐条读取命令,并根据全局配置信息模块提供的信息对命令进行合法性验证,保证只有合法的命令才会交给阵列配置处理模块,对于非法命令通过响应队列通知给用户。该模块还负责将阵列配置处理模块处理过的命令结果返回给用户,同步命令的结果通过对应的响应队列返回,异步命令和异常错误信息通过报告队列返回。

(3)阵列配置处理模块,该模块包括逻辑驱动器管理、逻辑卷管理和缓存管理等,通过操作相关子设备的数据结构实现真正的配置处理。如对于一个创建RAID的命令,逻辑驱动器管理子模块将根据请求命令中的参数信息(RAID 级别,磁盘个数,各磁盘ID 等)和特定RAID 级别的布局特征,在内核中构造读写和控制RAID 所需的结构体。

(4)日志管理模块,该模块记录了对系统的配置命令,主要用于保证系统的一致性,当系统出现掉电等异常情况时,能够根据日志记录信息,将系统恢复到最近的一个一致性状态。

(5)监控信息模块,该模块实时监控系统内核信息,保证及时发现并处理磁盘阵列运行期间所出现的各种软硬件故障,根据故障影响程度的不同,可以分为主动警告和降级运行的处理方式,用户通过查看可以获得详细的异常信息。

图4 全局配置层

4 结束语

详细介绍了一个可支持多终端并发操作的磁盘阵列管理系统的设计与实现。该系统除了具有分层架构所带来的良好的可扩展性和可维护性外,还具有如下三个特点:

(1)将队列管理纳入软件分层实现中,上下层之间通过消息进行通信,系统的维护和扩展只需要保证消息的正确性即可;并且下层将上层多个用户的命令统一处理,这也从根源上解决了并发请求带来的冲突问题。例如,A 和B 同时请求用磁盘1 和2 创建RAID0,如果全局配置层先对A 命令进行了处理,则轮到B 命令时,通过全局配置信息的检查将发现这是一个不合法的命令,直接返回错误信息。

(2)采用XML 文档描述消息,简化了结构体在消息中的表示,降低了消息发送方和接收方的依赖性,不用双方逐条协商消息的长度、顺序等内容,大大提高了系统开发的效率。

(3)利用XML为用户界面建模,开发一个新的界面只需要编写相应的XML 文档即可,简化了开发工作;而且每加入一种新的配置终端,只需要开发新的界面管理模块即可,提高了系统的复用性和扩展性。

[1]David A.Patterson,Garth Gibson,Randy H.Katz.A case for redundant arrays of inexpensive Disks(RAID)[C].Proceedings of the 1988 ACM SIGMOD International Conference on Management of Data.Chicago,Illinois:ACM Press,1988.

[2]魏沁祺,谢长生,刘瑞芳.基于结构化模型的高性能RAID 系统的设计与实现[J].小型微型计算机系统,2007,28(2):376-380.

[3]谢长生,董晓明,万继光,等.磁盘阵列控制器的设计与原型实现[J].小型微型计算机系统,2006,27(1):171-174.

[4][美]Timothy J.Grose,Gary C.Doney,Stephen A.Brodsky.Mastering XMI[M].徐强,金艳红,译.北京:电子工业出版社,2004.

猜你喜欢
磁盘阵列队列命令
只听主人的命令
队列里的小秘密
基于多队列切换的SDN拥塞控制*
在队列里
更换磁盘阵列磁盘
移防命令下达后
LSIRAIDBIOS实现磁盘阵列重建
丰田加速驶入自动驾驶队列
这是人民的命令
存储虚拟化的三个层次