一种基于scsi设备的容错方法及系统的制作方法

文档序号:10612687阅读:422来源:国知局
一种基于scsi设备的容错方法及系统的制作方法
【专利摘要】本发明提供一种基于SCSI设备的容错方法及系统,所述方法包括:上层应用系统通过通用块设备层对SCSI设备提出访问请求;通用块设备层接收所述访问请求并进行处理,以及将处理结果返回给上层应用系统;上层应用系统接收所述处理结果,确定所述请求失败后构造SCSI读写命令,然后通过SG字符设备重新发起对所述SCSI设备的访问,并接收所述SCSI设备返回的响应;根据所述SCSI设备返回的响应进行错误处理。本发明提供的基于SCSI设备的容错方法及系统可以准确感知底层SCSI设备的错误,提高了硬盘利用率。
【专利说明】
一种基于SCSI设备的容错方法及系统
技术领域
[0001]本发明涉及互联网技术领域,特别涉及一种基于SCSI设备的容错方法及系统。
【背景技术】
[0002]随着网络和通信技术的发展,在云存储、电信网络和互联网等应用中,需要存储大量的数据,并且需要对存储的数据进行连续不间断的访问,这种情况下,就需要使用具备大存储量、较高的数据吞吐量和低成本的采用小型计算机系统接口(Small Computer SystemInterface,SCSI)的存储设备。常见的SCSI设备包括硬盘,CD-ROM,DVD,磁带机等。由于需要对SCSI存储设备进行连续不间断的访问,这就难免会发生SCSI访问错误,及时准确的识别并处理发生的SCSI访问错误,才能保障数据安全,并保持业务的稳定性和可靠性。
[0003]SCSI总线协议中定义了一种随命令响应返回的错误信息码,用于指示命令失败的原因或设备所处的异常状态,Linux操作系统中的SCSI驱动程序获得并处理了 SCSI错误码信息。SCSI驱动程序是一种分层的架构,共分为三层:上层、中层和底层,其中对错误码进行处理在中层和上层实现,其处理方式主要有两种:重试,或者直接通知上层应用1命令没有成功执行。
[0004]在Linux操作系统下,应用从用户空间访问SCSI设备有以下几种方式:(I)通过文件系统提供的文件访问接口进行访问;(2)通过裸设备进行访问,上层应用直接使用操作系统提供的POSIX接口对SCSI设备进行访问;(3)通过SCSI PASS THROUGH方式访问,即上层应用在用户空间直接访问Li nux提供的SG字符设备,应用可以直接发⑶B命令给这个SCSI设备,通过该接口,用户既可以做一些SCSI管理操作,如查询设备基本描述信息等,也可以发送读写数据命令。请参阅图1,通过文件系统或者裸设备进行访问时,都要经过内核的通用块层,当1从底层返回时,先经过第一层回调通知中层,对于处理成功的命令,SCSI中层会调用第二次回调通知到块层,对于SCSI中层判断需要重试的命令,则会被加入块请求队列重新被处理。对于SCSI中层判断需要直接返回或超过允许重试次数的命令,通过第二次回调返回到设备访问层后,错误码会被转换成块层的E1等错误,进而返回给用户态应用程序,用户无法感知SCSI设备具体发生了什么故障。通过SCSI PASS THROUGH方式访问时,用户态应用程序按照SCSI标准构造⑶B读写命令字,通过1CTL方式直接向SG字符设备发起请求并接收返回信息,此种方式的1请求是同步请求,没有经过内核通用块层及其它算法的处理直接到达SCSI层,虽然读写性能不高,但每个命令都会有相应的SCSI返回码,根据返回码,可以很清楚的了解SCSI设备硬件当前的情况。
[0005]现有技术的分布式存储系统一般通过文件系统接口或者内部调用裸设备接口的方式来实现对最终硬盘数据的访问,通过文件系统接口或者裸设备接口对SCSI硬盘进行1访问时经过了通用块层,无法获取SCSI硬盘的错误码,无法获知SCSI访问错误的具体错误类型,在硬盘出错时,无法容忍错误,只能直接将出错的硬盘踢出集群启动数据重构,或者向用户告警触发人工检查硬盘健康状态。
[0006]公开号为CN103543960A的专利提供了一种存储数据的方法,将SCSI命令直接提交至底层驱动,在进入内核态后绕过通用块层,避免使用B1接口,通过此方案中的A1接口访问SCSI设备,在遇到硬盘错误时能够直接判断出硬盘的具体错误类型。但是其存在以下缺点:1、需要改造内核,绕过通用块层工作量较大;2、通用块层的1调度算法以及cache机制成熟稳定,在一定程度上提高了应用程序访问SCSI设备的性能,该方案无法利用这些优势;
3、只能使用A1接口通过裸设备的方式访问,无法使用Ext4/XFS等主流文件系统,有很大局限性。
[0007]公开号为CN103220162A的专利提供了一种基于HDFS的SCSI容错优化方法及装置,通过修改内核SCSI层,使SCSI层可以感知HDFS的副本策略,在SCSI中层收到底层的第一次回调时就进行处理,可以提高1效率以及减少硬件故障率。但是,其需要修改系统内核的SCSI层,成本较高。由于硬盘出错是低概率事件,为了提高此低概率事件下的1效率,而对整个内核SCSI层进行改造,使内核去感知HDFS上层副本策略,增加了大量成本。
[0008]公开号为CN102222033A的专利提供了一种保存小型计算机系统接口访问错误的方法及装置,能够及时保存SCSI错误信息,并使得应用系统基于保存的SCSI错误信息准确快速的获取SCSI错误信息,以根据该SCSI错误信息快速确定存储设备的故障类型。但是其是基于保存的SCSI错误信息进行判断,容易出现判断错误,同时对未保存的错误信息也无法进行准确判断。

