cassandra观止
作者: on 星期六, 四月 3, 2010 · 【阅读:2,381 次】
是由facebook开发的一套NoSQL存储引擎,也是目前最火的NoSQL应用之一,目前twitter和digg中都有使用。当然,用得最多的还是facebook自己。
cassandra的特性不同的人理解不一样,归纳起来有如下几点:
分布式,集群下容错性高,无限水平扩展性
schema的灵活控制,随意增删字段
支持范围查询
基于gossip的p2p节点通信
充分利用硬盘高效的顺序读写
然而本文想要描述的是cassandra系统中包含的一些令人眼前一亮的技术实现上的思想。
1.硬盘是新的磁带
“内存是新的硬盘,硬盘是新的磁带”这是Jim Gray的一句名言。我们目前对硬盘(非SSD)的利用,多是随机读取,这时的硬盘读取速度是相当慢的,但是如果把硬盘当成磁带进行顺序读取的话,速度是相当惊人的。
而cassandra的设计恰恰是冲着这一点来的,他在内在中保存一定量的数据后再统一写入磁盘,这本身就是一次顺序写入,在写入后不再进行更改,这样在进行数据读取时,就可以只进行一次次的顺序读取即可。大大提高了磁盘的效率。
如果cassandra不更改数据,那数据的update操作又是如何实现的呢,cassandra采用的是追加方式,再写一条信息,取的时候取出对这个数据的所有操作再根据时间顺序进行案件重演就可以算出最新的数据是什么了。
2.bloom-filter算法的应用
算 法简单来说就是判断一个值是否存在于一个集合中的算法,用得最多的是在搜索引擎的URL抓取中,如果这个URL在一段时间抓取过的URL列表中,那就不再 进行抓取。这个算法的时间和空间复杂度都很小,基本每一个数据的判断只需要做几次hash就可以了,但是问题是有一定的误差,只要应用可接受这个误差,那 使用bloom-filter算法是最好的。
bloom-filter在cassandra用来判断一个数据块中是否有一个值的更新,上面说到,我们在读取数据时,是将其更新记录全部读取再通 过时间顺序排序得到最新值。而cassandra每次内存存储上限(这个可以自由设置,但为了保证效率,通常低于物理内存)到时都会将内在中的数据写入硬 盘,生成一个新的文件。于是在数据量很大时,会有很多个块生成,我们如果所有块都去查找是否有某一个值的更新记录,是会浪费时间降低效率的,于是 cassandra用bloom-filter算法来决定是否对这个块进行查找,cassandra中的index.db文件就是存储bloom- filter算法的hash表的。
我们上面也说过,bloom-filter算法会有一定误差,但是这个误差是可能会将不在一个集合中的值误判为在这个集合中,而不会将在这个集合中 的值误判为不在这个集合中,有点杀三千不放一个的意思。这个误差在这里是可以忍受的,因为我们可以多查一个不存在这个值的数据块,但是决不会漏掉任何一 个。
3.基于gossip的多点同步
是 一个p2p协议的实现,他的原理是向周围的节点传递信息,直到所有节点都有同样的信息,这种传播是病毒式的。通过这种方式,可以达到多点同步,并且可以不 用关心具体节点量实现无限水平扩展的功能。而且多点分布式系统有很好的容错机制,集群中的一台或N台机器出问题,不会对整体数据服务的正确性造成影响。而 cassandra的错误侦测系统也能很快的发现坏死的结点以便及时处理。
and more….
本文只讲述了令作者受到启发的技术点,抛砖引玉,欢迎提出更多不同的见解。
附cassandra开发者pdf讲搞: