存储系统写盘失败时的重写方法、装置、设备和存储介质与流程

文档序号:13845389阅读:351来源:国知局
存储系统写盘失败时的重写方法、装置、设备和存储介质与流程

本发明属于存储系统技术领域,特别是涉及存储系统写盘失败时的重写方法、装置、设备和存储介质。



背景技术:

ceph后端支持多种存储引擎,以插件式的方式来进行管理使用,包括filestore、kvstore、memstore和bluestore等等,目前最新的存储引擎为bluestore。bluestore减少了之前的存储引擎存在的写放大问题,并针对ssd盘做优化,而且直接管理裸盘,从理论上进一步减少文件系统部分的开销,将成为ceph未来默认的存储引擎。

bluestore在写操作时,根据io在对象中的起始位置偏移和长度是否按最小分配单位对齐,将该io划分到若干个blob中,具体的,每一个io都是用一个二元组(偏移,长度)来表示的,其中偏移是相对于io所操作对象的偏移,整块磁盘按某个固定的大小(最小分配单位)划分为多个分配单位,每次分配空间时都要按这个分配单位的整数倍来分配,为io分配空间时根据io的(偏移,长度)是否按最小分配单位对齐(也就是偏移和长度的值是否能整除最小分配单位的值)将对齐部分和不对齐部分分别划分到不同的逻辑空间中,(对齐部分即为在这个“偏移”位置开始的“长度”范围内,有多少空间是占满最小分配单位的,不对齐部分即为io的“偏移”开始或结束部分占不满一个最小分配单位的空间。

对划分到每一个blob中的数据,根据数据长度分配磁盘空间,并将数据在对象中的偏移转换为磁盘空间的绝对偏移,通过linuxaio写入盘中。如果写盘失败,则负责写盘的osd进程会自动退出,这样一旦磁盘中存在一定范围的坏块,分配空间时又正好分配了坏块空间,写数据时就会失败,进程就会自动退出,而坏块无标记,下次分配时可能还会分配到,进程反复退出会导致系统稳定性变差。



技术实现要素:

为解决上述问题,本发明提供了存储系统写盘失败时的重写方法、装置、设备和存储介质,能够避免单次写入失败导致进程退出问题,提升存储系统的稳定性。

本发明提供的存储系统写盘失败时的重写方法,包括:

当写盘失败时,对写盘失败的io进行记录;

当前事务的io完成后,遍历写盘失败的io,查找所述写盘失败的io所归属的逻辑空间;

根据所述逻辑空间的大小重新分配新的磁盘空间,并将所述新的磁盘空间更新到对应的所述逻辑空间中,将所述写盘失败的io的数据写入所述新的磁盘空间中;

将所述写盘失败的io所属的逻辑空间对应的原来的磁盘空间标记为已使用。

优选的,在上述存储系统写盘失败时的重写方法中,所述查找所述写盘失败的io所归属的逻辑空间为:

根据所述写盘失败的io在磁盘空间上的偏移在本次事务中所有写对象的所有blob中查找所述写盘失败的io所归属的对象和blob。

优选的,在上述存储系统写盘失败时的重写方法中,所述将所述写盘失败的io的数据写入所述新的磁盘空间中为:

通过linuxaio提交写操作,将所述写盘失败的io的数据写入所述新的磁盘空间中。

本发明提供的存储系统写盘失败时的重写装置,包括:

记录单元,用于当写盘失败时,对写盘失败的io进行记录;

查找单元,用于当前事务的io完成后,遍历写盘失败的io,查找所述写盘失败的io所归属的逻辑空间;

重写单元,用于根据所述逻辑空间的大小重新分配新的磁盘空间,并将所述磁盘空间更新到对应的所述逻辑空间中,将所述写盘失败的io的数据写入所述新的磁盘空间中;

标记单元,用于将所述写盘失败的io所属的逻辑空间对应的原来的磁盘空间标记为已使用。

优选的,在上述存储系统写盘失败时的重写装置中,所述查找单元具体用于根据所述写盘失败的io在磁盘空间上的偏移在本次事务中所有写对象的所有blob中查找所述写盘失败的io所归属的对象和blob。

优选的,在上述存储系统写盘失败时的重写装置中,所述重写单元具体用于通过linuxaio提交写操作,将所述写盘失败的io的数据写入所述新的磁盘空间中。

本发明提供的存储系统写盘失败时的重写设备,包括:

存储器,用于存储计算机程序;

处理器,用于执行所述计算机程序时实现如上面任一项所述存储系统写盘失败时的重写方法的步骤。

本发明提供的存储介质,所述存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上面任一项所述存储系统写盘失败时的重写方法的步骤。

通过上述描述可知,本发明提供的上述存储系统写盘失败时的重写方法、装置、设备和存储介质,该方法包括当写盘失败时,对写盘失败的io进行记录;当前事务的io完成后,遍历写盘失败的io,查找所述写盘失败的io所归属的逻辑空间;根据所述逻辑空间的大小重新分配新的磁盘空间,并将所述新的磁盘空间更新到对应的所述逻辑空间中,将所述写盘失败的io的数据写入所述新的磁盘空间中;将所述写盘失败的io所属的逻辑空间对应的原来的磁盘空间标记为已使用,因此能够避免单次写入失败导致进程退出问题,提升存储系统的稳定性。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为本申请实施例提供的第一种存储系统写盘失败时的重写方法的示意图;

图2为本申请实施例提供的第一种存储系统写盘失败时的重写装置的示意图;

图3为本申请实施例提供的存储系统写盘失败时的重写设备的示意图。

具体实施方式

本发明的核心思想在于提供存储系统写盘失败时的重写方法、装置、设备和存储介质,能够避免单次写入失败导致进程退出问题,提升存储系统的稳定性。

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本申请实施例提供的第一种存储系统写盘失败时的重写方法如图1所示,图1为本申请实施例提供的第一种存储系统写盘失败时的重写方法的示意图,该方法包括如下步骤:

s1:当写盘失败时,对写盘失败的io进行记录;

需要说明的是,可以但不限于利用linuxaio(异步输入/输出)方式进行写盘,这里只是对写盘失败的io记录,暂时不做其他处理。

s2:当前事务的io完成后,遍历写盘失败的io,查找所述写盘失败的io所归属的逻辑空间;

需要说明的是,一次事务提交中会包含多个io,必须等该事务中所有的io都完成后才能对该事务跳转到下一个处理状态,处理流程是针对事务的,所以必须得等到事务中的io完成后,才能遍历写盘失败的io。一次事务提交中可能有多个io,每一个io都对应着一个具体的对象,在写数据分配空间的过程中,会先为对象分配逻辑存储空间,再为逻辑存储空间分配物理空间,每一块物理空间都是用“偏移+长度”的二元组来表示的。当物理空间写失败时,则需要遍历当前事务中的每一个对象的每一个逻辑空间所包含的物理空间,通过匹配物理空间二元组的偏移值,以确定写失败的物理空间属于哪个对象的哪个逻辑空间。

s3:根据所述逻辑空间的大小重新分配新的磁盘空间,并将所述新的磁盘空间更新到对应的所述逻辑空间中,将所述写盘失败的io的数据写入所述新的磁盘空间中;

需要说明的是,先找到与逻辑空间大小匹配的新的磁盘空间,然后将其与该逻辑空间的对应关系进行更新,写入数据,当新的磁盘空间依然无法写入时,则循环该步骤继续寻找磁盘空间,直到写入成功为止。

s4:将所述写盘失败的io所属的逻辑空间对应的原来的磁盘空间标记为已使用。

需要说明的是,磁盘空间分配器记录的分配单元的状态为未使用/已使用两种状态,对于故障单元来说,会将故障状态持久化保存到磁盘的元数据中,但分配器中的状态需要设置为已使用,以保证后续分配时不会被分配。需要指出的是,分配器是通过比特位来标记是否使用的,只能标记未使用和已使用两种状态,故对于故障单元在分配器中直接标记为已使用,能保证其在后续过程中不再被分配。

可见这种方案能够在磁盘存在坏块时依然保证数据写入成功,同时坏块只会被访问一次,后续分配空间不再分配坏块,进程也不会再因为写失败而退出,大大提升了坏块时系统的稳定性。

本申请实施例提供的第一种存储系统写盘失败时的重写方法,由于包括当写盘失败时,对写盘失败的io进行记录;当前事务的io完成后,遍历写盘失败的io,查找所述写盘失败的io所归属的逻辑空间;根据所述逻辑空间的大小重新分配新的磁盘空间,并将所述新的磁盘空间更新到对应的所述逻辑空间中,将所述写盘失败的io的数据写入所述新的磁盘空间中;将所述写盘失败的io所属的逻辑空间对应的原来的磁盘空间标记为已使用,因此能够避免单次写入失败导致进程退出问题,提升存储系统的稳定性。

本申请实施例提供的第二种存储系统写盘失败时的重写方法,是在上述第一种存储系统写盘失败时的重写方法的基础上,还包括如下技术特征:

所述查找所述写盘失败的io所归属的逻辑空间为:

根据所述写盘失败的io在磁盘空间上的偏移在本次事务中所有写对象的所有blob中查找所述写盘失败的io所归属的对象和blob。

需要说明的是,其中所述的blob是bluestore存储中对象的逻辑存储空间,一个对象可以有多个blob。

本申请实施例提供的第三种存储系统写盘失败时的重写方法,是在上述第二种存储系统写盘失败时的重写方法的基础上,还包括如下技术特征:

所述将所述写盘失败的io的数据写入所述新的磁盘空间中为:

通过linuxaio提交写操作,将所述写盘失败的io的数据写入所述新的磁盘空间中。

利用这种方式来提交是一种常见的方式。

本申请实施例提供的第一种存储系统写盘失败时的重写装置如图2所示,图2为本申请实施例提供的第一种存储系统写盘失败时的重写装置的示意图,该装置包括:

记录单元201,用于当写盘失败时,对写盘失败的io进行记录,需要说明的是,可以但不限于利用linuxaio(异步输入/输出)方式进行写盘,这里只是对写盘失败的io记录,暂时不做其他处理;

查找单元202,用于当前事务的io完成后,遍历写盘失败的io,查找所述写盘失败的io所归属的逻辑空间,需要说明的是,一次事务提交中会包含多个io,必须等该事务中所有的io都完成后才能对该事务跳转到下一个处理状态,处理流程是针对事务的,所以必须得等到事务中的io完成后,才能遍历写盘失败的io,一次事务提交中可能有多个io,每一个io都对应着一个具体的对象,在写数据分配空间的过程中,会先为对象分配逻辑存储空间,再为逻辑存储空间分配物理空间,每一块物理空间都是用“偏移+长度”的二元组来表示的,当物理空间写失败时,则需要遍历当前事务中的每一个对象的每一个逻辑空间所包含的物理空间,通过匹配物理空间二元组的偏移值,以确定写失败的物理空间属于哪个对象的哪个逻辑空间;

重写单元203,用于根据所述逻辑空间的大小重新分配新的磁盘空间,并将所述磁盘空间更新到对应的所述逻辑空间中,将所述写盘失败的io的数据写入所述新的磁盘空间中,需要说明的是,先找到与逻辑空间大小匹配的新的磁盘空间,然后将其与该逻辑空间的对应关系进行更新,写入数据,当新的磁盘空间依然无法写入时,则循环该步骤继续寻找磁盘空间,直到写入成功为止;

标记单元204,用于将所述写盘失败的io所属的逻辑空间对应的原来的磁盘空间标记为已使用,需要说明的是,磁盘空间分配器记录的分配单元的状态为未使用/已使用两种状态,对于故障单元来说,会将故障状态持久化保存到磁盘的元数据中,但分配器中的状态需要设置为已使用,以保证后续分配时不会被分配,需要指出的是,分配器是通过比特位来标记是否使用的,只能标记未使用和已使用两种状态,故对于故障单元在分配器中直接标记为已使用,能保证其在后续过程中不再被分配。

可见这种方案能够在磁盘存在坏块时依然保证数据写入成功,同时坏块只会被访问一次,后续分配空间不再分配坏块,进程也不会再因为写失败而退出,大大提升了坏块时系统的稳定性。

本申请实施例提供的第二种存储系统写盘失败时的重写装置,是在上述第一种存储系统写盘失败时的重写装置的基础上,还包括如下技术特征:

所述查找单元具体用于根据所述写盘失败的io在磁盘空间上的偏移在本次事务中所有写对象的所有blob中查找所述写盘失败的io所归属的对象和blob。

需要说明的是,其中所述的blob是bluestore存储中对象的逻辑存储空间,一个对象可以有多个blob。

本申请实施例提供的第三种存储系统写盘失败时的重写装置,是在上述第二种存储系统写盘失败时的重写装置的基础上,还包括如下技术特征:

所述重写单元具体用于通过linuxaio提交写操作,将所述写盘失败的io的数据写入所述新的磁盘空间中。

利用这种方式来提交是一种常见的方式。

本申请实施例提供的存储系统写盘失败时的重写设备如图3所示,图3为本申请实施例提供的存储系统写盘失败时的重写设备的示意图,该设备包括:

存储器301,用于存储计算机程序;

处理器302,用于执行所述计算机程序时实现如上面任一种所述存储系统写盘失败时的重写方法的步骤。

本申请实施例提供的存储介质,所述存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上面任一种所述存储系统写盘失败时的重写方法的步骤。

上述设备和存储介质由于能够执行所述计算机程序时实现如上面任一种所述存储系统写盘失败时的重写方法的步骤,因此能够避免单次写入失败导致进程退出问题,提升存储系统的稳定性。

对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1