书签 分享 收藏 举报 版权申诉 / 35

一种ISCSI存储系统的实现方法.pdf

  • 上传人:54
  • 文档编号:641073
  • 上传时间:2018-03-01
  • 格式:PDF
  • 页数:35
  • 大小:1.94MB
  • 摘要
    申请专利号:

    CN200510011179.1

    申请日:

    2005.01.14

    公开号:

    CN1633131A

    公开日:

    2005.06.29

    当前法律状态:

    终止

    有效性:

    无权

    法律详情:

    未缴年费专利权终止IPC(主分类):H04L 29/06申请日:20050114授权公告日:20080618终止日期:20110114|||授权|||实质审查的生效|||公开

    IPC分类号:

    H04L29/06; G06F3/06

    主分类号:

    H04L29/06; G06F3/06

    申请人:

    清华大学;

    发明人:

    舒继武; 薛巍; 潘家铭; 罗骏; 于冰; 郑纬民

    地址:

    100084北京市北京100084-82信箱

    优先权:

    专利代理机构:

    代理人:

    PDF完整版下载: PDF下载
    内容摘要

    一种iSCSI存储系统的实现方法属于存储区域网络领域,其特征在于:在iSCSI控制器上实现了iSCSI协议,它包括:实现不同的负载均衡方法的网卡绑定模块、提供固定的虚拟设备标识符和热插拔功能的存储设备管理模块、控制低端存储设备并行IO负载的自适应IO负载控制程序以及对不同的存储阵列通道进行IO请求控制的多IO路径模块。必要时,可增设:控制启动器对存储设备的访问权限的存储设备映射模块、实现SCSI命令和块设备IO相互转化的块设备支持模块以及软件RAID模块。它提高了数据块的吞吐率及平均响应时间,在系统可用性及失效容错等也有较大优势。

    权利要求书

    1: 一种iSCSI存储系统的实现方法,其特征在于,它依次包含以下步骤: 第1步:在以下两个网络小型计算机系统接口,也称iSCSI的存储系统中的任何一个的 iSCSI控制器上,启动存储服务,把iSCSI协议即该控制器软件作为该系统的内核模块加载到 它的操作系统中: 第一种iSCSI存储系统包括:多个网络应用服务器,也称启动器;一个管理控制台;通过 TCP/IP网络协议分别和上述各启动器和一个管理控制台通讯的一台千兆网交换机;根据iSCSI 协议和上述千兆网交换通讯的iSCSI控制器;在Linux操作系统下并根据iSCSI协议与上述 iSCSI控制器通讯的多台存储设备; 第二种iSCSI存储系统包括:多个网络应用服务器,也称启动器;一个管理控制台;一台 千兆网交换机;一台iSCSI控制器;多台存储设备;各启动器和iSCSI控制器之间直线连接, 千兆网交换机和各启动器、管理控制台、iSCSI控制器之间经TCP/IP网络协议通讯,iSCSI 控制台和各存储设备之间按照iSCSI协议在Linux操作系统下运行; 上述iSCSI协议包含: 上层:由网关绑定模块及前端目标驱动即FETD模块有一次连接而成; 中间层:由与上述前端目标器驱动模块依次相连的IO负载控制模块和多IO路径模块组成; 下层,即物理层:有一个和多IO路径模块相连的设备管理模块; 所述网卡绑定模块,它是一种链路聚合式模块,即它使多块网卡虚拟为一块网卡,都具有 相同的IP地址;该模块在Linux操作系统下,针对不同需要,配备了符合IEEE 80
    2: 3ad标准 的多网卡轮转和热备份两种模式; 所述前端目标器驱动模块,它是公知的; 所述存储设备管理模块,在启动器启动iSCSI控制器存储服务时,它扫描连接在iSCSI控 制器上的各储备设备,提供固定的虚拟设备标识符;在热插拔存储设备时,启动对存储设备 进行增减的操作; 它在iSCSI控制器上设定一个线性组合形式且用以标识存储设备编号的虚拟目标标识符数 组,依次内含:该设备的主机适配器号,即host;通道号,即channel;目标号,即target; 逻辑单元号,即lun;该模块用上述四个变量确定一个存储设备的位置;同时,iSCSI存储系 统的iSCSI控制器上维护着一个存储设备列表以及表示存储设备被扫描次数的数组;它为 iSCSI控制台提供了一个写入命令以使该模块重新对该存储设备进行扫描的PROC接口;它 还为iSCSI控制器提供了动态增减存储设备的另一个PROC接口; 在下述情况下iSCSI控制器启动扫描存储设备的操作:iSCSI存储系统的iSCSI控制器端 加载控制软件时;iSCSI系统在减少或增加了存储设备后,存储管理员向iSCSI控制器发出重 扫描的命令; 所述存储设备模块依次按以下步骤实施存储设备扫描流程: 初始化模块; 有更多的host号否,若没有,便返回;否则,执行下一步骤; Host中还有更多的设备否,若没有,便返回初始化模块下面的一步;否则,执行下一 步骤; 设备的类型是否为存储磁盘,若不是,便返回初始化模块下面的一步;否则,执行下 一步骤; 获取设备的信息; 构造设备信息,插入设备到表中; 可用设备增1,返回初始化模块下面的一步; 所述存储设备管理模块依次按以下步骤实施存储设备删除流程: 管理员指定要删除设备的标识符; 从设备列表中得到该设备的信息; 设置该设备的删除标志; 释放该设备所有的未执行命令; 设置该设备的引用计数为0,引用次数是指存储管理设定的该设备的被扫描次数; 返回; 所述存储管理模块按以下步骤实施存储设备增加流程: 管理员指定要增加的设备的标识符; 设置该设备的增加标志; 把该设备的标识符加入到存储设备列表中; 设置该设备的引用计数为0; 自适应负载控制算法程序,它自动适应存储设备的能力,控制低端存储设备上的IO负载; 它在上述表示一个存储设备位置的数据组中,分别设置表示该设备同时所能处理的SCSI 命令队列的长度的域,同时设置表示目前正处于SCSI的执行队列中的SCSI命令的个数的域, 且在任何时候后者都要小于前者;同时,在中间层中,设置一个ST_HOLD_ON状态,它表 示所有到达中间层且准备完毕以便立即执行但因目前正处于SCSI的执行队列中的SCSI命令 的个数已到达该设备同时所能处理的SCSI命令队列长度的阙值而未能得到执行的命令的状 态; 所述实施负载自适应算法的程序依次含有以下程序: 模块从命令队列中得到一个需处理的SCSI命令; 判别该命令是否处于ST_HOLD_ON状态,若否,则执行下一步骤; 判断该命令是否是写命令,若为写命令且尚未接收到存储数据,若是,则把该命令设 置成目前正处于SCSI执行队列中的一个正待执行的命令的状态,执行完毕,则返回,若 否,则设置成ST_HOLD_ON状态,然后判断目标存储设备的同时所能处理的SCSI命令 队列长度是否大于目前正处于SCSI的执行队列中的SCSI命令的个数,若否,则返回; 若是,则执行SCSI命令并把存储设备的目前正处于SCSI执行队列中的SCSI命令的个数 增1,要处理的SCSI命令的个数减1,返回; 若从命令队列中得到的要处理的SCSI命令处于ST_HOLD_ON状态,则维持原状态 等待下一轮处理,执行下一步骤; 该模块再从命令队列中得到下一步要处理的SCSI命令按以上步骤处理;若命令没有 超时,则循环反复,直到处理完命令队列中的有要处理的SCSI命令为止; 所述的多IO路径模块,它对不同的存储队列通道进行IO请求控制,实现轮转或热备份配 置,即充分利用具有双控功能磁盘阵列的双通道功能,实现多个通道之间的冗余和提高;SCSI 存储系统异步IO能力; 设定:各主机适配器的最大通道数,记录多IO路径模块中的SCSI适配器所对应的主机 适配器号;对于双控功能磁盘阵列而言,一个主机适配号所表示的SCSI适配器上的存储设备 的相关信息记录在存储设备列表中,另一个则保存在多IO路径模块定义的结构中,同时记录 两个通道的状态域;该模块提供相应的PROC命令接口; 在中间层用状态ST_PATH_FAIL表达一个SCSI命令在现在的激活通道上执行失败,一旦 该模块探测到该状态,就把这个命令的状态设置成ST_PATH_FAIL,并再次放入队列中,同 时选择另外一个通道执行; 多IO路径模块对SCSI命令的处理流程如下: 先判断收到的SCSI命令是否为写命令; 若不是,则直接把该命令放入分发命令队列中;否则,为写命令分配数据缓冲区并把 该命令放入等待队列,等着数据到达;若数据到达,则从等待队列中取出该写命令,放 入分发命令队列; 在确定的配置模式下,对于分发命令队列中的命令进行判断是否有可选择的IO路径, 若没有,则推出;若有,则根据设定策略选出一条可用的IO路径,并把命令发送到该路 径再等待执行结果,若执行正确则返回,否则,把该命令放入重试队列中,进行下一轮 的路径选择。 2.根据权利要求1所述的一种iSCSI存储系统的实现方法,其特征在于:在物理层,还有一 个软件RAID模块与所述的多IO路径模块相连: 所述软件RAID模块,它把针对RAID存储队列的虚拟SCSI命令根据不同的RAID算法 转化为物理SCSI命令,并且把物理SCSI命令在各个单独物理磁盘上的执行结果合并或对虚 拟SCSI命令的响应结果; 使RAID模块的全局变量维护下述两个命令队列: 虚拟SCSI命令队列,它必须至少包含虚拟SCSI命令的状态和虚拟SCSI命令的标识; 物理SCSI命令队列,它至少必须包括如下字段:物理SCSI命令的状态,物理SCSI命令 所对应的虚拟命令,以及该物理SCSI命令的序号; 所述RAID模块依次含有以下步骤: 根据虚拟SCSI命令的逻辑地址信息和其他参数,把一条虚拟SCSI命令分解成物理 SCSI命令并把物理SCSI命令组成队列,同时维护虚拟SCSI和物理SCSI命令之间的关 系和状态; 由SCSI层对每个物理SCSI命令进行操作; 每次有一个物理SCSI命令返回后,通过该命令检测原始命令队列,若发现对应的所 有物理SCSI命令已经处理完毕,通过分析各个物理SCSI命令的响应结果形成一个对虚 拟SCSI命令的响应结果。
    3: 根据权利要求1所述的一种iSCSI存储系统的实现方法,其特征在于:在物理层,还有一 个块设备支持模块与上述多IO路径模块相连: 所述块设备支持模块,它使iSCSI存储系统的启动器能连接多种非SCSI设备,包括虚拟 块设备,它是通过把SCSI命令转化到块IO请求来实现的; 所述块设备模块依次含有以下执行步骤: 在从中间层接收一个SCSI命令后,判别该命令的目标是否为SCSI设备,若是,则 把该命令发送给SCSI设备,返回;若否,则执行下一个步骤; 判别该命令是否为查询类命令,若是,则根据配置信息返回响应,再返回;若否,便 执行下一步骤; 判断该命令是否为读命令,若是,则分析出LBA和数据长度,再根据LBA地址算出 虚拟设备中对应的偏移地址;再把偏移地址、数据长度和数据缓冲区地址传送给块设备 读取数据;等待块设备把数据写入到数据缓冲区后,块设备支持模块设置SCSI请求的状 态域,返回SCSI中间层;若是写命令,则分析出LBA和数据长度后,再把启动器端发 送过来的数据存放到数据缓冲区中;再根据LBA地址算出虚拟设备中对应的偏移地址; 把偏移地址、数据长度和数据缓冲区地址传送给块设备对块设备写入SCSI请求的数据缓 冲区中的数据;等待块设备层操作成功,块设备支持模块设置SCSI请求的状态域并把它 返回SCSI中间层。
    4: 根据权利要求1所述的一种iSCSI存储系统的实现方法,其特征在于:在中间层中,所述 前端目标驱动器模块和IO负载控制模块间有一个存储设备映射模块: 它提供存储设备位置、iSCSI控制器IP地址和启动器IP地址三者的映射关系,控制启动 器对存储系统中存储设备访问的权限,据此,访问权限分为三种级别:完全访问、只读访问 和禁止访问; 它对存储管理员改变设定如下格式的权限规划: [源IP地址][源地址掩码][目的IP地址][Target ID][访问权限]; 存储设备映射模块向存储管理员以PROC形式提供写入或查看规划、启动或停止存储设备映 射模块的接口;存储设备映射模块把向PROC接口写入的规划解析成以上述链表形式组织的 规划,该模块通过查询这个链表决定一个启动器对某个存储设备访问的权限; 所述存储设备有映射模块依次按以下三个阶段实现映射流程: 设备发现阶段,它依次含有以下步骤: 接收启动器的命令,判断是否为设备发现命令,若否,则返回;若是,则执行下一步 骤; 判断是否还有存储设备,若否,则返回;若有,则执行下一步骤; 根据以上规则判断启动器对存储设备所标识的权限; 根据权限判断存储设备对启动器是否可见,若可见,则把设备标识符填入后向启动器 返回存储设备列表;否则,返回“是否还有存储设备”步骤; 参数协商阶段,它依次含有以下步骤: 存储设备映射模块从启动器取得连接的客户端和服务器的地址; 存储设备映射模块判断该存储设备是否为一个对启动器禁止的存储设备,若为禁止的 存储设备,则主动中断该启动器到iSCSI控制器的网络连接;否则,进行下一阶段IO操 作; IO请求阶段,它依次含有以下步骤: 判断SCSI命令是否为写命令。若否转到“对于读命令”; 对于写命令,先分配缓冲区,并且根据规则设置这个命令的权限,最后把命令放入等 待队列; 接收到数据后,把相应的SCSI命令从等待队列中取出; 检测命令的权限,判别该命令可否被执行。若是,则把该命令放入分发队列;若否, 丢弃该命令并构造SCSI响应向启动器报告错误; 对于读命令,直接根据规则设置这个命令的权限; 检测命令的权限,判别该命令可否被执行。若是,则把该命令放入分发队列;若否, 丢弃该命令并构造SCSI响应向启动器报告错误。

    说明书


    一种iSCSI存储系统的实现方法

        【技术领域】

        iSCSI存储系统的实现方法属于存储区域网络领域,尤其涉及其中的iSCSI存储技术领域。

        背景技术

        iSCSI(Internet Small Computer Systems Interface)协议是利用IP网络进行I/O块数据级存储的端到端的传输协议,实现了在标准的以太网设备上在应用服务器(启动器)和存储设备(iSCSI控制器)之间的数据传输。iSCSI协议由互联网工程业务组(IETF)进行编制,对于光纤通道存储网络(SAN),iSCSI是一种补充,或替代标准。iSCSI的优点之一是,使IT用户可以利用现有构架(TCP/IP网络)的优势和专业技术。除了提供一种廉价的替代光纤信道地方案外,iSCSI还在应用方面带来许多优点,如:存储合并、业务的持续性、远程备份和恢复,以及远程数据访问。

        然而由于以太网络带宽的限制,相比起光纤通道存储,iSCSI存储系统存在着吞吐量不够高的缺点。而由于iSCSI存储系统是廉价代替品的自身特点,iSCSI系统面临着存储设备效率较低以及故障率较高的挑战。并且存储和网络结合产生了如:设备动态增减、存储设备映射、可选路径的新的管理任务。

        本发明实现了一种新型的高性能和高可用性的iSCSI存储系统,有效的解决了以上所述的问题。

        【发明内容】

        本发明的目的在于提供一种具有高性能和高可用性的iSCSI存储系统的实现方法。iSCSI存储系统的硬件结构包括应用服务器,存储网络,iSCSI控制器和存储设备以及管理控制台。本发明的重点在于iSCSI存储系统的iSCSI控制器。iSCSI控制器对存储资源进行管理,并且对应用服务器提供存储服务,是iSCSI存储系统的关键。在iSCSI控制器上,我们采取了一系列具有创新水平的方法,提高了iSCSI存储系统的IO吞吐率,提高了其失效容错性(FaultTolerance),改善了其可用性(Availability)。这一系列方法的完整的构成了一个具有高性能、高可用性的iSCSI存储系统的实现方法。

        本发明的思路是:

        (1)分别通过对iSCSI存储系统应用服务器和iSCSI控制器上多个网卡进行绑定,实现网络链路级的负载均衡和失效冗余。

        (2)存储设备管理模块中的虚拟设备标识符算法确保了同一存储设备具有固定的设备标识符,有助于存储服务的持续。比较原有的随机设备标识符算法,本方法具有明显的优势。存储设备动态增减算法允许在iSCSI存储服务不停止的前提下增加新的存储设备,或者减少存储设备,有效的提高了iSCSI存储系统的可用性。

        (3)存储设备映射模块对不同来源、目的的访问请求进行控制,确保网络存储中数据访问的安全性。基于IP地址的存储设备映射(Storage Device Mapping)方法允许对启动器地址和iSCSI控制器上不同网卡的IP地址进行两层映射,支持掩码方式,并且提供基于映射规则的配置接口。相比起传统的映射方式,本方法比较灵活,配置也较为简单。

        (4)自适应IO负载控制能够根据存储设备的能力,自动对IO负载进行控制,有效地保证在存储设备性能较低、而IO负载很高时,iSCSI存储系统依然能够平稳运行。

        (5)多IO路径算法的引入一方面提高了iSCSI存储系统iSCSI控制器的并发IO能力,另一方面实现了通道失效容错。

        (6)iSCSI存储系统的iSCSI控制器以软件方式实现了RAID5和RAID6算法,保证磁盘失败时数据的完整性,本方法作为硬件RAID卡的取代实现,具有廉价和可配置性更好等特点。

        (7)块设备支持模块在一般块设备上实现了SCSI接口,使得不同的非SCSI接口设备甚至是Linux卷管理软件(LVM)和多磁盘管理模块(MD)一类的虚拟块设备都能够适用到该系统中,扩展了iSCSI存储系统所支持的存储设备范围和iSCSI存储系统控制器的功能。

        本发明的特征在于,它依次包含以下步骤:

        1.第1步:在以下两个网络小型计算机系统接口,也称iSCSI的存储系统中的任何一个的iSCSI控制器上,启动存储服务,把iSCSI协议即该控制器软件作为该系统的内核模块加载到它的操作系统中:

        第一种iSCSI存储系统包括:多个网络应用服务器,也称启动器;一个管理控制台;通过TCP/IP网络协议分别和上述各启动器和一个管理控制台通讯的一台千兆网交换机;根据iSCSI协议和上述千兆网交换通讯的iSCSI控制器;在Linux操作系统下并根据iSCSI协议与上述iSCSI控制器通讯的多台存储设备;

        第二种iSCSI存储系统包括:多个网络应用服务器,也称启动器;一个管理控制台;一台千兆网交换机;一台iSCSI控制器;多台存储设备;各启动器和iSCSI控制器之间直线连接,千兆网交换机和各启动器、管理控制台、iSCSI控制器之间经TCP/IP网络协议通讯,iSCSI控制台和各存储设备之间按照iSCSI协议在Linux操作系统下运行;

        上述iSCSI协议包含:

        上层:由网关绑定模块及前端目标驱动即FETD模块有一次连接而成;

        中间层:由与上述前端目标器驱动模块依次相连的IO负载控制模块和多IO路径模块组成;

        下层,即物理层:有一个和多IO路径模块相连的设备管理模块;

        所述网卡绑定模块,它是一种链路聚合式模块,即它使多块网卡虚拟为一块网卡,都具有相同的IP地址;该模块在Linux操作系统下,针对不同需要,配备了符合IEEE 802.3ad标准的多网卡轮转和热备份两种模式;

        所述前端目标器驱动模块,它是公知的;

        所述存储设备管理模块,在启动器启动iSCSI控制器存储服务时,它扫描连接在iSCSI控制器上的各储备设备,提供固定的虚拟设备标识符;在热插拔存储设备时,启动对存储设备进行增减的操作;

        它在iSCSI控制器上设定一个线性组合形式且用以标识存储设备编号的虚拟目标标识符数组,依次内含:该设备的主机适配器号,即host;通道号,即channel;目标号,即target逻辑单元号,即lun;该模块用上述四个变量确定一个存储设备的位置;同时,iSCSI存储系统的iSCSI控制器上维护着一个存储设备列表以及表示存储设备被扫描次数的数组;它为iSCSI控制台提供了一个写入命令以使该模块重新对该存储设备进行扫描的PROC接口;它还为iSCSI控制器提供了动态增减存储设备的另一个PROC接口;

        在下述情况下iSCSI控制器启动扫描存储设备的操作:iSCSI存储系统的iSCSI控制器端加载控制软件时;iSCSI系统在减少或增加了存储设备后,存储管理员向iSCSI控制器发出重扫描的命令;

        所述存储设备模块依次按以下步骤实施存储设备扫描流程:

        初始化模块;

        有更多的host号否,若没有,便返回;否则,执行下一步骤;

        Host中还有更多的设备否,若没有,便返回初始化模块下面的一步;否则,执行下一步骤;

        设备的类型是否为存储磁盘,若不是,便返回初始化模块下面的一步;否则,执行下一步骤;

        获取设备的信息;

        构造设备信息,插入设备到表中;

        可用设备增1,返回初始化模块下面的一步;

        所述存储设备管理模块依次按以下步骤实施存储设备删除流程:

        管理员指定要删除设备的标识符;

        从设备列表中得到该设备的信息;

        设置该设备的删除标志;

        释放该设备所有的未执行命令;

        设置该设备的引用计数为0,引用次数是指存储管理设定的该设备的被扫描次数;

        返回;

        所述存储管理模块按以下步骤实施存储设备增加流程:

        管理员指定要增加的设备的标识符;

        设置该设备的增加标志;

        把该设备的标识符加入到存储设备列表中;

        设置该设备的引用计数为0;

        自适应负载控制算法程序,它自动适应存储设备的能力,控制低端存储设备上的IO负载;

        它在上述表示一个存储设备位置的数据组中,分别设置表示该设备同时所能处理的SCSI命令队列的长度的域,同时设置表示目前正处于SCSI的执行队列中的SCSI命令的个数的域,且在任何时候后者都要小于前者;同时,在中间层中,设置一个ST_HOLD_ON状态,它表示所有到达中间层且准备完毕以便立即执行但因目前正处于SCSI的执行队列中的SCSI命令的个数已到达该设备同时所能处理的SCSI命令队列长度的阙值而未能得到执行的命令的状态;

        所述实施负载自适应算法的程序依次含有以下程序:

        模块从命令队列中得到一个需处理的SCSI命令;

        判别该命令是否处于ST_HOLD_ON状态,若否,则执行下一步骤;

        判断该命令是否是写命令,若为写命令且尚未接收到存储数据,若是,则把该命令设置成目前正处于SCSI执行队列中的一个正待执行的命令的状态,执行完毕,则返回,若否,则设置成ST_HOLD_ON状态,然后判断目标存储设备的同时所能处理的SCSI命令队列长度是否大于目前正处于SCSI的执行队列中的SCSI命令的个数,若否,则返回;若是,则执行SCSI命令并把存储设备的目前正处于SCSI执行队列中的SCSI命令的个数增1,要处理的SCSI命令的个数减1,返回;

        若从命令队列中得到的要处理的SCSI命令处于ST_HOLD_ON状态,则维持原状态等待下一轮处理,执行下一步骤;

        该模块再从命令队列中得到下一步要处理的SCSI命令按以上步骤处理;若命令没有超时,则循环反复,直到处理完命令队列中的有要处理的SCSI命令为止;

        所述的多IO路径模块,它对不同的存储队列通道进行IO请求控制,实现轮转或热备份配置,即充分利用具有双控功能磁盘阵列的双通道功能,实现多个通道之间的冗余和提高;SCSI存储系统异步IO能力;

        设定:各主机适配器的最大通道数,记录多IO路径模块中的SCSI适配器所对应的主机适配器号;对于双控功能磁盘阵列而言,一个主机适配号所表示的SCSI适配器上的存储设备的相关信息记录在存储设备列表中,另一个则保存在多IO路径模块定义的结构中,同时记录两个通道的状态域;该模块提供相应的PROC命令接口;

        在中间层用状态ST_PATH_FAIL表达一个SCSI命令在现在的激活通道上执行失败,一旦该模块探测到该状态,就把这个命令的状态设置成ST_PATH_FAIL,并再次放入队列中,同时选择另外一个通道执行;

        多IO路径模块对SCSI命令的处理流程如下:

        先判断收到的SCSI命令是否为写命令;

        若不是,则直接把该命令放入分发命令队列中;否则,为写命令分配数据缓冲区并把该命令放入等待队列,等着数据到达;若数据到达,则从等待队列中取出该写命令,放入分发命令队列;

        在确定的配置模式下,对于分发命令队列中的命令进行判断是否有可选择的IO路径,若没有,则推出;若有,则根据设定策略选出一条可用的IO路径,并把命令发送到该路径再等待执行结果,若执行正确则返回,否则,把该命令放入重试队列中,进行下一轮的路径选择。

        2.在物理层,还有一个软件RAID模块与所述的多IO路径模块相连:

        所述软件RAID模块,它把针对RAID存储队列的虚拟SCSI命令根据不同的RAID算法转化为物理SCSI命令,并且把物理SCSI命令在各个单独物理磁盘上的执行结果合并或对虚拟SCSI命令的响应结果;

        使RAID模块的全局变量维护下述两个命令队列:

        虚拟SCSI命令队列,它必须至少包含虚拟SCSI命令的状态和虚拟SCSI命令的标识;

        物理SCSI命令队列,它至少必须包括如下字段:物理SCSI命令的状态,物理SCSI命令所对应的虚拟命令,以及该物理SCSI命令的序号;

        所述RAID模块依次含有以下步骤:

        根据虚拟SCSI命令的逻辑地址信息和其他参数,把一条虚拟SCSI命令分解成物理SCSI命令并把物理SCSI命令组成队列,同时维护虚拟SCSI和物理SCSI命令之间的关系和状态;

        由SCSI层对每个物理SCSI命令进行操作;

        每次有一个物理SCSI命令返回后,通过该命令检测原始命令队列,若发现对应的所有物理SCSI命令已经处理完毕,通过分析各个物理SCSI命令的响应结果形成一个对虚拟SCSI命令的响应结果。

        3.在物理层,还有一个块设备支持模块与上述多IO路径模块相连:

        所述块设备支持模块,它使iSCSI存储系统的启动器能连接多种非SCSI设备,包括虚拟块设备,它是通过把SCSI命令转化到块IO请求来实现的;

        所述块设备模块依次含有以下执行步骤:

        在从中间层接收一个SCSI命令后,判别该命令的目标是否为SCSI设备,若是,则把该命令发送给SCSI设备,返回;若否,则执行下一个步骤;

        判别该命令是否为查询类命令,若是,则根据配置信息返回响应,再返回;若否,便执行下一步骤;

        判断该命令是否为读命令,若是,则分析出LBA和数据长度,再根据LBA地址算出虚拟设备中对应的偏移地址;再把偏移地址、数据长度和数据缓冲区地址传送给块设备读取数据;等待块设备把数据写入到数据缓冲区后,块设备支持模块设置SCSI请求的状态域,返回SCSI中间层;若是写命令,则分析出LBA和数据长度后,再把启动器端发送过来的数据存放到数据缓冲区中;再根据LBA地址算出虚拟设备中对应的偏移地址;把偏移地址、数据长度和数据缓冲区地址传送给块设备对块设备写入SCSI请求的数据缓冲区中的数据;等待块设备层操作成功,块设备支持模块设置SCSI请求的状态域并把它返回SCSI中间层。

        4.在中间层中,所述前端目标驱动器模块和IO负载控制模块间有一个存储设备映射模块:

        它提供存储设备位置、iSCSI控制器IP地址和启动器IP地址三者的映射关系,控制启动器对存储系统中存储设备访问的权限,据此,访问权限分为三种级别:完全访问、只读访问和禁止访问;

        它对存储管理员改变设定如下格式的权限规划:

        [源IP地址][源地址掩码][目的IP地址][Target ID][访问权限];存储设备映射模块向存储管理员以PROC形式提供写入或查看规划、启动或停止存储设备映射模块的接口;存储设备映射模块把向PROC接口写入的规划解析成以上述链表形式组织的规划,该模块通过查询这个链表决定一个启动器对某个存储设备访问的权限;

        所述存储设备有映射模块依次按以下三个阶段实现映射流程:

        设备发现阶段,它依次含有以下步骤:

        接收启动器的命令,判断是否为设备发现命令,若否,则返回;若是,则执行下一步骤;

        判断是否还有存储设备,若否,则返回;若有,则执行下一步骤;

        根据以上规则判断启动器对存储设备所标识的权限;

        根据权限判断存储设备对启动器是否可见,若可见,则把设备标识符填入后向启动器返回存储设备列表;否则,返回“是否还有存储设备”步骤;

        参数协商阶段,它依次含有以下步骤:

        存储设备映射模块从启动器取得连接的客户端和服务器的地址;

        存储设备映射模块判断该存储设备是否为一个对启动器禁止的存储设备,若为禁止的存储设备,则主动中断该启动器到iSCSI控制器的网络连接;否则,进行下一阶段IO操作;

        IO请求阶段,它依次含有以下步骤:

        判断SCSI命令是否为写命令。若否转到“对于读命令”;

        对于写命令,先分配缓冲区,并且根据规则设置这个命令的权限,最后把命令放入等待队列;

        接收到数据后,把相应的SCSI命令从等待队列中取出;

        检测命令的权限,判别该命令可否被执行。若是,则把该命令放入分发队列;若否,丢弃该命令并构造SCSI响应向启动器报告错误;

        对于读命令,直接根据规则设置这个命令的权限;

        检测命令的权限,判别该命令可否被执行。若是,则把该命令放入分发队列;若否,丢弃该命令并构造SCSI响应向启动器报告错误。

        本发明在清华大学计算机系高性能计算技术研究所进行过测试并在实际生产环境中加以应用。结果表明,新型高性能高可用性iSCSI存储系统有效的提高了iSCSI系统的IO吞吐率,并在系统的可用性、失效容错性上具备较大的优势。

        附图说明:

        图1iSCSI示意图。

        图2iSCSI存储系统的硬件结构图,2a.交换机连接方式,2b.直连线连接方式。

        图3iSCSI存储系统的软件结构和子模块关系图。

        图4多网卡绑定示意图,4a.交换机连接方式,利用冗余网络链路实现高可用,4b.直接线方式,两条通路提供>1.5倍带宽,4c.直接线方式,利用冗余网络链路实现高可用。

        图5存储设备映射示意图。

        图6多IO路径模块示意图。

        图7设备管理模块流程图,7a.设备扫描流程,7b.删除设备流程。

        图8设备映射模块流程图,8a.在设备发现阶段,8b.在参数协商阶段,8c.在IO请求阶段。

        图9IO负载均衡算法流程图。

        图10多IO路径模块流程图。

        图11块设备支持模块流程图。

        具体实施方式:

        iSCSI协议是在标准的以太网设备上进行I/O块数据级存储的端到端的传输协议,如图1所示。

        本发明即对iSCSI网络存储系统的实现方法。在这个iSCSI网络存储系统中,前端应用服务器通过千兆网交换机或者通过千兆直连线连接到iSCSI存储系统iSCSI控制器上,它们之间通过TCP/IP协议进行数据传输,构成iSCSI存储网络。其硬件体系结构如图2所示。

        其中,iSCSI存储系统的iSCSI控制器安装有6块千兆网网卡,向外提供8个千兆以太网口的并行数据流,总带宽达到6×1Gb。另外iSCSI控制器上可以连接多个存储磁盘阵列,通过IP网络向以应用服务器提供存储资源服务。

        在iSCSI存储系统的iSCSI控制器上,iSCSI控制器软件作为操作系统内核模块在启动存储服务时被加载到操作系统内核中。iSCSI控制器模块负责iSCSI协议和SCSI协议之间的协议转换工作,并实现了对存储设备的控制管理和对应用服务器的请求进行管理等任务。其中,iSCSI控制器软件从软件体系结构上可以分为两部分:前端驱动(FETD)和SCSI中间层(STML),大体上说前者实现了iSCSI协议并负责iSCSI协议和SCSI协议之间的转换,后者实现了一个模拟SCSI目标器,负责对SCSI命令进行响应。本发明所提出的一系列方法均基于iSCSI控制器软件。

        本发明所提出的一系列方法在实现中可以划分成单独的子功能模块,各个功能模块之间的关系见图3。各子功能模块的类别及简要功能见下表:

                               表1模块列表模块名称模块功能网卡绑定模块把不同的网卡绑定为一个IP地址。实现不同的负载均衡算法,使得网络流量能够均衡的分布到各个网卡上,而当其中的一个链路失效时,网卡绑定模块会自动调整网络链路路径,实现高可用性。存储设备管理模块在设备启动模块初始化阶段,设备管理模块负责扫描连接在控制器上的存储设备,提供固定的虚拟设备标识符。在热插拔存储设备时,提供动态增减存储设备的功能。存储设备映射模块提供存储设备、iSCSI控制器IP地址和启动器IP地址三者的映射关系。控制启动器对存储网络中存储设备的访问权限,保护数据的安全。自适应IO负载控制算法自动适应存储设备的能力,控制低端存储设备上的并行IO负载,保证存储设备的安全平稳运行。多IO路径模块对不同的存储阵列通道进行IO请求控制。实现轮转(Round-Robin)和热备份(Active-Standby)两种配置方式,前者实现负载均衡以提高存储的IO吞吐率,后者实现了通道冗余。软件RAID模块以软件方式实现了RAID5和RAID6。块设备支持模块实现SCSI命令和块设备IO的相互转化,使得iSCSI存储系统的启动器能够连接多种非SCSI设备,包括虚拟块设备。

        下面对各个模块作详细描述。

        存储设备管理模块:

        在iSCSI存储系统中,启动器通过指定设备标识符连接到iSCS控制器上某个特定的存储设备。设备标识符即一个存储控制器上某个存储设备的标识,每个存储设备都对应着一个设备标识符。在常见的控制器模块中,设备标识符是按照设备的发现顺序赋值的,如:第一个存储设备的标识符是0,以此类推。这样做的缺点是,每次iSCSI控制器启动时设备的发现顺序可能是不一样的,而且当一个新的存储设备添加到iSCSI控制器后,原来的设备标识符将被打乱,因此在不同的时间同一个设备标识符可能对应着不同的存储设备。

        在Linux中,SCSI层驱动用host(主机适配器号)、channel(通道号)、target(目标号)和lun(逻辑单元号)四个变量来确定一个SCSI设备的位置,该位置是由硬件连接方式决定的。

        我们在iSCSI存储系统的控制器上实现了虚拟的目标标识符:虚拟目标标识符由一个13位的整数表示。其中,bit 12~bit 10表示设备的host,bit 9~bit 8表示设备的channel,bit 7~bit 4表示设备的target,最后4个bit表示设备的lun。

        host、channel、target和lun通过线形组合形成了虚拟的设备标识符并且保证了设备的(host,channel,target,lun)到设备标识符的一一对应关系。这样做的好处在于维护了存储服务的持续性,当一台iSCSI控制器节点重新启动后,该算法能够保证这个磁盘的虚拟设备标识符的一致性,应用服务器无需再重新配置就能够立即投入使用。

        iSCSI存储系统的控制器节点上维护着一个存储设备的列表ext_scsi_device以及表示存储设备被扫描次数的数组ext_target_valid_flag。如:

        stml_device

        *ext_scsi_device[MAX_HOSTS][MAX_CHANNELS][MAX_TARGETS][MAX_LUNS];

        int

        ext_target_valid_flag[MAX_HOSTS][MAX_CHANNELS][MAX_TARGETS][MAX_LUNS];

        int ext_scan_count;

        其中,Max_HOSTS,MAX_CHANNELS,MAX_TARGETS,MAX_LUNS分别表示host,channel,target,lun的最大值,它们分别是:8,4,16,16。stml_device是iSCSI存储系统中定义的表明一个存储设备的结构,ext_scsi_device是stml_device指针的数组。则ext_scsi_device[i][j][k][l]表示的是位于(i,j,k,l)处的存储设备,而ext_target_valid_flag[i][j][k][l]则相应的指出该设备被扫描的次数,ext_scan_count是iSCSI控制器扫描存储设备的次数。

        当iSCSI存储系统初始化时,ext_scsi_device各项为空且ext_target_valid_flag各项和ext_scan_count均为0。iSCSI存储系统的设备管理模块通过扫描SCSI的scsi_hostlist列表获取存储设备的信息。每次扫描存储设备列表时,ext_scan_count自增1,且每扫描到一个有效的存储设备时就构造一个stml_device并把ext_scsi_device相应的项指向它,最后把ext_target_valid_flag相应的项赋值成ext_scan_count。这样,通过比较ext_target_valid_flag相应的项和ext_scan_count就可以判断一个存储设备是否有效。如果ext_target_valid_flag不等于ext_scan_count,则说明在最后一次扫描中并未发现该设备,即该设备是无效的。

        iSCSI控制器模块提供了PROC接口,通过向PROC接口写入命令可以让设备管理模块重新对存储设备进行扫描。利用上述的方法,iSCSI控制器模块对设备重新进行扫描时并不影响现有有效设备的正常工作,这意味着iSCSI控制器可以在提供存储服务的同时对设备进行扫描。

        iSCSI存储系统扫描存储设备的时机是:iSCSI存储系统的iSCSI控制器被加载时;iSCSI存储系统增加了存储设备,存储管理员向iSCSI控制器发出重新扫描的命令;iSCSI存储系统减少了存储设备,存储管理员向iSCSI控制器发出重新扫描的命令。

        而Linux的SCSI系统提供了动态增减SCSI设备的PROC接口,删除一个SCSI设备:

        echo″scsi remove-single-device a b c d″>/proc/scsi/scsi

        类似,增加一个SCSI设备:

        echo″scsi add-single-device a b c d″>/proc/scsi/scsi

        其中:

              a是主机适配器号(从0开始)

              b是通道号(从0开始)

              c是目标号(从0开始)

              d是逻辑单元号(从0开始)

        通过这个PROC接口,存储管理员可以动态更新Linux SCSI层的设备列表。iSCSI存储系统的设备管理模块和Linux的动态更新机制配合使用就可以实现iSCSI存储系统的存储设备动态增减的功能。

        当存储管理员向iSCSI存储系统控制器添加新的存储磁盘后,存储管理员首先用add-single-device向SCSI增加设备并向控制器发起重新扫描存储设备的命令,iSCSI控制器将对连接在上面的存储设备进行扫描并发现新磁盘,添加到存储设备列表中。反之,当存储管理员需要删减一个存储设备时,先用remove-single-deivce从SCSI系统中删除设备,然后让iSCSI控制器重新扫描存储设备,在iSCSI存储系统控制器的设备列表中,被删除的存储设备将不再有效。

        显然,正在使用的存储设备从逻辑上是不可以被删除的。在Linux系统中,Scsi_Device用于描述一个SCSI设备,Scsi_Device有一个表示存储设备引用计数的access_count域。这样,当一个磁盘被前端使用时,我们把该磁盘的access_count增1,反之access_count减1。在remove-single-device的时候SCSI系统会首先判断一个存储设备的access_count是否为0,对于access_count非0的存储设备,SCSI系统不会把它们删除掉。引用计数保证了正在使用的存储设备不会因为误删而导致存储服务的异常。

        由此,实际上实现了在不停止服务前提下的存储设备动态发现,存储设备动态增减,是整个iSCSI存储系统满足7×24小时高速的在线访问需求与业务的可持续性的重要保障。

        存储设备管理模块的存储设备扫描和删除一个存储设备的流程如图7所示。

        网卡绑定模块:

        将多块网卡虚拟成为一块网卡,使其具有相同的IP地址,来实现提升主机的网络吞吐量或者是提高可用性,这种技术被称作链路聚合(Channel bonding)。我们在Linux下自主实现了符合IEEE 802.3ad标准的多网卡轮转(Round-Robin)和热备份(Active-Standby)两种发送模式,提高了应用服务器和iSCSI控制器的可用性并提供网卡的负载均衡从而提高了效率。如图4所示。

        iSCSI存储系统绑定模块在IEEE 802.3ad标准框架下支持以下两种传输模式:

        1.轮转模式(自主实现):基于网卡的顺序,依次轮转通过不同网卡发送数据;从而实现大于一个单一链路的发送性能。

        2.热备份模式:确保在同一时刻仅仅通过一个网卡发送数据,另外一个作为该激活卡的热备份,在激活卡出现故障时数据流马上切换到热备份卡。

        针对不同的应用需求,我们在较大规模的存储网络中使用以太网交换机,以达到较高可用性和较好的可扩展性,而由于以太网交换机的功能限制(多数主流交换机对IEEE 802.3ad协议支持的不完备),只能实现发送的负载均衡(Transmit Load Balancing),无法实现接收负载均衡(Receive Load Balancing)。而在需要较高性能的小规模应用中,我们采用了千兆交叉线直连的结构,利用轮转模式的绑定模块实现了接收和发送的负载均衡,从而达到了很高的网络性能:测试中,在两条千兆连接的直连拓扑下,TCP数据报发送和接受达到172Mbyte/s,UDP数据报协议更达到192Mbyte/s。

        存储设备映射模块:

        在实际应用中,网络存储系统被关心的一个问题就是对于数据访问安全性的考虑。基于IP地址的存储设备映射实现了启动器对虚拟设备标识符访问权限的控制。如附图5所示,存储设备映射模块允许iSCSI控制器网卡IP地址和启动器IP地址的双层过滤。简而言之,存储设备映射模块对一个IO请求的源IP地址、目的IP地址和目的磁盘的设备标识符进行权限判定,判定的依据是存储管理员所写入的权限规则。访问权限分为三个级别:完全访问、只读访问和禁止访问。

        设备映射模块是作为一个单独的操作系统内核模块(Kernel Module)方式存在的,存储管理员可以根据需要决定是否加载。

        由于采取了iSCSI控制器上的IP和启动器IP的两层匹配,而对设备的权限级别较传统的映射方法多了只读访问,存储管理员对存储设备的分配更加灵活。而权限规则的引入则简化了存储管理员的操作。

        对于存储管理员而言,一个规则的格式如:

        [源IP地址][源地址掩码][目的IP地址][TargetID][访问权限]

        而在存储设备映射模块中,规则的结构定义如下:

        struct target_mapping_rule{

                   struct list_head     list;

                   struct list_head     hash_list;

                   _u32  target_id;

                   _u32  src_addr;

                   _u32  net_mask;

                   _u32  dest_addr;

                   _u8   permission;

        };

        其中,target_mapping_rule是描述映射规则的结构,list_head结构用于把所有规则连接成为链表,list是一般的双向链表,而hash_list是散列链表,用于高速查询规则。target_id指明此所匹配的设备标识符,如果该字段的值是0xffffffff则匹配所有的存储设备。src_addr和dest_addr分别制定启动器的IP地址和iSCSI控制器的IP地址,同样,如果这两个字段的值是0xffffffff则匹配所有的IP地址,net_mask字段是src_addr的子网掩码。字段permission指明权限,包括完全访问,只读访问和禁止访问。

        存储设备映射模块以PROC的形式向存储管理员提供写入规则或查看规则的接口,另外通过该接口,存储管理员可以启用存储设备映射模块或者停止存储设备映射模块。映射模块把写入的规则解析成target_mapping_rule结构并插入模块的规则列表。

        存储设备映射模块把向PROC接口写入的规则解析成target_mapping_rule结构,并以链表的形式组织。存储设备映射通过查询这个链表决定一个应用服务器对某个存储设备的访问权限。

        存储设备映射在三个环节上对启动器的访问进行控制:存储设备发现,存储设备连接和IO读写操作。应用服务器(启动器)从iSCSI控制器取得存储设备列表的过程即存储设备发现过程。应用服务器通过发送命令从iSCSI控制器请求返回存储设备列表,存储设备映射模块截获这个命令并对iSCSI控制器的存储列表进行过滤,最终只把该应用服务器可见的存储设备列表返回;应用服务器在取得存储设备的列表后,应用服务器可以把某个指定的存储设备连接到本地,这个过程即存储设备连接过程。当应用服务器试图对一个对之禁止的存储设备进行连接时,存储设备映射模块立即中断该应用服务器到iSCSI控制器的网络连接;应用服务器在成功连接存储设备后,就可以对存储设备进行读写操作。存储设备映射模块对所有IO流进行监测,一旦发现某个IO请求是不被允许的(如对只读的存储设备进行写操作),存储设备映射模块丢弃该IO请求,并向应用服务器返回出错信息。

        在实现上,存储设备映射模块在FETD(前端驱动)中的对设备发现的响应函数中增加了权限检查的过程。首先,对所有可能的虚拟存储设备标识符进行遍历,如果该虚拟存储设备标识符有效并且根据规则列表判定该存储设备标识符对应用服务器的IP地址和iSCSI控制器的IP地址是可见的(可完全访问或只读访问),则把该存储设备标识符放入准备返回的存储设备标识符列表中。

        在处理应用服务器连接存储设备的请求时判断该存储设备对应用服务器是否可见。存储设备连接的过程中,应用服务器和iSCSI控制器的iSCSI参数需要进行协商,以确定应用服务器和iSCSI控制器的传输参数。我们把应用服务器所试图连接的存储设备标识符也作为一个双方协商的参数。在协商时,存储设备映射模块判断该存储设备标识符对于应用服务器是否可见,如果不可见则中断协商过程,返回协商失败的消息,最终让iSCSI控制器断开到应用服务器的网络连接。

        存储设备映射模块在SCSI中间层(STML)中增加对IO操作进行过滤处理。为了表明对存储设备的访问权限,在表示命令的结构中增加一个表示权限的域authority。设置SCSI命令权限的步骤如下,首先取得发出这个命令的启动器的IP地址、iSCSI控制器的IP地址和该命令的目的设备标识符,然后在规则列表中查询对应的权限赋予该命令的authority域。

        在IO操作阶段,存储设备映射模块首先判断SCSI命令的命令类型。对于写命令,需要分配缓冲区,并且根据规则设置这个命令的权限,最后把命令放入等待队列,等待所需写入数据的到来。接收到数据后,把相应的SCSI命令从等待队列中取出,并检测命令的权限,判别该命令可否被执行。如果允许执行,则把该命令放入分发队列,否则丢弃该命令并构造SCSI响应向启动器报告错误。对于读命令,直接根据规则设置这个命令的权限,再检测命令的权限,判别该命令可否被执行。如果允许执行,则把该命令放入分发队列,否则丢弃该命令并构造SCSI响应向启动器报告错误。

        该模块的程序流程图如图8所示。

        自适应IO负载控制算法:

        对于一些性能较低的存储设备,过高的IO请求会导致设备驱动的异常,从而导致整个系统的崩溃,因此有必要在iSCSI控制器上引入对IO负载的控制。而一般的iSCSI存储系统普遍缺乏对IO负载的监控机制,本发明实现了基于SCSI命令的IO负载控制功能。

        在表示一个存储设备的stml_device结构中,can_queue和cmd_pending两个域分别表示这个设备同时所能处理的SCSI命令队列长度和目前正处于SCSI的执行队列中的SCSI命令的个数,在任何时刻都应当保证cmd_pending小于can_queue。

        在SCSI中间层(STML)中,我们用不同的状态来标识一个SCSI命令的所处的流程,其中一个状态是ST_HOLD_ON。ST_HOLD_ON状态是实现负载控制的关键,所有到达SCSI中间层(STML)且准备完毕可以立即执行的命令因为cmd_pending到达can_queue的阈值而未能得到执行的命令的状态均被设置成ST_HOLD_ON状态。ST_PENDING状态则表明命令正处于等待状态。

        当SCSI中间层(STML)处理一个SCSI命令时,如果命令是写命令且尚未接收到存储数据时,把命令的状态置成ST_PENDING状态并返回,否则把命令的状态置成ST_HOLD_ON状态,然后判断目标存储设备的cmd_pending是否小于can_queue,如果是则调用scsi_do_req执行SCSI命令并且把存储设备的cmd_pending增1,scsi_do_req执行完毕后将回调函数te_cmnd_processed。其中,scsi_do_req是Linux系统SCSI层提供的接口函数,用于执行SCSI命令,而te_cmnd_processed是中间层中定义的函数,它的地址被传入SCSI层并总是在SCSI命令执行完毕时被回调执行。在te_cmnd_processed中cmd_pending减1,这样,cmd_pending的值就是正处于SCSI的执行队列中的SCSI命令的个数。如果cmd_pending已经到达域值can_queue,则SCSI命令维持在ST_HOLD_ON的状态,等待下一轮处理。同样在handle_cmd函数中,如果发现一个命令的状态是ST_HOLD_ON,判断目标存储设备的cmd_pending是否小于can_queue,如果是则调用scsi_do_req执行该SCSI命令。这样就可以把cmd_pending数目保持在can_queue以下,保证了存储设备正常平稳的工作。该模块的程序流程图如图9所示。

        多IO路径模块:

        多IO路径模块充分利用具有双控功能磁盘阵列的双通道功能,实现了多个SCSI通道之间的冗余和提高iSCSI存储系统并发IO能力。如图6所示。

        在多IO路径模块中,用下面数据结构来记录多IO路径算法的相关信息:

        #define MAX_PATH      4;

        int multipath_host0[MAX_PATH],multipath_host1[MAX_PATH];

        struct multipath_private_data{

              stml_device*scsi_device;

              int host;

              unsigned int ext_device_state;

              unsigned int multi_device_state;

        }

        multipath_conf[MAX_HOSTS][MAX_CHANNELS][MAX_TARGETS][MAX_LUNS];

        其中,MAX_PATH的值表示最大通道数,multipath_host0、multipath_host1记录多IO路径模块中的SCSI适配器所对应的主机适配器号。多IO路径模块用分别用两个数组来存放multipath_host0和multipath_host1的相关信息,这两个数组分别是ext_scsi_device和multipath_conf。连接在multipath_host0所表示的SCSI适配器上的存储设备的相关信息记录在ext_scsi_device数组中,连接在multipath_host1所表示的SCSI适配器的存储设备的相关信息记录在multipath_conf数组中。例如,多IO路径中的主机适配器号分别为host1与host2,则multipath_host0[0]=1,multipath_host1[0]=2,连接在host1的存储设备的相关信息保存在ext_scsi_device[1][][][]中,而连接在host2的存储设备的相关信息保存在multipath_conf[2][][][]中,ext_device_state与multi_device_state分别记录两个通道的状态。

        多IO路径模块实现了以下两种主要方式:

        (1)热备份(Active-Standby)方式:IO请求始终向两个通道其中的一个发送,这个通道即激活(Active)通道,另外一个作为备用冗余。当多IO路径模块发现IO请求在激活通道执行失败后,立即激活备用通道并转到向备用通道发送IO请求。

        (2)轮转(Round-Robin)方式:IO请求以轮转算法轮流向两个通道发送。

        为了实现命令失败后的重发,在SCSI中间层(STML)中用状态ST_PATH_FAIL表示一个SCSI命令在现在的激活通道上执行失败,当多IO路径模块探测到一个SCSI命令执行失败后,就把这个命令的状态设置成ST_PATH_FAIL并再次放入队列中。如果一个命令的状态是ST_PATH_FAIL,则需要选择另外一个通道执行。

        多IO路径模块对SCSI命令处理流程如下:

        (1)多IO路径模块接收到一个SCSI命令后,先判断这个命令是否是写命令。

        (2)如果不是写命令,则直接把该命令放入分发命令队列中。否则,为写命令分配数据缓冲区并把该命令放入等待队列,等待数据到达。如果数据到达,则从等待队列中取出该命令放入分发命令队列。

        (3)对于分发命令队列中的命令进行判断是否有可选择的IO路径,如果没有则退出,如果有,则根据策略选出一条可用的IO路径,并把命令发送到该路径并等待执行结果,如果执行正确则返回,否则把该命令放入重试队列中,进行下一轮的路径选择。

        多IO路径模块的程序流程如图10所示。

        存储管理员通过多IO路径模块提供的PROC接口设置多IO路径模块的方式,实现在iSCSI控制器上IO路径的多通道冗余或提高iSCSI控制器的IO并发能力。

        软件RAID模块:

        在传统的应用中,存储的RAID的功能一般由硬件RAID卡完成,而iSCSI存储系统的软件RAID模块可以把多个具有SCSI接口的磁盘以软件方式组织成为RAID5或RAID6冗余存储阵列。iSCSI控制器把单独的磁盘组织成存储阵列提供给应用服务器,应用服务器对这些存储阵列发出的SCSI命令成为虚拟SCSI命令,虚拟SCSI命令到达iSCSI控制器后,必须被分解成针对单个物理磁盘的SCSI物理SCSI命令。另一方面,物理SCSI命令执行的结果也需要在iSCSI控制器上组合成为对应用服务器的SCSI响应。软件RAID模块所做的就是把针对RAID存储阵列的虚拟SCSI命令根据不同的RAID算法转化为物理SCSI命令,并且把物理SCSI命令在各个单独物理磁盘上的执行结果合并成为对虚拟SCSI命令的响应结果。

        根据以上所述,SCSI命令的处理过程主要包括三个步骤:

        1.虚拟SCSI命令到物理SCSI命令的拆分

        2.物理SCSI命令的处理

        3.物理SCSI命令结果对虚拟SCSI命令的反馈

        软件RAID模块的全局变量target_data维护两个命令队列:一个是虚拟SCSI命令队列,另一个是物理SCSI命令队列。其中虚拟SCSI命令队列负责对从前端驱动(FETD)传递过来的虚拟SCSI命令进行处理。通过对虚拟SCSI命令的逻辑地址信息和其他参数进行分析,一个虚拟SCSI命令可以拆分成一个或多个物理SCSI命令,每个物理SCSI命令能由SCSI层进行执行操作。当一个虚拟SCSI命令对应的所有物理SCSI命令都处理完后,通过分析各个物理SCSI命令的响应结果,从而形成一个对虚拟SCSI命令的响应结果。而物理SCSI命令队列负责对物理SCSI命令的处理。

        为了实现上述功能,虚拟SCSI命令必须至少包含虚拟SCSI命令的状态和虚拟SCSI命令的标识;而物理SCSI命令必须包含如下字段:物理SCSI命令的状态,物理SCSI命令所属的虚拟SCSI命令,以及该物理SCSI命令的序号。

        在处理虚拟SCSI命令的函数中,从前端驱动(FETD)接收到的虚拟SCSI命令被封装成一个Target_Virtual_Scsi_Cmnd结构,并把该虚拟命令插入虚拟命令队列。

        下列的几个步骤是虚拟SCSI命令处理过程的主要步骤。

        是把虚拟SCSI命令分解成物理SCSI命令,并把物理SCSI命令插入相应队列,同时维护虚拟SCSI命令和物理SCSI命令之间的关系和状态。

        每次有一个物理SCSI命令返回后,通过该命令检测原始命令队列,如果发现有对应的所有物理SCSI命令已经处理完成的虚拟SCSI命令,则改变该虚拟SCSI命令的状态,然后进行对虚拟SCSI命令返回结果的模拟。

        这样我们只要作如下更改,就可以实现对STML的扩展,从而使之适合软件RAID模块。

        在上面所述的基础上,我们可以把一条针对RAID5/RAID6的SCSI命令进行命令拆分、执行和结果合成。

        软件RAID需要模拟一系列的读写命令,包括:READ(6)/WRITE(6),READ(10)/WRITE(10),READ(12)/WRITE(12)和READ(16)/WRITE(16)。这些命令的区别在于命令长度不一样,因此它们的寻址范围和一次请求的长度都不大一样。对不同长度命令的解析过程也不尽相同。

        如READ(10)命令的第0字节是操作码,它还包括块逻辑地址(LBA,Logical Block Address)和传输长度等信息。其中块逻辑地址位于该命令的第2到第5字节,因此READ(10)命令的逻辑地址LBA可用下列的公式计算(其中cmnd为SCSI命令):

        lba=(cmnd[2]<<24)+(cmnd[3]<<16)+(cmnd[4]<<8)+cmnd[5];

        根据计算公式得到命令的块逻辑地址后,我们就能计算出读请求在虚拟设备中的偏移位置:

        seek=lba*BLOCKSIZE

        BLOCKSIZE的大小一般为512字节。

        而READ_10命令所请求的块数可以计算如下:

        num=cmd[8]+(cmd[7]<<8)

        在解析成LBA地址和请求传输长度之后,软件RAID模块根据不同的RAID算法以及RAID的配置信息得出针对每一个磁盘的读写偏移、读写数据及其长度,并且重新构造成针对实际磁盘的物理SCSI命令。

        之后RAID模块调用scsi_do_req对每个物理命令进行执行并得到其结果,再把所有的结果合成一个结果。

        除了读写操作之外,软件RAID模块还需要对启动器发起的一些查询命令做出响应,如INQUIRY命令。对于这些命令,我们可以根据配置信息直接返回其结果。

        块设备支持模块:

        块设备支持模块实现SCSI命令到块IO请求转化,并把块IO的请求结果封装成SCSI结果。这实际上相当于在一般的块设备上增加了一层SCSI接口层。块设备支持模块不仅能够支持不具备SCSI接口的物理设备,如IDE磁盘,也能够支持包括LVM,MD在内的虚拟块设备,而LVM实现了虚拟化存储,MD实现了软件RAID功能,显然块设备支持扩大了iSCSI存储系统对存储设备的支持范围,扩展了iSCSI存储系统的功能。

        块设备支持模块实现的重点在于对SCSI读写命令的解析和对SCSI读写命令返回结果的模拟。块设备支持模块首先需要从前端发送过来的SCSI读写命令解析成为块设备读写请求,主要是设备地址和数据读写长度的解析。然后把块设备请求执行的结果转化成为SCSI命令的请求结果用于相应前端。

        下面分别就SCSI的读请求和写请求对这个处理过程作简要的介绍。

        对于读请求,块设备支持模块首先从SCSI请求中解析出LBA地址和所读取的数据长度,然后根据LBA地址算出虚拟设备中对应的偏移地址,再把偏移地址、数据长度和数据缓冲区地址传递给块设备读取数据。等待块设备把数据读入到数据缓冲区后,块设备支持模块设置SCSI请求的状态域并把它返回iSCSI控制器SCSI中间层(STML)。

        对于写请求。块设备支持模块同样从SCSI请求中解析出LBA地址、数据长度以及把启动器端发送过来的数据存放如数据缓冲区中,然后根据LBA地址算出虚拟设备中对应的偏移地址,再把偏移地址、数据长度和数据缓冲区地址传递给块设备层对块设备写入SCSI请求的数据缓冲区中的数据。等待块设备层操作成功后,块设备支持模块设置SCSI请求的状态域并把它返回SCSI中间层(STML)。

        块设备支持模块支持的SCSI读写命令包括:READ(6)/WRITE(6),READ(10)/WRITE(10),READ(12)/WRITE(12)和READ(16)/WRITE(16)。这些命令的解析过程和在RAID模块中的拆分过程类似。所不同的是其执行和结果合成的过程不同。在本发明的实现中,对块设备的打开关闭和读写操作是调用内核的filp_open/filp_close,f_op->llseek,f_op->read和f_op->write完成的。

        块设备支持模块的流程图如图11所示。

        测试结果: 

        性能测试

        对iSCSI存储系统的测试分别从IO吞吐率(throughput),平均反应时间(average responsetime)两方面进行。这两者是衡量iSCSI存储系统性能的重要指标。测试在一台iSCSI控制器和三台前端服务器上进行。I/O节点机采用32位安腾2.4GHZ双CPU服务器,内存2GB,操作系统为Linux(Kernel 2.4.26)。存储子系统采用Qlogic公司的QLA2200光纤通道卡,以及由2个Odysys公司的磁盘柜。在iSCSI控制器上我们安装有6块千兆以太网卡,并且每两个绑定为一个IP,前端服务器每台安装有2块网卡,均绑定为一个IP,前端服务器和iSCSI控制器用直连线相连,Bonding算法选择Active-Standby方式。

        在测试中,我们测试了在不同块大小下完全顺序读写的吞吐率和平均反应时间,测试工具是intel的iometer,结果如下表所示。

                  表2IO吞吐率 数据块大小  IO吞吐率(Mbytes/s) 读 写 64KB 126.10 120.30 128KB 126.77 120.70 512KB 126.23 120.96 1024KB 125.93 120.94 2048KB 126.13 120.48 4096KB 126.38 120.97

              表3平均响应时间数据块大小平均响应时间(ms) 读 写 64KB 2.95 3.10 128KB 11.87 12.38 512KB 23.81 24.79 1024KB 47.55 49.55 2048KB 94.91 99.11 4096KB 190.21 198.74

        上述结果表明,iSCSI存储系统具有较高的IO吞吐率和较短的平均响应时间。

        网络链路冗余测试:

        此项测试的目的是测试IO控制器进行多网卡绑定并配置成为以热备份算法传输时的链路冗余功能。

        在测试中,我们把IO控制器上的两块网卡绑定成一个IP,同样把应用服务器的两块网卡绑定成一个IP,并设定网卡绑定模块的传输算法为热备份方式。IO控制器上两块网卡分别通过直连线和应用服务器的两块网卡相连接,按照以下步骤进行测试:

        (1)启动IO控制器的iSCSI存储服务,启动应用服务器iSCSI启动器软件把iSCSI系统上一个存储设备映射到本地,并启动应用程序对iSCSI存储设备进行读写。在IO控制器上启动traffic工具对两个网卡的流量进行监控,这时可以看到数据流通过激活(Active)链路进行传输。

        (2)人为拔掉激活链路的网线。这时可以看到数据流立即切换到原来的备份链路。应用服务器上的应用程序读写没有察觉出明显的影响。

        (3)把网线重新插好,再拔掉原来的备份网线。可以看到数据流立即切换到原来的链路。应用服务器上的应用程序读写没有察觉出明显的影响。

        上面的测试表明,iSCSI存储系统通过网卡绑定提供了网络链路级的冗余,提高了系统的可用性。

        多IO路径模块测试:

        此项测试的目的是测试IO控制器的多IO路径模块的通道冗余功能。

        在测试中,我们在IO控制器安装两块SCSI卡,并通过两根SCSI数据线和一个双通道磁盘阵列的两个通道连接,按照以下步骤进行测试:

        (1)启动IO控制器的iSCSI存储服务,启动应用服务器iSCSI启动器软件把iSCSI系统上的双通道磁盘阵列设备映射到本地,并启动应用程序对阵列进行读写。

        (2)人为断掉其中正在使用的SCSI数据通道。应用程序读写没有受到明显的影响。

        (3)把SCSI数据线重新插好,再断掉另外一个SCSI数据通道。应用服务器上的应用程序读写没有察觉出明显的影响。

        上面的测试表明,iSCSI存储系统通过提供了SCSI数据通道级的冗余,提高了系统的可用性。

        设备管理模块测试:

        此项测试主要测试设备管理模块的在线添减存储设备的情况。分别分以下几种情况测试:

        1.删除正在读写的存储设备。这种情况模拟在应用服务器正在读写某块磁盘时此磁盘发生物理故障,需要删除更换的情况。

        按照以下步骤测试:

        (1)启动IO控制器的iSCSI存储服务,启动应用服务器iSCSI启动器软件把iSCSI系统上一个存储磁盘映射到本地,在应用服务器上启动用应用程序对该磁盘进行读写操作。

        (2)在IO控制器上调用iscsi_remove脚本,通过iSCSI存储系统设备管理模块提供的PROC接口发出删除该磁盘的命令。

        (3)可以看到,应用服务器上应用程序的读写操作停止。过一段时间后,应用服务器到IO控制器的网络链路中断,应用服务器上映射过来的存储磁盘消失,应用程序中断读写。

        从以上的测试可以看出,在存储设备出现物理故障的情况下,iSCSI系统能够安全的删除该设备。

        2.正在读写时删除其他存储设备。这种情况模拟在应用服务器正在读写时,某块不在读写的磁盘发生物理故障,需要删除更换的情况。

        按照以下步骤测试:

        (1)启动IO控制器的iSCSI存储服务,启动应用服务器iSCSI启动器软件把iSCSI系统上一个存储磁盘映射到本地,在应用服务器上启动用应用程序对该磁盘进行读写操作。

        (2)在IO控制器上调用iscsi_remove脚本,通过iSCSI存储系统设备管理模块提供的PROC接口发出删除IO控制器上另外一个磁盘的命令。

        (3)可以看到,应用服务器上应用程序的读写没有受到任何影响。而应用服务器上的iSCSI启动器的存储设备列表中已经看不到被删除的磁盘。

        从以上的测试可以看出,iSCSI存储系统提供了在不停止存储服务的情况下删除存储设备的功能。

        3.正在读写时增加一个存储设备。这种情况模拟在应用服务器正在读写时,需要增加存储资源的情况。

        按照以下步骤测试:

        (1)启动IO控制器的iSCSI存储服务,启动应用服务器iSCSI启动器软件把iSCSI系统上一个存储磁盘映射到本地,在应用服务器上启动用应用程序对该磁盘进行读写操作。

        (2)在存储资源中增加一块物理磁盘,在IO控制器上调用scsi_add脚本,使得SCSI更新存储设备列表,再调用iscsi_rescan脚本通过iSCSI存储系统设备管理模块提供的PROC接口发出重新扫描存储设备列表的命令。

        (3)可以看到,应用服务器上应用程序的读写没有受到任何影响。而应用服务器上的iSCSI启动器的存储设备列表中增加了刚刚所加进来的磁盘。

        从以上的测试可以看出,iSCSI存储系统提供了在不停止存储服务的情况下增加存储设备的功能。

        块设备支持模块测试:

        在此项测试中,我们在IO控制器上创建一个内存虚拟盘(所有读写操作均在内存中),一个硬件RAID0阵列,一个MD模块RAID0虚拟设备。虚拟设备是一个块设备,不具备SCSI接口,需要块设备支持模块的支持。我们在应用服务器上分别用IOMeter测试内存盘,SCSI磁盘和块设备支持模块的虚拟盘,得出IO吞吐率和IO延时。在此项测试中,应用服务器只有一台。在块大小为1MB,的情况下,测试结果如下:

                  表4IO吞吐率(MB/s)内存盘 硬件RAID0 虚拟RAID0读操作66.47 24.66 50.23写操作69.41 28.35 51.61

                     表5IO延时(ms)内存盘 硬件RAID0 虚拟RAID0读操作0.23 0.63 0.31写操作0.22 0.55 0.29

        从以上两表可以看到:

        对于读请求,虚拟RAID0卷的IO吞吐率是硬件RAID0卷的IO吞吐率的2.04倍。而对于写请求,这个值是1.82倍。

        对于读请求,虚拟RAID0卷的IO延时是硬件RAID0卷的IO延时的20%。而对于写请求,这个值是23%。

        测试表明,块支持模块可以很好的支持虚拟块设备,并且提供了高性能的协议转换机制。测试中虚拟的块设备的性能甚至高于硬件设备,这主要是由于块设备层高速缓存(Cache)的作用。

    关 键  词:
    一种 ISCSI 存储系统 实现 方法
      专利查询网所有文档均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    0条评论

    还可以输入200字符

    暂无评论,赶快抢占沙发吧。

    关于本文
    本文标题:一种ISCSI存储系统的实现方法.pdf
    链接地址:https://www.zhuanlichaxun.net/p-641073.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2017-2018 zhuanlichaxun.net网站版权所有
    经营许可证编号:粤ICP备2021068784号-1