Cassandra三级存储构想

这篇博客需要对SSD有一定了解,我这里没有详细讨论SSD相关的问题,某些概念不了解自行google,或者留言讨论。

Cassandra最大的特点就是将随机写巧妙的转换为顺序写。memtable达到一定大小之后,flush到磁盘(可以是SSD,通常是HDD)。这个特性,对Cassandra在SSD上的应用,带来了天然的优势。现在Cassandra部署情况,较常用的方式是内存+HDD,或者有钱一些的公司内存+SSD。后者主要是想通过SSD随机读的优异表现提升读的性能(大概是HDD的100倍)。但是,我们知道,根据数据局部性原理,数据的热点是永远存在的。所以,全部数据放在SSD上是比较浪费的。除了数据局部性原理意外,还有两点SSD自身的原因:

  1. SSD生命周期比较短,MLC 20000次擦除,SLC100000次擦除。
  2. SSD比HDD还是要昂贵很多,尽管SSD越来越便宜。
记得有人比喻说HDD是新的磁带,但是不要忘了,HDD是有随机读能力的,尽管随机读的性能比较差。综上, 内存+SSD+HDD的三级存储架构就呼之欲出,这个架构主要特点如下:
  1. 充分利用SSD和内存做为缓存,提高读性能,采用好的缓存调度策略,几乎可以与全部使用SSD相比。一般不降低20%
  2. 充分利用HDD的容量,SSD和内存作为缓存,使得单机存储容量大幅度增加
  3. Cassandra的写方式天然适合SSD,会在很大程度上,降低SSD的写放大率,保证SSD生命周期
其实总结起来,主要有两个特点,一个是读性能显著提升,一个是存储容量显著增加。这两个特点不够吸引人么?
 但是想在工业界应用,除了上面的两个优势以外,这个架构还需要实现方便,易于维护,可控。下面,我们就讨论讨论如何在Cassandra的情景之下,实现这个三级的架构。
Cassandra1.1之后,新增加了一个特性,就是可以配置某一个column family可以存储在SSD上。这个column family可以理解为比较重要的一些数据,读写要求比较高的数据。还有其实我们就可以理解为一个缓存column family,再配合column的超时设置,简直就是一个基于SSD的memcached。这是Cassandra一个比较偷懒的三级实现。把所有的调度都留给了开发人员完成,调度策略实现的好坏,也就直接影响了架构整体的性能。实现得好,整体性能就好。实现得不好,整体性能提升的不明显,也就不尽人意了。而且超时设置的方式过于单一,并没有使用频次的信息,所以仅仅是时间是不够灵活的。
其实在最早做Cassandra优化的时候,Cassandra的版本还没有达到1.0,我们就尝试改进Cassandra为三级存储的架构。而且我们做得更加彻底,完整的从HDD到内存,到SSD的调度策略,使得整个架构的性能非常突出。我们构想的架构图如下:
上图中,有几点需要注意:
  1. 批量写可以直接写到SSD,也可以直接写到磁盘。写到SSD可以提升几千的QPS,但是也缩短了SSD的寿命。我出于这个原因的考虑,先写HDD
  2. 缓存在内存中达到一定阈值以后批量写入到SSD。为了方便实现,直接就是CACHE column family就可以,直接写入sstable即可,如果要再高效一些,可以考虑自己构建数据结构,文件结构,不过这样就复杂一些。不如利用Cassandra本身的写方式,而且这样对SSD友好。
  3. 判断SSD上缓存是否过期,可以采用两种方式1)设置过期时间;2)根据频次,最近使用时间等因素,统一管理。如果这些信息再SSD上,不方便管理,可以在内存中根据这些判断,然后再SSD上只依据过期时间即可。
上面的架构比较简单使用,在实际中,效果也比较明显。但是如果,应用场景都是扫描的操作,这个架构也就没有意义了。
上面的架构仅仅是对数据进行了分级,对缓存数据等有了适当的调度。但其实是远远不够的,我们还可以再进一步提升整体的读性能。具体的见后续的博客。另外SSD的相关测试,见前面的一些博客,比较具体。看过会有一些数字的概念。
【完】

posted on 2012-07-02 17:32  sing1ee  阅读(670)  评论(0编辑  收藏  举报