美文网首页分布式存储
rocksdb系列delete a range of keys

rocksdb系列delete a range of keys

作者: luomoxyz | 来源:发表于2018-08-10 19:39 被阅读430次

个人理解: delete a range of keys 就删除一定范围内的key, 比如删除所有以userid为前缀的keys

简单粗暴的方法

一种显而易见的方式就是遍历DB, 遇到特定范围里的key,直接调用Delete就可以了,这种方法适合于要删除的keys数量小的情况。另一方面, 这种方法有两个显著问题:

  • 问题一: 不能立刻收回资源,得等compaction完成后在能真正收回资源
  • 问题二: 大量的tombstones(也就是标记为del的key) 会减缓迭代器效率。

问题一的解决方法

  • 对要删除range key使用DeleteFilesInRange, 这个方法会直接删除只包含range keys的文件, 对于大块的range, 这个方法可以直接回收资源,值得注意的是:
    • 即使做完这个操作,一些在range keys范围内的数据依然存在于db中, 这个时候还需要一点的其他的opera
    • 这个操作直接忽视了snapshots, 导致可能通过snapshot 读不到本该可以读到的数据
  • compaction filter + compactRange, 一旦写个compaction filter, 做完compaction的时候,该删除的数据也没了。 在使用的时候, 可以设置CompactionFilter::IgnoreSnapshots = true, 这样的话, 就可以保证删除range keys,否则的话, 不能删除所有的keys , 这种方法也能很好的回收资源, 唯一的缺点是可能会增加I/O压力
  • 上述两种方法各有优缺点, 其实可以把他们综合起来, DeleteFilesInRange + compaction filter + compactRange

问题二的解决方法

这个问题比较难解决,可以仍然沿用问题一的解决方法。 但是,对大范围的range, 这种方法很有效, 如果range范围小,这种方法代价太高: 范围小导致DeleteFilesInRange可能并不能删除文件, CompactRange会对所有的包含delete range中的SST文件进行compaction,导致代价太高,这里有两种方法减轻这种代价

  • 如果你从来不改写已经存在的keys,使用DB::SingleDelete而不是Delete就可以很快消灭tombstones, 这种Tombstone可以很快被清除而不是被一直推到last level (笔者这里这不是很清楚, 待会看看)
  • 使用NewCompactOnDeletionCollectorFactory(), 可以在有大量tombstones的时候加快compaction

相关文章

  • rocksdb系列delete a range of keys

    个人理解: delete a range of keys 就删除一定范围内的key, 比如删除所有以userid...

  • 06-Redis 其它操作

    Redis 其它操作 delete(*names) exists(name) keys(pattern='*') ...

  • RocksDB系列二:RocksDB Option

      RocksDB用户可以通过Options类将配置信息传入引擎,除此之外,还可以以下其他方法设置,分别为: 通过...

  • Set Map WeakSet WeakMap

    Set 集合的数据结构 Set集合新增了add, delete ,Set.size,has,keys,clear,...

  • 说说 Python 的数值列表

    1 range() 函数 range() 函数可以生成一系列的数字: 运行结果: range() 函数会从我们所指...

  • Git操作手册

    配置 GitHub 进入 Github的SSH keys 如果页面里已经有一些 key,就点「delete」按钮把...

  • RocksDB系列一:RocksDB基础和入门

    1、简介 RocksDB是FaceBook起初作为实验性质开发的一个高效数据库软件,旨在充分实现快存上存储数...

  • RocksDB系列十七:Repairer

    Overview   Repairer会在RocksDB出现宕机等严重问题时尽最大努力去恢复尽可能多的数据,但是,...

  • RocksDB系列五:MemTable

      MemTable是一种在内存中保存数据的数据结构,然后再在合适的时机,MemTable中的数据会flush到S...

  • RocksDB系列四:MANIFEST

      RocksDB对文件系统和存储介质是不可知的。文件系统的操作不是原子的,所以很有可能在系统故障时导致不一致。即...

网友评论

    本文标题:rocksdb系列delete a range of keys

    本文链接:https://www.haomeiwen.com/subject/nllqvftx.html