一种基于重定向和日志混合的本地存储方法及系统与流程

文档序号:30287436发布日期:2022-06-04 13:10阅读:166来源:国知局
一种基于重定向和日志混合的本地存储方法及系统与流程

1.本发明涉及分布式存储领域,特别是一种基于重定向和日志混合的本地存储方法及系统。


背景技术:

2.分布式存储写本地事务的时候,需要保证本地事务的原子性,本地事务的原子性表示一个事务要么完整执行,要么不执行,这意味着,事务的各项任务都必须正确执行,如果有一任务执行失败,则整个事务会被终止,且此前对事务所做的修改不生效,如果事务所有的修改都被执行成功,则整个事务完成,且该事务对数据所做的修改是永久性的,覆盖写一般通过重定向写或写前日志的方式来保证,目前主流做法主要有两种:(1)ceph(一种分布式存储架构)中filestore(一种本地存储引擎)的做法,所有本地事务都先写本地日志,写完本地日志后即可给上层返回本地事务完成,然后再把数据写到数据盘上,当掉电后,filestore会从本地日志中读取数据进行回放操作,从而还原掉电前的状态,如图1所示,主要包括以下步骤:1)filestore引入本地日志,所有写事务在写本地数据盘之前,先写本地日志,且所有写事务在写完本地日志后都会返回;2)filestore写本地事务完成后,该事务会被塞到filestore的操作队列,然后多线程从该队列中取操作并写入数据盘;3)filestore将写事务写到数据盘后,对应的本地日志可以删除这部分数据;4)当filestore发生异常崩溃时,通过回放本地日志,可以恢复到崩溃前的状态,该方案将所有写事务都需要先写本地日志,会带来一倍的写放大,虽然保证了原子性,但在性能上会有负面影响。
3.(2)ceph中bluestore(一种本地存储引擎)的做法:采用直接管理裸盘,并使用重定向写的方式来解决写事务的原子性问题,写入的数据如果与最小分配单元大小对齐,则使用row(redirect on write,写时重定向)的方式,将数据写到新的地址空间,然后更改元数据索引,并回收原先占用的空间,元数据更新的原子性由kv数据库(一种数据库)的事务特性进行保障,对于非最小分配单元对齐的区域,则使用rmw(read modify write,读改写)的方式进行原地覆盖写,先读取非块大小对齐区域所在块,然后利用kv数据库来实现日志功能,将覆盖写的数据记到kv数据库中,完成以后再将数据覆盖写入到实际的数据区域,落盘成功以后再删除日志中的记录,如图2所示,具体包括以下步骤:1)bluestore对于写事务如果是新写或最小分配单元对齐的覆盖写,则先新分配空间写本地事务数据,写完数据后再提交元数据kv(即键值)到kv数据库;2)bluestore对于写事务如果是非最小分配单元对齐的覆盖写,则先将覆盖写的数据和元数据kv提交到kv数据库,然后io(即写操作)返回给上层,并将这部分覆盖写的事务放到defer队列(即小块写队列);3)deferred_finisher线程(即小块写处理线程)从defer队列中取出覆盖写的事务,写到数据盘上,然后再去删除kv数据库中记录的覆盖写事务的数据;4)当bluestore发生异常崩溃时,对于新写或最小分配单元对齐的覆盖写的数据,依赖于元数据kv写kv数据库是否成功来保证原子性,如果元数据kv写成功则通过元数据kv能索引到重定向写的数据,如果元数据kv写失败则通过之前的
元数据kv能索引到之前这块数据所在的区域;5)当bluestore发生异常崩溃时,对于非最小分配单元对齐的覆盖写的数据,依赖于这部分数据写kv数据库是否成功来保证原子性,如果这部分覆盖写的数据写kv数据库成功,则通过defer事务回放来恢复掉电前的状态;如果这部分数据写kv数据库失败,则通过之前的元数据kv能索引到之前这块数据所在的区域。该方案采用重定向和写kv数据库结合来保证原子性,但写kv数据库的过程中,kv数据库的wal(write ahead log,写前日志)只支持单线程追加写,对于有大量非最小分配单元对齐的覆盖写的场景,会在写wal上存在明显的性能瓶颈。另外,该部分覆盖写的数据写到kv数据库,再将该部分数据写到数据盘上后,还要从kv数据库中去删除该数据,既增加了写db的io次数,同时这样也给kv数据库后期压缩也带来了更大的压力。
4.现有技术中,专利文献(cn111966295a)公开了一种基于ceph的多journal(即日志)记录方法,其中预先为每个shard队列建立对应的journal队列和journal文件,每个journal文件有其对应的文件标识,当目标shard(即分片)队列中生成新的journal数据时,将journal数据插入到目标journal队列,根据目标journal队列所对应的文件标识确定出相对应的目标journal文件,将journal数据存储至目标journal文件中,通过对每个shard队列建立对应的journal队列和journal文件,无需额外调用写线程,减少了io栈中的线程切换带来的性能损耗,同时实现了osd(即分布式存储设备)中shard队列的joural数据的并行处理。该方案为每个shard队列建立对应的journal队列和journal文件,主要存在的缺点有:(1)该方案把journal的数据放到journal队列后,需要线程从journal队列中取出来写journal文件,这里在性能上会有一次入队出队的开销,还有线程切换的开销;(2)该方案依赖于journal文件,这就会依赖于不同的文件系统和文件格式;(3)该方案和ceph filestore一样将所有的写io都先写journal,会造成一倍的写放大。


