wiredtiger LSM trees bloom filter 设计原理

最近在做的调研中,其中包括了mongodb wiredtiger LSM trees bloom filter 部分,秉承着好记性不如烂笔头的原则, 做个简单的记录,不保证完全正确,欢迎讨论交流。

bloom filter 来源

wiredtiger 也提供了LSM trees 的结构作为持久化存储, 当in-memory tree 大小达到阈值后, 新的in-memory tree会被创建, 旧的in-memory tree会被刷到磁盘。LSM trees 天然支持更快写操作,然而对读操作就不怎么友好了。所以为了增加读性能,bloom filter诞生了。相当于在每个物理存储的 tree 前面加了一个filter, 更快速的定位到key 是否存在这个物理块中。

hash & bitmap

bloom filter 是一个bitmap。
一个key 被k个hash 函数计算以后产生 k个bit, 在bitmap中置这k个bit 为1, 盗图展示如下:

读key的时候, 所有k bit =1 的情况下, key存在。有任何一个bit=0的情况下, key不存在。 这个bitmap 也是一个持久化存储的file, 体量小,耗io少,而且查找快, 能大大提供读性能。

问题

然而这个设计对删除数据就不怎么友好了,继续盗图看下:

因为每个bit是跟其他key有关联的, 将其中一个bit置为0 的话,也会影响其他的呢。那如何解决呢? 我找到的资料中提供了万能的引用计数法:

看下是不是很耗空间,本来一个bit就够了,现在就是4个字节都要担心有没有溢出的问题。 所以wiredtiger 是这么用的, delete 操作会产生一个empty value, 而不是在每条记录追加一个delete 标志, 但这样的话查找一个已经的delete的数据就会和正常的数据消耗的一致。在没看过代码的情况下,目前官网放出来的资料就是这么做的。

合并

跟其他LSM trees设计一样,wiredtiger也会合并文件,主要为了缩小空间使用和加快read 操作。 合并文件也会对bloom filter 进行一个OR的操作。这两个操作可以并行进行。另外合并后对旧文件的删除也是使用引用计数的方式,只有计数为0才会删除,所以也不会锁操作的行为。

时间: 2024-09-14 06:13:28

wiredtiger LSM trees bloom filter 设计原理的相关文章

爬虫技术之bloom filter(含java代码)

在爬虫系统中,在内存中维护着两个关于URL的队列,ToDo队列和Visited队列,ToDo队列存放的是 爬虫从已经爬取的网页中解析出来的即将爬取的URL,但是网页是互联的,很可能解析出来的URL是已经 爬取到的,因此需要VIsited队列来存放已经爬取过的URL.当爬虫从ToDo队列中取出一个URL的时候, 先和Visited队列中的URL进行对比,确认此URL没有被爬取后就可以下载分析来.否则舍弃此URL,从 Todo队列取出下一个URL继续工作. 然后,我们知道爬虫在爬取网页时,网页的量是

PHP中实现Bloom Filter算法

 这篇文章主要介绍了PHP中实现Bloom Filter算法,本文直接给出实现代码,代码中给出详细注释,Bloom Filter算法介绍等内容,需要的朋友可以参考下     ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

Bloom Filter Python

http://bitworking.org/news/380/bloom-filter-resources The Bloom filter, conceived by Burton H. Bloom in 1970, is a space-efficient probabilistic data structure that is used to test whether an element is a member of a set. False positives are possible

布隆过滤器(Bloom Filter)的Java实现方法_java

布隆过滤器原理很简单:就是把一个字符串哈希成一个整数key,然后选取一个很长的比特序列,开始都是0,在key把此位置的0变为1:下次进来一个字符串,哈希之后的值key,如果在此比特位上的值也是1,那么就说明这个字符串存在了. 如果按照上面的做法,那就和哈希算法没有什么区别了,哈希算法还有重复的呢. 布隆过滤器是将一个字符串哈希成多个key,我还是按照书上的说吧. 先建立一个16亿二进制常量,然后将这16亿个二进制位全部置0.对于每个字符串,用8个不同的随机产生器(F1,F2,.....,F8)产

PHP中实现Bloom Filter算法_php技巧

<?php /*Bloom Filter算法来去重过滤. 介绍下Bloom Filter的基本处理思路:申请一批空间用于保存0 1信息,再根据一批哈希函数确定元素对应的位置,如果每个哈希函数对应位置的值为全部1,说明此元素存在.相反,如果为0,则要把对应位置的值设置为1.由于不同的元素可能会有相同的哈希值,即同一个位置有可能保存了多个元素的信息,从而导致存在一定的误判率. 如果申请空间太小,随着元素的增多,1会越来越多,各个元素冲突的机会越来越来大,导致误判率会越来越大.另外哈希函数的选择及个数

HTML5设计原理

Jeremy Keith在 Fronteers 2010 上的主题演讲 下载PPT(PDF) 观看视频 今天我想跟大家谈一谈HTML5的设计.主要分两个方面:一方面,当然了,就是HTML5.我可以站在这儿只讲HTML5,但我并不打算这样做,因为如果你想了解HTML5的话,你可以Google,可以看书,甚至可以看规范. 实际上,确实有人会谈到规范的内容.史蒂夫·福克纳(Steve Faulkner)会讲HTML5与可访问性.而保罗·艾里什(Paul Irish)则会讲HTML5提供的各种API.因

HTML 5设计原理

Jeremy Keith在 Fronteers 2010 上的主题演讲 下载PPT(PDF) http://adactio.com/extras/slides/designofhtml5.pdf 观看视频 http://fronteers.nl/congres/2010/sessions/the-design-of-html5-jeremy-keith 51CTO推荐专题:HTML 5 下一代Web开发标准详解 今天我想跟大家谈一谈HTML 5的设计.主要分两个方面:一方面,当然了,就是HTML

详解JavaScript中的客户端消息框架设计原理

  这篇文章主要介绍了详解JavaScript中的客户端消息框架设计原理,包括客户端和服务器端的通信等方面的内容,需要的朋友可以参考下 哇--是个危险的题目,对吗?我们对于什么是本质的理解当然会随着我们对要解决问题的理解而变化.因此我不会说谎--一年前我所理解的本质很不幸并不完整,因为我确信我将要写的已经快伴随我有6个月之久.所以,这篇文章是我在发现JavaScript中成功的运用客户端消息模式的一些关键要点时的一个掠影. 1.) 理解中介者与观察者的区别 大多数人在描述任何事件/消息机制的时候

html5入门之设计原理

  HTML5和CSS3的时代到来了,新版2011版淘宝网首页已全部使用HTML5,拥抱变化才是王道.为之漫笔翻译的很好,看了一遍后,感觉理解了很多,强烈推荐其他做开发的童鞋尤其前端也来看看. 不仅让我摸清了html4,xhtml1.0, xhtml2.0, html5之间的关系,也理解了为什么会出现HTML5,同时,加紧推进在项目中应用HTML5. -------------------------------------------------------------------------