发明内容
本发明实施例提供一种数据存取方法及服务器,用以在所有I/O路径都发生暂时故障的情况下,处理I/O请求,使得在不存在可用的I/O路径的情况下,仍然可以处理I/O请求,降低了业务发生中断的概率,从而提高存储系统的可用性。
本发明实施例提供一种数据存取方法,包括:
向存储阵列发送第一I/O请求;
在与存储阵列之间不存在可用的I/O路径的情况下,根据第一I/O请求在备用存储区进行数据存取操作;所述备用存储区为服务器自身的存储区;
在确定与存储阵列之间恢复可用的I/O路径的情况下,通过可用的I/O路径将备用存储区中数据下发到存储阵列过程中,向所述存储阵列发送第二I/O请求,所述下发到存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除;若所述第二I/O请求为写请求,且当根据所述第二I/O请求,在所述备用存储区中查找出所述第二I/O请求访问的区域存储有数据时,
将所述备用存储区中所述第二I/O请求访问的区域中数据下发到所述存储阵列,再将所述第二I/O请求的数据写入所述存储阵列;所述下发到所述存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除;或,
在所述备用存储区中清除所述第二I/O请求访问的区域中的数据,再将所述第二I/O请求的数据写入所述存储阵列;所述下发到所述存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除;或,
在所述备用存储区中写入所述第二I/O请求的数据,再将所述备用存储区中所述第二I/O请求访问的区域中的数据下发到所述存储阵列;所述下发到所述存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除;或,
在所述备用存储区中写入所述第二I/O请求的数据,若查找出第二I/O请求访问的区域的相邻区域中存储有数据,将所述备用存储区中所述第二I/O请求访问的区域中的数据和所述第二I/O请求访问的区域的相邻区域中的数据下发到所述存储阵列;所述下发到所述存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除。
本发明实施例提供一种数据存取方法,包括:
向存储阵列发送第一I/O请求;
在与所述存储阵列之间不存在可用的I/O路径的情况下,根据所述第一I/O请求在备用存储区进行数据存取操作;所述备用存储区为服务器自身的存储区;
在确定与存储阵列之间恢复可用的I/O路径的情况下,通过可用的I/O路径将备用存储区中数据下发到存储阵列过程中,向所述存储阵列发送第二I/O请求,所述下发到存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除;若所述第二I/O请求为读请求,且当根据所述第二I/O请求,在所述备用存储区中查找出所述第二I/O请求访问的区域存储有第二I/O请求的部分数据时,
将所述备用存储区中所述第二I/O请求访问的区域中的数据,下发到所述存储阵列,从所述存储阵列中读取所述第二I/O请求的数据;或,若查找出第二I/O请求访问的区域的相邻区域中存储有数据,将所述备用存储区中所述第二I/O请求访问的区域中的数据和所述第二I/O请求访问的区域的相邻区域中的数据,下发到所述存储阵列从所述存储阵列中读取所述第二I/O请求的数据;所述下发到所述存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除;或,
在确定与存储阵列之间恢复可用的I/O路径的情况下,通过可用的I/O路径将备用存储区中数据下发到存储阵列过程中,向所述存储阵列发送第二I/O请求,所述下发到存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除;若所述第二I/O请求为读请求,且当根据所述第二I/O请求,在所述备用存储区中查找出所述第二I/O请求访问的区域存储有第二I/O请求的全部数据时,
从所述备用存储区中所述第二I/O请求的访问区域读取所述第二I/O请求的数据,并将所述备用存储区中所述第二I/O请求访问的区域中的数据,下发到所述存储阵列;或,从所述备用存储区中所述第二I/O请求的访问区域读取所述第二I/O请求的数据,若查找出第二I/O请求访问的区域的相邻区域中存储有数据时,将所述备用存储区中所述第二I/O请求的访问区域中的数据和所述第二I/O请求访问的区域的相邻区域中的数据,下发到所述存储阵列;所述下发到所述存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除。
本发明实施例提供一种数据存取装置,包括:
第一I/O请求模块,用于向存储阵列发送第一I/O请求;
存取操作模块,用于在与所述存储阵列之间不存在可用的I/O路径的情况下,根据所述第一I/O请求在备用存储区进行数据存取操作;所述备用存储区为服务器自身的存储区;
下发模块,用于在确定与存储阵列之间恢复可用的I/O路径的情况下,通过可用的I/O路径将备用存储区中数据下发到存储阵列;所述下发到存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除;
写请求模块,用于下发模块通过可用的I/O路径将备用存储区中数据下发到存储阵列的过程中,向所述存储阵列发送第二I/O请求,所述第二I/O请求为写请求;
第一查找模块,用于在所述备用存储区中查找所述第二I/O请求访问的区域是否存储有数据;
第一操作模块,用于在所述备用存储区中查找所述第二I/O请求访问的区域存储有数据时,将所述备用存储区中所述第二I/O请求访问的区域中数据下发到所述存储阵列,再将所述第二I/O请求的数据写入所述存储阵列;所述下发到所述存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除;或,
第二操作模块,用于在所述备用存储区中查找所述第二I/O请求访问的区域存储有数据时,在所述备用存储区中清除所述第二I/O请求访问的区域中数据,再将所述第二I/O请求的数据写入所述存储阵列;所述下发到所述存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除;或,
第三操作模块,用于在所述备用存储区中查找所述第二I/O请求访问的区域存储有数据时,在所述备用存储区中写入所述第二I/O请求的数据,再将所述备用存储区中所述第二I/O请求访问的区域中数据下发到所述存储阵列;或,在所述备用存储区中查找所述第二I/O请求访问的区域存储有数据时,在所述备用存储区中写入所述第二I/O请求的数据,若查找出第二I/O请求访问的区域的相邻区域中存储有数据,将所述备用存储区中所述第二I/O请求访问的区域中数据和所述第二I/O请求访问的区域的相邻区域中数据,下发到所述存储阵列;所述下发到所述存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除。
本发明实施例提供一种数据存取装置,包括:第一I/O请求模块、存取操作模块、下发模块、读请求模块、第二查找模块和第四操作模块;或,包括:第一I/O请求模块、存取操作模块、下发模块、读请求模块、第三查找模块和第五操作模块;
其中,第一I/O请求模块,用于向存储阵列发送第一I/O请求;
存取操作模块,用于在与所述存储阵列之间不存在可用的I/O路径的情况下,根据所述第一I/O请求在备用存储区进行数据存取操作;所述备用存储区为服务器自身的存储区;
下发模块,用于在确定与存储阵列之间恢复可用的I/O路径的情况下,通过可用的I/O路径将备用存储区中数据下发到存储阵列;所述下发到存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除;
读请求模块,用于在下发模块通过可用的I/O路径将备用存储区中数据下发到存储阵列的过程中,向所述存储阵列发送第二I/O请求,所述第二I/O请求为读请求;
第二查找模块,用于在所述备用存储区中查找所述第二I/O请求访问的区域是否存储有第二I/O请求的部分数据;
第四操作模块,用于在所述备用存储区中查找所述第二I/O请求访问的区域存储有第二I/O请求的部分数据时,将所述备用存储区中所述第二I/O请求访问的区域中的数据,下发到所述存储阵列,从所述存储阵列中读取所述第二I/O请求的数据;所述下发到所述存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除;或,在所述备用存储区中查找所述第二I/O请求访问的区域存储有第二I/O请求的部分数据时,若查找出第二I/O请求访问的区域的相邻区域中存储有数据,将所述备用存储区中所述第二I/O请求访问的区域中数据和所述第二I/O请求访问的区域的相邻区域中数据,下发到所述存储阵列,再从所述存储阵列中读取所述第二I/O请求的数据;所述下发到所述存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除;
第三查找模块,用于在所述备用存储区中查找所述第二I/O请求访问的区域是否存储有第二I/O请求的全部数据;
第五操作模块,用于在所述备用存储区中查找所述第二I/O请求访问的区域存储有第二I/O请求的全部数据时,所述第三查找模块在备用存储区中查找出第二I/O请求访问的区域存储有第二I/O请求的全部数据时,从所述备用存储区中所述第二I/O请求的访问区域读取所述第二I/O请求的数据,并将所述备用存储区中所述第二I/O请求访问的区域中的数据,下发到所述存储阵列;所述下发到所述存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除;或,在所述备用存储区中查找所述第二I/O请求访问的区域存储有第二I/O请求的全部数据时,从所述备用存储区中所述第二I/O请求的访问区域读取所述第二I/O请求的数据,若查找出第二I/O请求访问的区域的相邻区域中存储有数据,将所述备用存储区中所述第二I/O请求访问的区域中数据和所述第二I/O请求访问的区域的相邻区域中数据,下发到所述存储阵列;所述下发到所述存储阵列包括:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除。
本发明实施例提供的数据存取方法及服务器,当短时间内服务器与存储阵列所有I/O路径都发生故障时,通过在服务器的备用存储区进行I/O请求对应的数据存取操作,完成了I/O请求,使得在不存在可用的I/O路径的情况下,仍然可以处理I/O请求,降低了业务发生中断的概率,从而提高存储系统的可用性。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1a为本发明实施例提供的一种数据存取方法的流程图。本实例的应用场景可为:服务器上的主机总线适配器,通过光纤与存储阵列中的两个磁盘控制器相连,从而在服务器与存储阵列之间形成二条I/O路径。当服务器发出I/O请求时,服务器上设有的多路径控制模块从二条I/O路径中选择一条可用的I/O路径供执行I/O操作。如图1a所示,本实施例包括:
步骤10:向存储阵列发送第一I/O请求;
服务器需要访问存储阵列进行读或写数据操作时,向存储阵列发送第一I/O请求。
步骤11:在与存储阵列之间不存在可用的I/O路径的情况下,根据第一I/O请求在备用存储区进行数据存取操作。
服务器与存储阵列之间有可能有多条路径,比如服务器与存储阵列之间有两条I/O路径,但在某些异常情况下,可能存在所有I/O路径的物理链路都发生故障的情况。比如,服务器与存储阵列之间使用基于IP的基于网络的小型计算机系统接口(Internet Small Computer System Interface,简称iSCSI)组网时,如果IP网络质量不好,例如:延迟长、丢包率高、交换机或路由器故障等,可能出现I/O路径时断时恢复甚至短时间全断的情况。
若确定服务器与存储阵列之间的两条I/O路径,都没有发生物理链路故障,即都处于可用状态时,从两条可用的I/O路径中选择一条以供I/O操作访问存储阵列。如图1b所示,本发明实施例提供的一种数据存取方法中所有I/O路径都可用时的应用场景图。
若确定服务器与存储阵列之间的两条I/O路径,有一条发生物理链路故障,即只有一条I/O路径处于可用状态时,选择该条可用的I/O路径供I/O操作访问存储阵列。如图1c所示,图1c本发明实施例提供的一种数据存取方法中同时存在故障I/O路径和可用I/O路径时的应用场景图。
若确定当前两条I/O路径的物理链路都发生故障,即没有可用的I/O路径时,则将服务器自身的存储区,例如内存和硬盘,作为第一I/O请求的备用存储区,使第一I/O请求对应的数据存取操作在备用存储区中执行。如图1d所示,图1d本发明实施例提供的一种数据存取方法中所有I/O路径都故障时的应用场景图。具体数据存取操作如下:
若第一I/O请求为写请求,在备用存储区中写入第一I/O请求的数据。即存取操作模块将第一I/O请求需要写入存储阵列中的数据,写入备用存储区。
若第一I/O请求为读请求,且在备用存储区中查找到第一I/O请求的访问区域存储有数据时,在备用存储区读取第一I/O请求的数据。读I/O请求时,多路径软件先在备用存储区查找第一I/O请求的访问区域是否存储有数据,若查找到,则存取操作模块在备用存储区中读取第一I/O请求的数据。
以上根据确定I/O路径的不同状况,对服务器发送的第一I/O请求的处理流程,参见图1e所示,图1e为本发明实施例提供的数据存取方法中处理第一I/O请求的流程图。
本实施例中,在所有I/O路径都发生故障的情况下,将访问存储阵列的I/O请求,先缓存到服务器自身的存储区中,从而保证了服务器的业务不中断。由于这种缓存机制对于读I/O请求有限,因此,本实施例较适合于大部分甚至所有I/O都是写I/O的场景。例如,视频监控应用中有相当一部分的I/O请求,都是将摄像头捕获的数据写入存储;又例如,许多文件操作的场景,读I/O只发生在最初打开文件的时刻,其后的编辑、保存等都不会发送读I/O。
本发明实施例数据存取方法,当短时间内服务器与存储阵列所有I/O路径都发生故障时,通过在服务器的备用存储区进行I/O请求对应的数据存取操作,完成了I/O请求,没有不中断服务器正在处理的业务,使得在不存在可用的I/O路径的情况下,仍然可以处理I/O请求,降低了业务发生中断的概率,从而提高存储系统的可用性。
图2为本发明实施例提供的另一种数据存取方法的流程图。在上述步骤21之后,如图2所示,本实施例还包括:
步骤20:确定与存储阵列之间是否恢复可用的I/O路径;
上述二条I/O路径都发生物理链路故障后,访问存储阵列的第一I/O请求所对应的数据存取操作,在服务器自身的存储区即备用存储区中执行。周期性检测上述二条I/O路径的物理链路状况,以确定是否有一条或两条I/O路径物理链路的故障已恢复即处于可用状态。
步骤21:在确定与存储阵列之间恢复可用的I/O路径的情况下,通过可用的I/O路径将备用存储区中数据下发到存储阵列。
若确定至少有一条I/O路径的物理链路故障已恢复,即服务器与存储阵列之间当前存在可用的I/O路径,此时,服务器发送第一线程开始执行如下操作:遍历备用存储区,依次将备用存储区中数据,通过当前可用的I/O路径下发到存储阵列中。具体地,先从备用存储区中读出所有I/O路径故障时根据第一I/O请求所写入到备用存储区中的数据,再将这些数据通过当前可用的I/O路径下发到存储阵列中。其中,将备用存储区的数据下发到存储阵列时,每次写入的数据块尽可能是连续的,且数据块的个数是不固定。每次写入连续数据块的个数取决于备用存储区上实际连续的数据块数,以及一次I/O操作可存取的数据块的最大长度。例如,系统一次I/O操作可存取的数据块的最大长度为10,数据块1至10的存储情况为:数据块1、2内存储有有效数据,数据块3、4内没有存储有效数据,数据块5、6、7、8内存储有有效数据,数据块9、10内没有存储有效数;则先将数据块1、2写入存储阵列,再将数据块5、6、7、8写入存储阵列。
需要指出的是:本发明实施例中,数据块的编号、I/O请求访问的区域均为数据块的逻辑地址。本发明实施例中“将备用存储区中数据下发到存储阵列”均包括两个操作:将备用存储区中数据复制到存储阵列中,再将备用存储区中相应数据从备用存储区中清除。
第一线程将备用存储区中数个连续的数据块写入存储阵列中的操作,具体包括两个步骤:首先通过当前可用的I/O路径将备用存储区中数个连续的数据块复制到存储阵列中,再将备用存储区中该数个连续的数据块删除。上述两个步骤为原子操作,即只有上述两个步骤都操作成功,才能使备用存储区中数个连续的数据块成功写入存储阵列中。
本发明实施例数据存取方法及服务器,当短时间内服务器与存储阵列所有I/O路径都发生故障时,通过在服务器的备用存储区进行I/O请求对应的数据存取操作,完成了I/O请求,没有不中断服务器正在处理的业务。在确定服务器与存储阵列之间恢复可用的I/O路径后,再将备用存储区中的数据写入存储阵列中,从而提高了存储系统的可靠性,并保证了存储阵列中数据的有效性。
图3为本发明实施例提供的又一种数据存取方法的流程图。本实施例是在上述第一线程将备用存储区的数据依次写入存储阵列(图2所示的步骤21)的过程中,向存储阵列发送第二I/O请求时,第二线程对该第二I/O请求的处理流程。即第一线程和第二线程同时执行。如图2所示,在图2对应实施例的基础上,本实施例还包括:
步骤30:向存储阵列发送第二I/O请求;
在服务器与存储阵列之间的所有I/O路径都发生故障且在备用存储区中执行第一I/O请求对应的存储操作之后,服务器向存储阵列发送第二I/O请求。
步骤31:根据第二I/O请求,在备用存储区中查找第二I/O请求访问的区域是否存储有数据;
由于此时,第一线程已开始将备用存储区的数据写入存储阵列,则说明服务器与存储阵列之间已有一条或多条故障I/O路径恢复,因此当发送第二I/O请求时,则在备用存储区中查找第二I/O请求访问的区域是否存储有数据。
步骤32:若备用存储区中第二I/O请求访问的区域没有存储数据,直接在存储阵列进行第二I/O请求对应的数据存取操作。
由于此时第一线程有可能还没有将备用存储区中数据都下发到存储阵列中,考虑到存储阵列中数据的有效性、以及从备用存储区向存储阵列中传送数据的效率,在处理第二I/O请求时必须确定备用存储区中第二I/O请求访问的区域,是否存储有数据。若备用存储区中第二I/O请求访问的区域存储有数据,如果直接在存储阵列中进行I/O请求对应的存取操作,有可能会导致存储阵列中的数据无效。
例如,第二I/O请求访问的区域为数据块5、6和7,则在备用存储区中查找数据块5、6和7是否则存储有数据;若有数据,则说明第一线程还没有将数据块5、6和7的数据写入存储阵列。
若第二I/O请求为写I/O请求,如果直接将第二I/O请求对应的数据写入存储阵列的数据块5、6和7的数据块中,有可能造成如下情况:第二线程先将第二I/O请求的数据写入了存储阵列的数据块5、6和7中,而第一线程后将备用存储区的数据块5、6和7中数据写入存储阵列,则会导致存储阵列的数据块5、6和7中数据不是对第二I/O请求处理后的数据,而是第二I/O请求之前的数据。
若第二I/O请求为读请求时,若备用存储区中第二I/O请求访问的区域存储有数据,说明此时第一线程还没有将备用存储区的数据块5、6和7中数据写入到存储阵列。第二I/O请求访问的区域存储有数据时,可能存在两种情况:
第一种:备用存储区中第二I/O请求访问的区域有可能只存在第二I/O请求的部分数据。例如,第二I/O请求访问的区域为数据块5、6和7,在备用存储中,数据块5、6中存储有数据,而数据块7中没有存储数据。说明在全部I/O路径都发生故障的时间段,没有在数据块7中执行过存取操作。此时,必须在存储阵列的数据块7中读取相应的数据。另外,还可使第二线程在读取第二I/O请求的数据后,将第二I/O请求访问的区域中数据,以及第二I/O请求访问的区域的相邻区域中数据一起下发到存储阵列。
第二种:也有可能备用存储区中第二I/O请求访问的区域存在第二I/O请求的全部数据。此时,例如,第二I/O请求访问的区域为数据块5、6和7,数据块5、6和7都存储有数据。可先在备用存储区的数据块5、6和7中读取第二I/O请求的数据,再将备用存储区中编号51至60的数据块中数据下发到存储阵列,从而提高备用存储区向存储阵列传送数据的效率。
第二I/O请求为写请求时的处理流程:
根据以上分析,在第二I/O请求访问的区域存储有数据的情况下,第二线程对第二I/O请求为写请求时的处理流程,根据具体情况可有以下四种处理方式:
写请求的第一种处理流程:通过可用的I/O路径将备用存储区中第二I/O请求访问的区域中数据下发到存储阵列,再将第二I/O请求的数据写入存储阵列。
上述下发操作包括复制操作和清除操作。例如,第二I/O请求访问的区域为数据块5、6、7和8,而备用存储区的数据块5、6中存储有效数据,而数据块7、8中没有存储数据。第二线程的具体流程为:第一步复制操作:先将备用存储区的数据块5、6复制到存储阵列;第二步清除操作:再清除备用存储区的数据块5、6中数据;第三步写入操作:然后在存储阵列的数据块5、6、7和8中写入第二I/O请求的数据。第二线程的上述三个操作:复制操作、清除操作和写操作,按序组成一个原子操作。即复制操作、清除操作和写操作按顺序执行,且如有一个操作在执行过程中被中断,则系统回滚到复制操作之前的状态;下一次执行时,重新从复制操作开始执行,直到清除操作、写操作依次完成,则系统进入写入操作之后的状态。
又例如,第二I/O请求访问的区域为数据块5、6、7和8,备用存储区的数据块5、6、7和8中均存储有数据。第二线程的具体处理流程为:第一步复制操作:先将备用存储区的数据块5、6、7和8中数据复制到存储阵列;第二步清除操作:再清除备用存储区的数据块5、6、7和8中数据;第三步写入操作:然后在存储阵列的数据块5、6、7和8中写入第二I/O请求的数据。同上,第二线程的上述三个操作:复制操作、清除操作和写操作、按序组成一个原子操作。
写请求的第二种处理流程(优选的处理流程):
步骤33:在备用存储区中清除第二I/O请求访问的区域中数据,
步骤34:通过可用的I/O路径,将第二I/O请求的数据写入存储阵列。
例如,第二I/O请求访问的区域为数据块5、6、7和8,不论备用存储区中数据块5、6、7和8是否均存储有数据,第二线程的具体流程均可为:第一步清除操作:先清除备用存储区的数据块5、6、7和8中数据;第二步写入操作:然后在存储阵列的数据块5、6、7和8中写入第二I/O请求的数据。
写请求的第三种处理流程:在备用存储区中写入第二I/O请求的数据,再通过可用的I/O路径将第二I/O请求访问的区域中数据下发到存储阵列。
上述下发操作包括复制操作和清除操作。例如,第二I/O请求访问的区域为数据块5、6、7和8,不论备用存储区中数据块5、6、7和8是否均存储有数据,第二线程的具体流程均可为:第一步写操作:在备用存储区的数据块5、6、7和8中写入第二I/O请求的数据;第二步复制操作:再将备用存储区的数据块5、6、7和8中数据复制到存储阵列中;第三步清除操作:然后清除备用存储区的数据块5、6、7和8中数据。同上,第二线程的上述三个操作:写操作、复制操作和清除操作、按序组成一个原子操作。
写请求的第四种流程(对第三种处理流程进行改进后得到第四种处理流程):
若查找出第二I/O请求访问的区域的相邻区域中存储有数据,在备用存储区中写入第二I/O请求的数据;通过可用的I/O路径将第二I/O请求访问的区域中数据,以及第二I/O请求访问的区域的相邻区域中数据,下发到存储阵列。
上述下发操作包括复制操作和清除操作。例如,第二I/O请求访问的区域为数据块5、6、7和8,与第二I/O请求访问的区域相邻的区域数据块3、4中也存储有数据(不论备用存储区中数据块5、6、7和8是否均存储有数据),第二线程的具体流程可为:第一步写操作:在备用存储区的数据块5、6、7和8中写入第二I/O请求的数据;第二步复制操作:再将备用存储区的数据块3、4、5、6、7和8中数据复制到存储阵列中;第三步清除操作:然后清除备用存储区的数据块3、4、5、6、7和8中数据。同上,第二线程的上述三个操作:写操作、复制操作和清除操作、按序组成一个原子操作。
上述第一处理流程和第三处理流程的相同之处在于:完成一次写请求均要执行三个操作:写操作、复制操作和清除操作;不同之处在于:上述三个操作的执行顺序不同,因此,第一处理流程和第三处理流程在效率上相同的。
第二种处理流程,完成一次写请求只需执行两个操作:清除操作和写操作,因此,第二种处理流程的处理效率高于第一种处理流程和第三种处理流程。第四种处理流程与第三处理流程的不同之处在于,第四种流程将备用存储区中第二I/O请求访问的区域相邻的区域数据块中,也下发到存储阵列中,以提高从备用存储区向存储阵列传送数据的效率。
第二I/O请求为读请求时的处理流程:
在第二I/O请求访问的区域存储有数据的情况下,第二线程对第二I/O请求为读请求时的处理流程,根据具体情况可有以下六种处理方式:
读请求的第一种处理流程:
若第二I/O请求访问的区域中数据为第二I/O请求的部分数据,执行如下步骤:
步骤35:将备用存储区中第二I/O请求访问的区域中数据下发到存储阵列;
通过可用的I/O路径将备用存储区中第二I/O请求访问的区域中数据下发到存储阵列。
步骤36:从存储阵列中读取第二I/O请求的数据。
上述下发操作包括复制操作和清除操作。例如,第二I/O请求访问的区域为数据块5、6、7和8,而备用存储区的数据块5、6中存储有效数据,而数据块7、8中没有存储数据。第二线程的具体流程为:第一步复制操作:先将备用存储区的数据块5、6复制到存储阵列;第二步清除操作:再清除备用存储区的数据块5、6中数据;第三步读操作:然后在存储阵列的数据块5、6、7和8中读取第二I/O请求的数据。同上,第二线程的上述三个操作:复制操作、清除操作和读操作、按序组成一个原子操作。
读请求的第二种处理流程:
若第二I/O请求访问的区域中数据为第二I/O请求的全部数据,通过可用的I/O路径将备用存储区中第二I/O请求访问的区域中数据复制到存储阵列,从备用存储区中读取第二I/O请求的数据后,再从备用存储区中清除第二I/O请求访问的区域中数据;
例如,第二I/O请求访问的区域为数据块5、6、7和8,备用存储区的数据块5、6、7和8中均存储有数据。第二线程的具体处理流程为:第一步复制操作:先将备用存储区的数据块5、6、7和8中数据复制到存储阵列;第二步读操作:从备用存储区的数据块5、6、7和8中读取第二I/O请求的数据;第三步清除操作:再清除备用存储区的数据块5、6、7和8中数据。同上,第二线程的上述三个操作:复制操作、读操作和清除操作,按序组成一个原子操作。
读请求的第三种处理流程:
若第二I/O请求访问的区域中数据为第二I/O请求的全部数据,执行如下步骤:
步骤37:从备用存储区中第二I/O请求的访问区域读取第二I/O请求的数据;
步骤38:将备用存储区中第二I/O请求访问的区域中数据下发到存储阵列。
通过可用的I/O路径将备用存储区中第二I/O请求访问的区域中数据下发到存储阵列。
上述下发操作包括复制操作和清除操作。例如,第二I/O请求访问的区域为数据块5、6、7和8,备用存储区的数据块5、6、7和8中均存储有数据。第二线程的具体处理流程为:第一步读操作:从备用存储区的数据块5、6、7和8中读取第二I/O请求的数据;第二步复制操作:先将备用存储区的数据块5、6、7和8中数据复制到存储阵列;第三步清除操作:再清除备用存储区的数据块5、6、7和8中数据。同上,第二线程的上述三个操作:读操作、复制操作和清除操作,按序组成一个原子操作。
读请求的第四种处理流程(对第一种流程改进后得到第四种处理流程):
若第二I/O请求访问的区域中数据为第二I/O请求的部分数据,查找出第二I/O请求访问的区域的相邻区域中存储有数据;通过可用的I/O路径,将备用存储区中第二I/O请求访问的区域中数据,以及第二I/O请求访问的区域的相邻区域中数据,下发到存储阵列;从存储阵列中读取第二I/O请求的数据。
上述下发操作包括复制操作和清除操作。例如,第二I/O请求访问的区域为数据块5、6、7和8,而备用存储区的数据块5、6中存储有效数据,数据块7、8中没有存储数据,并且与第二I/O请求访问的区域相邻的区域数据块3、4中存储有数据。第二线程的处理流程可为:第一步复制操作:先将备用存储区的数据块3、4、5和6中数据复制到存储阵列;第二步清除操作:再清除备用存储区的数据块3、4、5和6中数据;第三步读取操作:然后在存储阵列的数据块5、6、7和8中读取第二I/O请求的数据。上述下发操作包括复制操作和清除操作。同上,第二线程的上述三个操作:复制操作、清除操作和读操作、按序组成一个原子操作。
读请求的第五种处理流程(对第二种流程改进后得到第五种处理流程):
若第二I/O请求访问的区域中数据为第二I/O请求的全部数据,查找出第二I/O请求访问的区域的相邻区域中存储有数据;通过可用的I/O路径,将备用存储区中第二I/O请求访问的区域中数据,以及第二I/O请求访问的区域的相邻区域中数据,复制到存储阵列;从备用存储区中读取第二I/O请求的数据;从备用存储区中清除第二I/O请求访问的区域中数据,以及第二I/O请求访问的区域的相邻区域中数据。
例如,第二I/O请求访问的区域为数据块5、6、7和8,备用存储区的数据块5、6、7和8中均存储有数据,并且数据块3、4中也存储有数据。第二线程的具体处理流程为:第一步复制操作:先将备用存储区的数据块3、4、5、6、7和8中数据复制到存储阵列;第二步读操作:从备用存储区的数据块5、6、7和8中读取第二I/O请求的数据;第三步清除操作:再清除备用存储区的数据块3、4、5、6、7和8中数据。同上,第二线程的上述三个操作:复制操作、读操作和清除操作,按序组成一个原子操作。
读请求的第六种处理流程(对第三种处理流程改进后得到第六种处理流程):
若第二I/O请求访问的区域中数据为第二I/O请求的全部数据,查找出第二I/O请求访问的区域的相邻区域中存储有数据;从备用存储区中第二I/O请求访问的区域读取第二I/O请求的数据;通过可用的I/O路径,将备用存储区中第二I/O请求的访问区域中数据,以及第二I/O请求访问的区域的相邻区域中数据,下发到存储阵列。
上述下发操作复制操作和清除操作。例如,第二I/O请求访问的区域为数据块5、6、7和8,备用存储区的数据块5、6、7和8中均存储有数据,数据块3、4中也存储有数据。第二线程的具体处理流程为:第一步读取操作:从备用存储区的数据块5、6、7和8中读取第二I/O请求的数据;第二步复制操作:先将备用存储区的数据块3、4、5、6、7和8中数据复制到存储阵列;第三步清除操作:再清除备用存储区的数据块3、4、5、6、7和8中数据。上述下发操作包括复制操作和清除操作。同上,第二线程的上述三个操作:读操作、复制操作和清除操作,按序组成一个原子操作。
上述对读请求的处理过程可知,第一种处理流程是在备用存储区只存储有第二I/O请求的部分数据时的处理方式。在备用存储区只存储有第二I/O请求的全部数据时,采用第二种处理流程和第三种处理流程。第二种处理流程和第三种处理流程的相同之处在于,完成一次读请求均需执行三个操作:读操作、复制操作和清除操作;不同之处在于,三个操作的执行顺序不同。第四种流程、第五种流程和第六种处理流程,分别在第一种处理流程、第二种处理流程和第三处理流程的基础上,将备用存储区中第二I/O请求访问的区域相邻的区域数据块中,也下发到存储阵列中,以提高从备用存储区向存储阵列传送数据的效率。
本实施例数据存取方法,在将备用存储区的数据下发到存储阵列的过程中(即步骤21执行过程中),根据第二I/O请求的类型,分别在备用存储区和存储阵列中执行第二I/O请求对应的存取操作,以提高从备用存储区向存储阵列传送数据的效率,同时保证存取阵列中数据的有效性。
图4为本发明实施例提供的一种服务器的结构示意图,如图4所示,本实施例包括:第一I/O请求模块40和存取操作模块41。
第一I/O请求模块40用于向存储阵列发送第一I/O请求;存取操作模块41用于在与存储阵列之间不存在可用的I/O路径的情况下,根据第一I/O请求在备用存储区进行数据存取操作。
其中,存取操作模块41包括:读操作子模块411和写操作子模块412。
读操作子模块411,用于若第一I/O请求为读请求,且在备用存储区中查找到第一I/O请求的访问区域存储有数据时,在备用存储区读取第一I/O请求的数据;写操作子模块412,用于若第一I/O请求为写请求,在备用存储区中写入第一I/O请求的数据。
具体地,服务器周期性检测与存储阵列之间是否存在可用的I/O路径,并保存检测结果。当第一I/O请求模块40向存储阵列发送第一I/O请求时,若服务器保存的检测结果表明:服务器与存储阵列之间存在可用的I/O路径时,存取操作模块41在存储阵列中进行第一I/O请求对应的操作;若服务器中保存的检测结果表明:服务器与存储阵列之间不存在可用的I/O路径,存取操作模块41根据第一I/O请求在备用存储区进行数据存取操作。其中,第一I/O请求为读请求,且在备用存储区中查找到第一I/O请求的访问区域存储有数据时,读操作子模块411在备用存储区读取第一I/O请求的数据;若第一I/O请求为写请求,写操作子模块412在备用存储区中写入第一I/O请求的数据。本实施例中各模块的工作机理参见图1a对应实施例中步骤10至步骤21的描述,在此不再赘述。
本实施例服务器,当第一I/O请求模块发送I/O请求时,若短时间内若服务器与存储阵列所有I/O路径都发生故障,存取操作模块在服务器的备用存储区进行I/O请求对应的数据存取操作,完成了I/O请求且不中断服务器正在处理的业务,使得在不存在可用的I/O路径的情况下,仍然可以处理I/O请求,降低了业务发生中断的概率,从而提高存储系统的可用性。
图5为本发明实施例提供的另一种服务器的结构示意图。在图5对应实施例的基础上,如图5所示,本实施例还包括:下发模块42。
下发模块42用于在确定与存储阵列之间恢复可用的I/O路径的情况下,通过可用的I/O路径将备用存储区中数据写入存储阵列。
具体地,当服务器确定与存储阵列之间恢复可用的I/O路径时,下发模块42通过可用的I/O路径将备用存储区中数据写入存储阵列。
本实施例中各模块的工作机理参见图2对应实施例中步骤21的描述,在此不再赘述。
本实施例服务器,在存取操作模块41在服务器的备用存储区进行I/O请求对应的数据存取操作之后,若确定服务器与存储阵列之间存在可用的I/O路径,下发模块42将备用存储区中的数据写入存储阵列中,从而保证了存储阵列中数据的有效性。
图6为本发明实施例提供的又一种服务器的结构示意图。在图5所示实施例的基础上,如图6所示,本实施例还包括:写请求模块43、第一查找模块44、第一操作模块45、第二操作模块46、第三操作模块47,读请求模块48、第二查找模块49、第四操作模块410和第三查找模块411以及第五操作模块412。
在图5对应实施例中下发模块42通过可用的I/O路径将备用存储区中数据写入存储阵列的过程中,写请求模块43发送了访问存储阵列的第二I/O请求,该第二I/O请求为写请求。写请求模块43发送第二I/O请求后,在服务器确定与存储阵列之间存在可用的I/O路径的情况下,若查找出在备用存储区中查找出第二I/O请求的访问区域没有存储数据,则直接在存储阵列中执行第二I/O请求的存取操作。
需要指出的是:以下各模块中的下发操作均包括复制操作和清除操作。
在第二I/O请求为写请求的情况下,第一查找模块44根据第二I/O请求,在备用存储区中查找出第二I/O请求的访问区域存储有数据时,第一操作模块45通过可用的I/O路径将备用存储区中第二I/O请求访问的区域中数据下发到存储阵列,再将第二I/O请求的数据写入存储阵列;或者,第二操作模块46在第二I/O请求为写请求时,在备用存储区中清除第二I/O请求访问的区域中数据,再通过可用的I/O路径,将第二I/O请求的数据写入存储阵列;或者,第三操作模块47,在第二I/O请求为写请求时,在备用存储区中写入第二I/O请求的数据,再通过可用的I/O路径将备用存储区中第二I/O请求访问的区域中数据下发到存储阵列。
对第三操作模块47进行改进后,第三操作模块47还具有以下功能:查找出第二I/O请求访问的区域的相邻区域中存储有数据,在备用存储区中写入第二I/O请求的数据;通过可用的I/O路径将第二I/O请求访问的区域中数据,以及第二I/O请求访问的区域的相邻区域中数据,下发到存储阵列。
在图5对应实施例中下发模块42通过可用的I/O路径将备用存储区中数据写入存储阵列的过程中,读请求模块48发送了访问存储阵列的第二I/O请求,该第二I/O请求为读请求。读请求模块48发送了访问存储阵列的第二I/O请求后,第二查找模块49在备用存储区中查找出第二I/O请求的访问区域存储有第二I/O请求的部分数据时,第四操作模块410通过可用的I/O路径将备用存储区中第二I/O请求访问的区域中数据,下发到存储阵列。
对第四操作模块410改进后,第四操作模块410还可有以下功能:查找出第二I/O请求访问的区域的相邻区域中存储有数据;通过可用的I/O路径,,将备用存储区中第二I/O请求访问的区域中数据和第二I/O请求访问的区域的相邻区域中数据,下发到存储阵列;再从存储阵列中读取第二I/O请求的数据。
第三查找模块411在备用存储区中查找出第二I/O请求的访问区域存储有第二I/O请求的全部数据时,第五操作模块412通过可用的I/O路径第五操作模块,从备用存储区中第二I/O请求的访问区域读取所述第二I/O请求的数据,并将备用存储区中第二I/O请求访问的区域中数据。
对第五操作模块412改进后,第五操作模块412还可有以下功能:查找出第二I/O请求访问的区域的相邻区域中存储有数据;通过可用的I/O路径,将备用存储区中所述第二I/O请求的访问区域中数据和第二I/O请求访问的区域的相邻区域中数据,下发到存储阵列。
本实施例中各模块的工作机理参见图3对应实施例中的描述,在此不再赘述。
本实施例服务器,在下发模块将备用存储区的数据写入存储阵列的过程中,根据第二I/O请求模块发送的第二I/O请求的类型,分别在备用存储区和存储阵列中执行存取操作,以提高从备用存储区向存储阵列传送数据的效率,同时保证存取阵列中数据的有效性。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。