技术实现要素:

5.为了解决现有技术中为了保证本地事务的原子性,会对存储系统的性能造成很大影响的技术问题,本发明提出一种基于重定向和日志混合的本地存储方法及系统。
6.为此,本发明提出的基于重定向和日志混合的本地存储方法具体包括如下步骤:s1、当收到一个数据写入请求后,通过元数据信息查找请求数据在存储设备数据盘对应的位置信息;s2、根据位置信息判断是否为初次写或是数据块单元对齐的覆盖写,如果判断结果为是,进入步骤s3,否则进入步骤s4;s3、数据部分采用重定向写:首先在存储设备数据盘上重新分配一块物理空间,然后把数据写入该物理空间,进入步骤s6;s4、根据位置信息判断是否为非数据块单元对齐的覆盖写,如果判断结果为是,进入步骤s5,否则进入步骤s6;s5、将覆盖写数据和元数据一起打包写入本地日志,进入步骤s7;s6、把元数据打包写本地日志,进入步骤s7;s7、写完本地日志后写kv数据库的内存缓存,然后将写操作的响应返回给上层,如果存在非数据块单元对齐的覆盖写,则提交这部分覆盖写数据到存储设备数据盘;s8、当kv数据库的内存缓存持久化时,将元数据写到本地日志里面的条目进行删
除标记。
7.进一步地,所述基于重定向和日志混合的本地存储方法除包括初次写或数据块单元对齐覆盖写场景和非数据块单元对齐覆盖写场景外,还包括混合场景。
8.进一步地,在所述初次写或数据块单元对齐覆盖写场景下,s3具体包括如下步骤:s11、申请一个新的定长块空间,将数据通过重定向写操作落盘,如果是数据块单元对齐覆盖写,则在kv数据库中记录待回收的空间,用于后续将这部分空间进行回收;s12、将元数据打包成本地日志的一个条目,异步提交本地日志;s13、将元数据写内存缓存,然后将回调放入队列让写操作返回;s14、当kv数据库的内存缓存持久化时,将元数据写到本地日志里面的条目进行删除标记。
9.进一步地,在所述非数据块单元对齐覆盖写场景下,s5具体包括如下步骤:s21、将覆盖写的数据和元数据封装成本地日志的一个条目,通过异步写操作落盘;s22、异步写操作成功后,将元数据同步到内存缓存,把回调放入队列让写操作返回,然后再将数据异步提交;s23、然后再将覆盖写数据异步提交,后台线程读取内存中的覆盖写数据,并写入所述数据写入请求对应的存储设备数据盘磁盘区域。
10.本发明提出的本地存储系统具体包括数据存储介质和中央处理器,所述数据存储介质存储有计算机程序,所述数据存储介质包括存储设备加速盘和存储设备数据盘,所述存储设备加速盘存储有本地日志,所述存储设备数据盘存储有磁盘数据,所述中央处理器通过执行所述计算机程序能够实现上述基于重定向和日志混合的本地存储方法。
11.进一步地,所述本地日志包括多个分片结构,每个片分区空间独立管理,包括一个表头结构和多个条目结构,所述表头结构用于管理相应分片本地日志的空间,所述条目结构是本地日志的条目。
12.进一步地,在本地日志即将写满或本地存储进程正常退出的时候触发本地日志的主动删除。
13.进一步地,kv数据库刷新内存缓存时触发本地日志的被动删除。
14.进一步地,当所述本地存储系统掉电重启后,通过回放本地日志,来重做掉电前的事务,将事务中的元数据写入kv数据库,将数据写入磁盘,保证事务的原子性。
15.本发明提出的计算机可读存储介质存储有可被中央处理器运行的计算机程序,所述中央处理器通过运行所述计算机程序能够实现上述基于重定向和日志混合的本地存储方法。
16.相对于现有技术,本发明具有如下有益效果:1)将磁盘空间分配重定向和日志结合来保证本地存储中事务的原子性;2)数据块单元对齐的覆盖写数据采用磁盘重定向来保证事务的原子性,这样能减少写本地日志带来的写放大,同时本地日志空间采用循环覆盖写,这样的大块写数据不写本地日志,也能节省本地日志空间;3)非数据块单元对齐的覆盖写数据写到本地日志,减小了频繁使用磁盘空间分配重定向带来的磁盘剩余空间碎片化问题;
4)对于覆盖写的数据,只记录到本地日志,不会像bluestore先写入kv数据库中后面又删除,减小了kv数据库的元数据写入压力和后续压缩压力。
17.在本发明的一些实施例中,还具有如下有益效果:1)数据块单元对齐的覆盖写数据采用磁盘重定向方式,将数据写到新的地址空间,然后更改元数据索引,并回收原先占用的空间,元数据更新的原子性由本地日志的事务特性进行保障;2)非数据块单元对齐的覆盖写数据使用读改写的方式进行原地覆盖写,先读取非块大小对齐区域所在块,然后利用本地日志来实现日志功能,将覆盖写的数据记到本地日志中,完成以后再将数据覆盖写入到实际的数据区域;3)本地日志支持分片进行多线程并发写,和bluestore相比提高了元数据的并发写入性能;4)当本地存储系统掉电重启后,通过本地日志的表头结构获取有效的日志条目信息,然后回放本地日志中的元数据和覆盖写数据来保证事务的原子性。
附图说明
18.图1是现有技术中filestore的本地存储过程示意图;图2是现有技术中bluestore的本地存储过程示意图;图3是本发明实施例本地存储方法的处理流程图;图4是本发明实施例初次写或chunsize对齐覆盖写场景下的处理流程图;图5是本发明实施例非chunksize对齐覆盖写场景下的处理流程图;图6是本发明实施例混合场景下的处理流程图;图7是本发明实施例本地日志的结构示意图。
具体实施方式
19.为了对本发明的技术特征、目的和效果有更加清楚的理解,现对照附图说明本发明的具体实施方式。
20.如图3所示,本发明实施例提出的基于重定向和日志混合的本地存储方法具体包括如下步骤:s1、当收到一个数据写入请求后,通过元数据信息查找该请求数据在存储设备数据盘对应的位置信息。
21.s2、根据位置信息判断是否为初次写或是数据块单元对齐的覆盖写,初次写指的是本次事务写的数据区域之前没写过,数据块单元对齐的覆盖写指的是本次事务写的区域之前写过但是这段区域是数据块单元对齐的,如果判断结果为是,进入步骤s3,否则进入步骤s4。
22.s3、数据部分采用重定向写,具体地,数据异步写块设备,如果是数据块单元对齐覆盖写,则在kv数据库中记录待回收的空间,用于后续将这部分空间进行回收,进入步骤s6。
23.s4、根据位置信息判断是否为非数据块单元对齐的覆盖写,非数据块单元对齐的覆盖写指的是本次事务写的区域之前写过,且这段区域是非数据块单元对齐的,如果判断
结果为是,进入步骤s5,否则进入步骤s6。
24.s5、该部分覆盖写数据和元数据一起打包写入本地日志,本地日志支持配置分片并发写,具体地,先将数据和元数据封装成本地日志的一个条目,然后分片写本地日志,进入步骤s7。
25.s6、把元数据打包写本地日志,具体地,写完返回后将元数据封装成本地日志的一个条目,然后分片异步写本地日志,进入步骤s7。
26.s7、写完本地日志后写kv数据库内存缓存,然后将写操作的响应(io)返回给上层,如果存在非数据块单元对齐的覆盖写,则提交这部分覆盖写数据到存储设备数据盘。
27.s8、当kv数据库内存缓存持久化时,将元数据写到本地日志里面的条目进行删除标记。
28.基于重定向和日志混合的本地存储方法除包括初次写或数据块单元对齐覆盖写场景和非数据块单元对齐覆盖写场景外,还包括混合场景。
29.在初次写或数据块单元对齐覆盖写场景下,数据异步写存储设备数据盘,写完返回后将元数据封装成本地日志的一个条目,然后分片异步写本地日志到存储设备加速盘,日志落盘成功后同步到kv数据库内存缓存,然后将io返回给上层,如图4所示,s3具体包括:s11、osd::osd_op_tp线程将数据异步提交aio落盘,osd::osd_op_tp线程分片并发,在块设备上会申请一个新的定长块空间,将数据通过重定向写操作落盘,如果是数据块单元对齐覆盖写,则在kv数据库中记录待回收的空间 ,用于后续将这部分空间进行回收;s12、ascache::as_finish线程回调回来,将元数据打包成本地日志的一个条目,异步提交本地日志;s13、kerneldevice::aio_thread线程回调回来,将元数据写入内存缓存,然后将回调放入队列让io返回;s14、当kv数据库内存缓存持久化时,kv数据库::bg0线程将元数据写到本地日志里面的条目进行删除标记,这样来删除日志。
30.在非数据块单元对齐覆盖写场景下,先将数据和元数据封装成本地日志的一个条目,然后分片写本地日志到存储设备加速盘,写完本地日志后再写内存缓存,然后提交数据异步落盘,如图5所示,s5具体包括:s21、osd::osd_op_tp线程将覆盖写的数据和元数据封装成本地日志的一个条目, aio(即异步写操作)落盘;s22、kerneldevice::aio_thread线程回调回来,将元数据提交到内存缓存进行同步,把回调放入队列让io(即写操作)返回,然后再将覆盖写数据异步提交到存储设备数据盘;s23、ascache::as_finish线程做整个io的收尾工作;s24、当kv数据库内存缓存持久化时,kv数据库::bg0线程将元数据写到本地日志里面的条目进行删除标记,这样来删除日志。
31.在混合场景下,先写数据块单元对齐部分的数据到存储设备数据盘,然后写元数据和非数据块单元对齐部分的数据到本地日志,然后io(写操作的响应)即可返回,再将非数据块单元对齐覆盖写部分的数据写入存储设备数据盘,如图6所示,具体包括:s31、osd::osd_op_tp线程进行数据块单元对齐部分的数据aio(即异步写操作)提交,osd::osd_op_tp线程分片并发;s32、ascache::as_finish线程将元数据和非数据块单元对齐的覆盖写数据一起打包成本地日志的一个条目,异步提交到本地日志盘,元数据同步到数据库内存缓存后,写请求再返回(然后io即可返回);s33、然后kerneldevice::aio_thread线程再将非数据块单元对齐的覆盖写数据异步提交到存储设备数据盘;s34、当kv数据库内存缓存持久化时,kv数据库::bg0线程将元数据写到本地日志里面的条目进行删除标记,这样来删除日
志。
32.本发明实施例提出一种本地存储系统,系统包括数据存储介质和中央处理器,数据存储介质存储有计算机程序,数据存储介质包括存储设备加速盘和存储设备数据盘,存储设备加速盘存储有本地日志,存储设备数据盘存储有磁盘数据和计算机程序,中央处理器通过执行计算机程序能够实现上述基于重定向和日志混合的本地存储方法。
33.对于本地日志进行详细说明。如图7所示,将一个osd的加速盘日志分区根据osd的片数量进行逻辑划分,每个片分区空间独立管理,包括一个header(即表头)结构和多个entry(即条目)结构,header结构用于管理相应分片本地日志的空间,比如日志的大小,有效日志项的起始偏移,entry结构是本地日志的条目,每个条目大小按block size对齐,包含日志项头部和日志数据两部分,其中日志项头部记录本地日志的seq、各项日志数据的长度以及crc信息,日志数据包含对象元数据,可能包含bkey元数据和覆盖写数据。
34.日志删除是指日志成功应用完成,相应的日志数据已经确保写入磁盘后,那么这部分日志就可以删除,释放相应的日志空间。本发明中本地日志采用追加写入的方式进行,在本地日志前面的entry里面数据已经安全持久化的情况下,要对该entry进行删除标记,将删除标记的信息记录到该本地日志的header中,这样在本地日志回放的时候就不会回放该entry,这样既能达到删除的效果,同时又能减少一次删除的io。本地日志的删除分为主动删除和被动删除两种机制,主动删除机制用作在本地日志即将写满或本地存储进程正常退出的时候触发,具体地,如果当前条目写入后本地日志的实际容量大于了本地日志设置的容量时,就需要主动触发删除本地日志来释放一部分空间,供后续本地日志条目写入,另外,当本地存储进程安全退出的情况下,也对本地日志进行主动触发删除,这样在后面本地存储进程拉起的时候,就不用回放本地日志,被动删除用作kv数据库这边刷新内存缓存的时候触发,具体地,在每次写本地日志和kv数据库内存缓存的时候,增加写入一个key来记录该事务写入本地日志条目的seq,key的value里面记录着该条目的分片id号,后面当kv数据库中内存缓存进行刷新时,当key为本地日志标记的类型key时,就根据value获得要被删除的本地日志条目seq,再根据本地日志条目seq去更新对应的本地日志 header信息,完成本地日志删除标记,这种本地日志类型标记的key在刷新内存缓存的时候,不添加到kv数据库的文件构建里面,这样下刷的时候过滤掉这种key,后续不用从数据库中去删除,不会影响压缩效率。
35.日志回放的过程主要是通过回放本地日志,来重做掉电前的事务,将事务中的元数据写入kv数据库,将数据写入磁盘,保证事务的原子性。当本地存储进程在掉电前写到本地日志的一些事务的元数据和覆盖写的数据,通过本地日志的header信息能获取到有效的条目信息,然后通过日志回放将日志里面的元数据kv写到kv数据库,将覆盖写的数据写到存储设备数据盘,这样在掉电起来后进一步完成这些事务。具体地,本地日志回放时采用两次回放的方案,各层初始化顺序如下:1)cache层(即缓存层)先初始化;2)若有cache,日志第一次回放,只回放bkey,使cache层将bkey插入到btree;3)初始化数据库,完成后数据库可以正常工作;4)日志里面除了bkey外的别的entry进行回放;5)在store层(即存储层)还原内存的cache和kv数据库元数据后,再初始化freelistmanager和allocator,初始化agilestore的内存元数据。
36.本实施例还公开一种计算机可读存储介质,其存储有可被中央处理器运行的计算
机程序,中央处理器通过运行所述计算机程序能够实现上述的基于重定向和日志混合的本地存储方法。
37.相对于现有技术,本发明具有如下有益效果:1)将磁盘空间分配重定向和日志结合来保证本地存储中事务的原子性;2)数据块单元对齐的覆盖写数据采用磁盘重定向方式,将数据写到新的地址空间,然后更改元数据索引,并回收原先占用的空间,元数据更新的原子性由本地日志的事务特性进行保障,这样能减少写本地日志带来的写放大,同时本地日志空间采用循环覆盖写,这样的大块写数据不写本地日志,也能节省本地日志空间;3)非数据块单元对齐的覆盖写数据使用读改写的方式进行原地覆盖写,先读取非块大小对齐区域所在块,然后利用本地日志来实现日志功能,将覆盖写的数据记到本地日志中,完成以后再将数据覆盖写入到实际的数据区域,减小了频繁使用磁盘空间分配重定向带来的磁盘剩余空间碎片化问题;4)本地日志支持分片进行多线程并发写,和bluestore相比提高了元数据的并发写入性能;5)对于覆盖写的数据,只记录到本地日志,不会像bluestore先写入kv数据库中后面又删除,减小了kv数据库的元数据写入压力和后续压缩压力;6)本地日志的删除结合kv数据库的刷新来做,当元数据kv(即键值)从内存缓存刷新到元数据盘持久化后,再将本地日志中记录的相关条目给删除掉;7)当本地存储系统掉电重启后,通过本地日志的header结构获取有效的日志条目信息,然后回放本地日志中的元数据和覆盖写数据来保证事务的原子性。
38.以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围。应当指出,对于本技术领域的技术人员,在不脱离本发明设计结构及原理的前提下对本发明方案所作的等同变化都视作本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1