一种rocksdb存储大值数据的方法
技术领域:
:1.本发明涉及nosql数据库
技术领域:
:,尤其涉及一种rocksdb存储大值数据的方法。
背景技术:
::2.rocksdb是一个可嵌入、持久型的key‑value(键值)存储,采用lsm树存储引擎,写入的数据会先存储到一个内存表中,当内存表中的数据大小超过设定的阈值后会启动一个后台线程,将内存表数据写到sst文件中,进行持久化存储。随着kv数据的写入,会生成很多的sst文件,sst文件采用分层式管理,除了最顶层(level‑0)之外,其他层的sst文件在同一层中都是按key的大小进行有序排列,并且sst文件之间没有重叠。上层文件满足一定条件会被定期压缩、合并形成下一层更大的文件,因此一个key‑value键值对会存在多次写磁盘的过程,产生写放大问题。3.hdfs是hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,为超大文件的处理需求而开发的。技术实现要素:4.为了解决以上技术问题,本发明提供了一种将较大值的value数据从sst文件的kv中分离出来存储到hdfs的方法,从而有效降低rocksdb对大值数据存储的写放大问题,可以提升大值数据的存储性能,并且100%兼容rockdbapi,可实现应用的平滑升级。5.本发明的技术方案是:6.一种将较大值的value数据从sst文件的kv中分离出来存储到hdfs的方法,将较大值数据的value从sst文件中分离出来单独存储到hdfs,不参与sst文件的合并,以降低sst文件的写放大问题。7.通过自定义hdfs表构建器将大值数据从kv中分离出来,单独存储到hdfs文件,sst中只存储key+hdfs文件路径。8.通过自定义hdfs文件收集器及扩展事件监听器来监听压缩合并事件,在压缩合并过程,比较输入、输出sst的kv数据的文件集合来删除hdfs文件。9.进一步的,10.通过使用tablepropertiescollector(表属性收集器)‑hdfs文件收集器来收集每个sst中有多少value是存放在hdfs上以及它们的文件路径,并将收集到的hdfs文件路径构建为一个文件集合。11.扩展事件监听器来监听压缩合并的事件,通过比较压缩合并过程中输入、输出sst文件的文件集合来决定哪些hdfs文件是需要删除的,采用2个文件集合异或方式选出待删除的hdfs文件,再通过hdfs文件系统接口删除这些大value值所存储的文件。12.进一步的,13.kv数据的写请求首先写入wal中,保证数据不丢失;14.然后再写入内存表中,当内存表数据达到所设定的阈值后,需要将内存表数据持久化到磁盘的sst文件,在将kv数据写入磁盘时判断kv数据中的value值是否大于阈值,如果大于阈值,则将大值value分离出来作为独立文件存储到hdfs。15.sst文件compaction时清理被标记删除的kv键值对,此时需要从hdfs把文件删除。16.进一步的,17.数据写入18.rocksdb支持用户使用自定义的表构建器将内存表的kv数据持久化,默认使用sst表构建器类将kv数据写入sst文件格式。使用hdfs表构建器,该构建器封装了sst表构建器类对sst文件的写操作和hdfs文件写操作。19.当需要持久化kv数据时,hdfs表构建器首先判断value值大小是否超过所设定的阈值,如果没有超过阈值,则直接调用原sst表构建器将key‑value数据写入sst文件;如果超过阈值,则判定为是大值value,首先要调用hdfsrpc客户端在hdfs文件系统创建一个唯一的文件,将大值value的内容写入该hdfs文件;hdfs文件写入成功后,将该hdfs文件路径作为新的kv数据,新key是原来的key,而新value则是原value值的引用‑“hdfs文件路径”,然后使用sst表构建器将这个新的kv数据写入sst文件,从而减小写入sst文件的数据量。20.在后期sst文件压缩、合并过程中,对新生成的kv进行处理,而存储在hdfs上的文件不需要合并,只需要删除即可。21.进一步的,22.kv数据读取23.在读取kv数据时,首先会从sst文件中读取key‑value数据,并判断该kv数据的value值类型,如果是普通value值则直接返回该kv数据;如果value是hdfs文件路径,则使用hdfs客户端通过hdfs文件系统接口读取该文件的内容,以文件内容作为新的value值,组成kv数据返回给客户端。24.进一步的,25.数据删除26.rocksdb所有的更新操作都是以追加的方式写入sst文件,kv数据的更新会作为新的版本写入文件,kv的删除则是对kv标记为“删除”,然后在压缩合并时对已经标记为“删除”的数据和旧版本的历史数据执行物理删除;27.采用大值value分离之后,收集压缩合并过程中所清理的key+path集合,然后删除hdfs文件系统上的这些文件。28.本发明的有益效果是29.1.通过本发明提出的方法可实现rocksdb的大值数据从sst分离出来,独立存放到hdfs文件系统,从而有效降低rocksdb的写放大问题。30.2.本发明提出的方法利用了rocksdb的扩展机制,对rocksdb侵入性小,100%兼容rocksdbapi,已有应用可平滑升级。附图说明31.图1是大值value分离架构示意图32.图2是hdfs表构建器流程示意图;33.图3是hdfspath收集流程示意图;34.图4是文件集合比对示意图。具体实施方式35.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。36.本发明提出了一种把较大值数据从sst文件的kv中分离出来存储到hdfs的方法,架构如图1所示,kv数据的写请求首先写入wal(预写日志文件)中,保证数据不丢失。然后再写入内存表中,当内存表数据达到所设定的阈值后,需要将内存表数据持久化到磁盘的sst文件,在将kv数据写入磁盘时判断kv数据中的value值是否大于阈值,如果大于阈值,则将大值value分离出来作为独立文件存储到hdfs。sst文件compaction时可能会清理被标记删除的kv键值对,此时需要从hdfs把文件删除。37.具体实现方法如下:38.1.数据写入39.rocksdb支持用户使用自定义的表构建器将内存表的kv数据持久化,默认使用sst表构建器类将kv数据写入sst文件格式。本发明使用新的表构建器类:hdfs表构建器,该构建器封装了sst表构建器类对sst文件的写操作和hdfs文件写操作,这样不用修改rocksdb的内存数据持久化流程就可以将较大的value从sst文件中分离出来,主要流程如图2所示。40.当需要持久化kv数据时,hdfs表构建器首先判断value值大小是否超过所设定的阈值(默认4mb),如果没有超过阈值,则直接调用原sst表构建器将key‑value数据写入sst文件。如果超过阈值,则判定为是大值value,首先要调用hdfsrpc客户端在hdfs文件系统创建一个唯一的文件,将大值value的内容写入该hdfs文件;hdfs文件写入成功后,将该hdfs文件路径作为新的kv数据,新key是原来的key,而新value则是原value值的引用‑“hdfs文件路径”,然后使用sst表构建器将这个新的kv数据写入sst文件,从而减小写入sst文件的数据量。在后期sst文件压缩、合并过程中,则只需要对新生成的kv进行处理,而存储在hdfs上的文件不需要合并,只需要删除即可,从而在大值value较多的场景下可以有效的减少写放大问题。41.2.kv数据读取42.本发明提出的方法在读取kv数据时,首先会从sst文件中读取的key‑value数据,并判断该kv数据的value值类型,如果是普通value值则直接返回该kv数据。如果value是hdfs文件路径,则使用hdfs客户端通过hdfs文件系统接口读取该文件的内容,以文件内容作为新的value值,组成kv数据返回给客户端。43.3.数据删除44.rocksdb所有的更新操作都是以追加的方式写入sst文件,kv数据的更新会作为新的版本写入文件,kv的删除则是对kv标记为“删除”,然后在压缩合并时对已经标记为“删除”的数据和旧版本的历史数据执行物理删除。而采用大值value分离之后,我们就需要收集压缩合并过程中所清理的key+path集合,然后删除hdfs文件系统上的这些文件。45.本发明通过使用自定义的tablepropertiescollector(表属性收集器)‑hdfs文件收集器来收集每个sst中有多少value是存放在hdfs上以及它们的文件路径,并将收集到的hdfs文件路径构建为一个文件集合,它的工作流程和数据格式如图3所示。46.然后扩展事件监听器来监听压缩合并的事件,通过比较压缩合并过程中输入、输出sst文件的文件集合来决定哪些hdfs文件是需要删除的,工作流程如图4所示,本发明采用2个文件集合异或方式选出待删除的hdfs文件,再通过hdfs文件系统接口删除这些大value值所存储的文件。47.以上所述仅为本发明的较佳实施例,仅用于说明本发明的技术方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所做的任何修改、等同替换、改进等,均包含在本发明的保护范围内。当前第1页1 2 3 当前第1页1 2 3