【发明内容】

[0009]针对以上问题,本发明专利目的在于设计了一种基于SCSI设备的容错方法及系统,可以准确感知底层SCSI设备的错误,提高了硬盘利用率。
[0010]本发明提供的具体技术方案如下:
[0011 ] —种基于SCSI设备的容错方法,包括:
[0012]上层应用系统通过通用块设备层对SCSI设备提出访问请求;
[0013]通用块设备层接收所述访问请求并进行处理,以及将处理结果返回给上层应用系统;
[0014]上层应用系统接收所述处理结果,确定所述请求失败后构造SCSI读写命令,然后通过SG字符设备重新发起对所述SCSI设备的访问,并接收所述SCSI设备返回的响应;
[0015]根据所述SCSI设备返回的响应进行错误处理。
[0016]本发明还提供一种基于SCSI设备的容错系统,包括:
[0017]通用块设备模块,用于接收上层应用系统的访问请求并进行处理;
[0018]判断模块,用于根据处理结果判断所述请求是成功;
[0019]第一处理模块,用于在确定所述请求失败后构造SCSI读写命令,
[0020]SG字符设备模块,用于重新发起对SCSI设备的访问,并接收所述SCSI设备返回的响应;
[0021]第二处理模块,用于根据所述SCSI设备返回的响应进行错误处理,以及返回上层应用系统请求结果。
[0022]进一步,本发明所述根据所述SCSI设备返回的响应进行错误处理,进一步包括:
[0023]如果所述SCSI设备返回的响应为命令执行成功,则向所述上层应用系统返回本次访问请求成功;
[0024]如果所述SCSI设备返回的响应为命令执行失败,则判断所述SCSI设备返回的响应的错误类型,并根据所述错误类型进行修复。
[0025]进一步,本发明所述根据所述错误类型进行修复,进一步包括:
[0026]若所述SCSI设备返回的响应的错误类型为可通过覆盖写方式修复的读错误,则由所述上层应用系统获取冗余数据后执行覆盖写操作实现修复;
[0027]若所述SCSI设备返回的响应的错误类型为可通过坏块映射方式修复的写错误,则由所述上层应用系统将写操作重定向到预留区域,并标记该数据块损坏实现修复;
[0028]若所述SCSI设备返回的响应的错误类型为其它错误,则向所述上层应用系统返回具体的错误码,并记录容错失败事件。
[0029]进一步,本发明所述确定所述处理失败后构造SCSI读写命令,进一步包括:
[0030]若所述上层应用系统通过裸设备接口直接对所述通用块设备接口进行访问时,则基于本次访问的通用块设备地址构建所述SCSI读写命令;
[0031]若所述上层应用系统通过文件系统间接对所述通用块设备接口进行访问时,则调用相应的文件系统工具或接口来获取本次访问的通用块设备地址,构建所述SCSI读写命令。
【附图说明】
[0032]以下参照附图对本发明实施例作进一步说明,其中:
[0033]图1是现有技术SCSI设备三种请求访问方式的结构图;
[0034]图2是本发明一种基于SCSI设备的容错方法的流程图;
[0035]图3是本发明一种基于SCSI设备的容错系统的模块图;
[0036]图4是本发明具体实施例一用户态软件RAID框图;
[0037]图5是本发明具体实施例一的读错误处理流程图;
[0038]图6是本发明具体实施例一的写错误处理流程图;
[0039]图7是本发明具体实施例二的读错误处理流程图;
[0040]图8是本发明具体实施例二的写错误处理流程图。
【具体实施方式】
[0041]下面结合附图和具体实施例对本发明作进一步的详细说明。
[0042]本发明提出了本发明提供一种基于SCSI设备的容错方法,在不修改操作系统内核SCSI层的前提下,使用户态存储软件(包括但不限于软件RAID及分布式存储系统软件)感知底层SCSI设备的错误,并通过校验或副本策略完成错误修复,或者作为SCSI设备的健康状态?目息评估设备的状态,以提尚硬盘利用率。
[0043]具体实现方案为:当上层应用系统通过文件系统或裸设备的方式访问SCSI设备时,如果遇到应用程序接口层返回1错误(例如E1错误),在确认SCSI设备在位的情况下,通过Linux操作系统的SG设备向出错的地址发起SCSI Pass Through方式的请求,并接收SCSI设备返回的响应,该响应包含SCSI标准错误码,上层根据错误码类型,做相应的容错处理。
[0044]请参阅图2,具体步骤包括:
[0045]上层应用系统通过通用块设备层对SCSI设备提出访问请求;
[0046]通用块设备层接收所述访问请求并进行处理,以及将处理结果返回给上层应用系统;上层应用系统接收所述处理结果,确定所述请求失败后构造SCSI读写命令,然后通过SG字符设备重新发起对所述SCSI设备的访问,并接收所述SCSI设备返回的响应;
[0047]根据所述SCSI设备返回的响应进行错误处理。
[0048]所述根据所述SCSI设备返回的响应进行错误处理时:如果所述SCSI设备返回的响应为命令执行成功,则向所述上层应用系统返回本次访问请求成功;如果所述SCSI设备返回的响应为命令执行失败,则判断所述SCSI设备返回的响应的错误类型,并根据所述错误类型进行修复。
[0049]所述根据所述错误类型进行修复,进一步包括:若所述SCSI设备返回的响应的错误类型为可通过覆盖写方式修复的读错误,则由所述上层应用系统获取冗余数据后执行覆盖写操作实现修复;若所述SCSI设备返回的响应的错误类型为可通过坏块映射方式修复的写错误,则由所述上层应用系统将写操作重定向到预留区域(此区域可以是由所述上层应用系统提前划出的一块所述SCSI设备内部的区域,也可以是其它的非遗失性存储介质空间),并标记该数据块损坏实现修复;若所述SCSI设备返回的响应的错误类型为其它错误,则向所述上层应用系统返回具体的错误码,并记录容错失败事件。
[0050]所述确定所述处理失败后构造SCSI读写命令时:若所述上层应用系统通过裸设备接口直接对所述通用块设备接口进行访问时,则基于本次访问的通用块设备地址构建所述SCSI读写命令;若所述上层应用系统通过文件系统间接对所述通用块设备接口进行访问时,则调用相应的文件系统工具或接口来获取本次访问的通用块设备地址,构建所述SCSI读写命令。
[0051]根据本发明的基于SCSI设备的容错方法,本发明还提供一种基于SCSI设备的容错系统,请参阅图3,包括:
[0052]通用块设备模块,用于接收上层应用系统的访问请求并进行处理;
[0053]判断模块,用于根据处理结果判断所述请求是成功;
[0054]第一处理模块,用于在确定所述请求失败后构造SCSI读写命令,
[0055]SG字符设备模块,用于重新发起对SCSI设备的访问,并接收所述SCSI设备返回的响应;
[0056]第二处理模块,用于根据所述SCSI设备返回的响应进行错误处理。
[0057]具体实施例一:
[0058]本发明的基于SCSI设备的容错方法可用于实现Linux/Unix用户态软件RAID,传统软件RAID模块一般运行于内核态,如Linux内核自带的mdraid模块。用户态软件RAID是指将RAID功能以及硬盘的容错处理都在用户态实现,对应用程序提供数据冗余及高性能的读写API接口,一个用户态软件RAID实现框图如图4所示,其中,RAID功能模块通过块设备接口,经过内核通用块层向硬盘发起1请求并接收响应,具体可以根据性能需要使用Linux操作系统的A1接口、Sync 1或其它1引擎来实现对硬盘裸设备的数据读写。在RAID功能1路径遇到1错误时,SCSI硬盘容错处理模块通过SG设备接口发起重试并感知硬盘SCSI错误码,然后做相应的容错处理。
[0059]本发明的基于SCSI设备的容错方法用于实现Linux/Unix用户态软件RAID,具体步骤如下:
[0060](一)、当RAID功能在某个硬盘的1路径上遇到读错误时,请参阅图5,具体容错处理流程如下:
[0061 ]硬盘容错处理模块向出错硬盘的SG设备发送SCSI读命令,命令的地址参数为使用块设备接口访问返回出错时的物理地址。如果命令成功,则表示重试读成功,结束本次容错流程。
[0062]SCSI读命令返回失败,则判断SCSI错误码是否为可通过写覆盖修复的SCSI读错误类型,如果不是,则向RAID功能模块返回此SCSI错误码,并将该硬盘的异常计数值加1,作为硬盘健康状态判断的标准,供异步统计硬盘错误时使用,当错误达到阈值,做踢盘处理。
[0063]如果SCSI读命令返回的错误码类型为可通过写覆盖修复,则通知RAID功能模块通过RAID算法校验出该硬盘条带上的数据内容,再通过向SG设备发送SCSI写命令的形式实施写覆盖修复,若命令返回成功,则修复成功并结束本次容错流程;若SCSI写命令失败,则报告容错流程失败,并将该硬盘的异常计数值加I,作为硬盘健康状态判断的标准,供异步统计硬盘错误时使用,当错误达到阈值,做踢盘处理。
[0064](二)、当RAID功能在某个硬盘的1路径上遇到写错误时,请参阅图6,具体容错处理流程如下:
[0065]硬盘容错处理模块向出错硬盘的SG设备发送SCSI写命令。如果命令成功,则表示重试写成功,结束本次容错流程。
[0066]SCSI写命令返回失败,则判断SCSI错误码是否为可通过坏块映射方式修复的SCSI写错误类型,如果不是,则向上返回此SCSI错误码,并将该硬盘的异常计数值加I,作为硬盘健康状态判断的标准,供异步统计硬盘错误时使用,当错误达到阈值,做踢盘处理。
[0067]如果SCSI写命令返回的错误码类型为可通过坏块映射的方式修复,则启动映射机制,即将写请求重定向到本硬盘上预留的区域或其它非遗失性存储介质中,后续对该坏块地址数据读写请求都被重定向到新的映射区域,若映射成功,则修复成功,结束本次容错流程;若映射修复失败,则返回容错失败,并将该硬盘的异常计数值加I,作为硬盘健康状态判断的标准,供异步统计硬盘错误时使用,当错误达到阈值,做踢盘处理。
[0068]具体实施例二:
[0069]在分布式存储系统中,当逻辑卷的1请求从客户端下发到系统中后,会经过元数据管理模块、分布式RAID等数据路由服务,将请求1拆分下发到底层的存储单元(在Ceph中是OSD模块,一个存储单元负责一个物理硬盘的数据读写服务),即最终都是通过存储单元向一个个本地硬盘发起1请求。而存储单元向本地SCSI硬盘发起请求时,一般都是通过文件系统接口或裸设备接口进行的,这样就无法识别硬盘具体的SCSI错误码。
[0070]通过本发明的基于SCSI设备的容错方法,可以在本地存储单元通过文件系统接口或裸设备接口访问SCSI硬盘遇到错误时,重新根据请求构造成SCSI命令,向SG设备发起SCSI Passthrough方式的请求,如果请求成功,则相当于重试成功,如果请求失败,则可以得到SCSI错误码,并根据SCSI错误码做进一步的容错处理。这样,在不修改分布式存储软件所部署的服务器操作系统内核以及其它上层软件模块的情况下,仅通过修改存储单元的用户态程序,即可完成SCSI硬盘的容错处理。
[0071 ]本发明的基于SCSI设备的容错方法用于分布式存储系统,具体步骤如下:
[0072](—)、当分布式存储系统的存储单元读盘操作遇到错误时请参阅图7,处理步骤如下:
[0073]存储单元向块设备发送读请求,读请求接口可能是文件系统提供的接口,也可能是裸设备访问接口,若读返回失败,则进入容错处理流程。
[0074]如果是文件系统接口,即读请求地址是文件系统中的某个文件的偏移值,则利用文件系统工具查询出该偏移值对应的硬盘物理地址;如果是裸设备访问接口,则访问地址就是硬盘物理地址,不需要转换。
[0075]存储单元向硬盘的SG设备发送SCSI读命令,命令的地址参数为硬盘物理地址。如果命令成功,则表示重试读成功,结束本次容错流程。
[0076]SCSI读命令返回失败,则判断SCSI错误码是否为可通过写覆盖修复的SCSI读错误类型,如果不是,则向上返回此SCSI错误码,并将该硬盘的异常计数值加I,作为硬盘健康状态判断的标准,供以后分析统计硬盘错误时使用。
[0077]如果SCSI读命令返回的错误码可通过写覆盖修复,则向该数据副本所在的存储单元(假设为第二存储单元)请求数据,或者根据其它存储单元保存的数据校验出该硬盘上的数据内容,通过向SG设备发送SCSI写命令的形式实施写覆盖修复,若命令返回成功,则修复成功,结束本次容错流程;若SCSI写命令失败,则向上返回失败,并将该硬盘的异常计数值加I,作为硬盘健康状态判断的标准,供以后分析统计硬盘错误时使用。
[0078](二)、当分布式存储系统的存储单元写盘操作遇到错误时,请参阅图8,处理步骤如下:
[0079]存储单元向块设备发送写请求,写请求接口可能是文件系统提供的接口,也可能是裸设备访问接口,若写返回失败,则进入容错处理流程。
[0080]如果是文件系统接口,即写请求地址是文件系统中的某个文件的偏移值,则利用文件系统工具查询出该偏移值对应的硬盘物理地址;如果是裸设备访问接口,则访问地址就是硬盘物理地址,不需要转换。
[0081]存储单元向硬盘的SG设备发送SCSI写命令,命令的地址参数为硬盘物理地址。如果命令成功,则表示重试写成功,结束本次容错流程。
[0082]SCSI写命令返回失败,则判断SCSI错误码是否为可通过坏块映射方式修复的SCSI写错误类型,如果不是,则向上返回此SCSI错误码,并将该硬盘的异常计数值加I,作为硬盘健康状态判断的标准,供以后分析统计硬盘错误时使用。
[0083]如果SCSI写命令返回的错误码可通过坏块映射的方式修复,则启动映射机制,SP将写请求重定向到硬盘上预留的区域,后续对该坏块地址数据读写请求都被重定向到新的映射区域,若映射成功,则修复成功,结束本次容错流程;若映射修复失败,则向上返回失败,并将该硬盘的异常计数值加I,作为硬盘健康状态判断的标准,供以后分析统计硬盘错误时使用。
[0084]以上所述本发明的【具体实施方式】,并不构成对本发明保护范围的限定。任何根据本发明的技术构思所做出的各种其他相应的改变与变形,均应包含在本发明权利要求的保护范围内。
【主权项】
1.一种基于SCSI设备的容错方法,其特征在于,包括: 上层应用系统通过通用块设备层对SCSI设备提出访问请求; 通用块设备层接收所述访问请求并进行处理,以及将处理结果返回给上层应用系统;上层应用系统接收所述处理结果,确定所述请求失败后构造SCSI读写命令,然后通过SG字符设备重新发起对所述SCSI设备的访问,并接收所述SCSI设备返回的响应; 根据所述SCSI设备返回的响应进行错误处理。2.根据权利要求1所述的一种基于SCSI设备的容错方法,其特征在于,所述根据所述SCSI设备返回的响应进行错误处理,进一步包括: 如果所述SCSI设备返回的响应为命令执行成功,则向所述上层应用系统返回本次访问请求成功; 如果所述SCSI设备返回的响应为命令执行失败,则判断所述SCSI设备返回的响应的错误类型,并根据所述错误类型进行修复。3.根据权利要求2所述的一种基于SCSI设备的容错方法,其特征在于,所述根据所述错误类型进行修复,进一步包括: 若所述SCSI设备返回的响应的错误类型为可通过覆盖写方式修复的读错误,则由所述上层应用系统获取冗余数据后执行覆盖写操作实现修复; 若所述SCSI设备返回的响应的错误类型为可通过坏块映射方式修复的写错误,则由所述上层应用系统将写操作重定向到预留区域,并标记该数据块损坏实现修复; 若所述SCSI设备返回的响应的错误类型为其它错误,则向所述上层应用系统返回具体的错误码,并记录容错失败事件。4.根据权利要求1或2所述的一种基于SCSI设备的容错方法,其特征在于,所述确定所述处理失败后构造SCSI读写命令,进一步包括: 若所述上层应用系统通过裸设备接口直接对所述通用块设备接口进行访问时,则基于本次访问的通用块设备地址构建所述SCSI读写命令; 若所述上层应用系统通过文件系统间接对所述通用块设备接口进行访问时,则调用相应的文件系统工具或接口来获取本次访问的通用块设备地址,构建所述SCSI读写命令。5.一种基于SCSI设备的容错系统,其特征在于,包括: 通用块设备模块,用于接收上层应用系统的访问请求并进行处理; 判断模块,用于根据处理结果判断所述请求是成功; 第一处理模块,用于在确定所述请求失败后构造SCSI读写命令, SG字符设备模块,用于重新发起对SCSI设备的访问,并接收所述SCSI设备返回的响应;第二处理模块,用于根据所述SCSI设备返回的响应进行错误处理,以及返回上层应用系统请求结果。6.根据权利要求5所述的一种基于SCSI设备的容错系统,其特征在于,所述上层应用系统通过裸设备接口或者文件系统对所述通用块设备模块进行访问。7.根据权利要求5所述的一种基于SCSI设备的容错系统,其特征在于,所述第一处理模块构造SCSI读写命令时,具体为: 若所述上层应用系统通过裸设备接口直接对所述通用块设备模块接口进行访问时,则基于本次访问的通用块设备地址构建所述SCSI读写命令; 若所述上层应用系统通过文件系统间接对所述通用块设备模块接口进行访问时,则调用相应的文件系统工具或接口来获取本次访问的通用块设备地址,构建所述SCSI读写命令。8.根据权利要求5所述的一种基于SCSI设备的容错系统,其特征在于,所述第二处理模块根据所述SCSI设备返回的响应进行错误处理,具体为: 如果所述SCSI设备返回的响应为命令执行成功,则向所述上层应用系统返回本次访问请求成功; 如果所述SCSI设备返回的响应为命令执行失败,则判断所述SCSI设备返回的响应的错误类型,并根据所述错误类型进行修复。
【文档编号】G06F11/07GK105975358SQ201610284196
【公开日】2016年9月28日
【申请日】2016年5月3日
【发明人】花瑞, 文刘飞
【申请人】深圳市杉岩数据技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1