cassandra中的压缩策略
cassandra把所有操作都看成是添加的操作。不论是delete, update,add实际上都是添加一个新版本记录。因此,时间一长,就会有多个不同版本的row出现在不同的sstable中。那么在读的时候,就要读所有包含row的sstabel,然后进行汇总。comapction操作就是在后台将这些sstable进行合并,从而消除重复的row,这样读操作时,读的ssatbel就减少了,从而提高读效率。
cassandra之前的压缩策略时Tired Compaction,在1.0之后,就提供了leveled Compaction,这篇文章将对这两个压缩策略进行介绍。
一 Tiered Compaction
之前cassandra的压缩策略和 Google’s Bigtable paper这篇文章中的压缩策略一样,也就是Tiered Compaction.
当有足够多的大小相当的SStables出现时, cassandra就将这些SSTable合并,使得这些SStable中重叠的部分可以合并在一起,从而减少存储空间。比如说设当有4个大小相当的SStables出现时,就合并它们,其过程就入下图
图一中,随着数据越来越多,SStable不断产生。在1,2,3阶段,新的SSTable产生时,没有任何操作。在阶段4 , 有4个大小相近的SStable产生,就把它压缩成一个新的SStable,从而替代旧的4个SStable。这个长的压缩后的sstable就是第二层。以此类推,在5,8阶段如下图.
经过不断合并,当有4个长的SStables生成时,同样地将他们合并,生成第三层。第三层的SStable再合并成第四层,以此类推。最后SStable的情况如下图:
这样进行的压缩的缺点有3个:
1 操作性能不稳定。一条记录可以存在多个SStable中,最坏的情况是所有的SStable都有关于这个记录的column,这个时候操作就巨慢。
2 浪费存储空间。由于SStable是经过一段时间进行合并的,一个被删除的记录,它的老版本可能一直存储在旧的SSTable中,直到出新的合并,才将这些记录删掉。对于一些经常进行删除操作的系统,其浪费的空间是很大的。
3压缩时占用大量的空间。随着时间的推移,系统中会出现一些很大的SStable,最坏的情况是在图三新加一个SSTable,这个时候就会连续合并,最后形成4个大的SSTable需要合并。这个时候合并时需要的空间就是所有SSTable空间总和。
二Leveled Compaction
在cassandra1.0中用了leveled Compaction,实际上时借鉴了google的leveledDB中压缩机制。在leveled Compaction中,默认生成SSTable的大小是5MB,SSTable分布在不同的层次中,下一层是上一层的10倍。也就是第一层时5MB,第二层时50MB...同时每一层都不会有重复的数据。
在上图中,新的SSTable被加入到L0层(淡绿色), 然后它立刻和L1层(蓝色)的数据进行合并。当L1上的数据超过50MB时,L1层上多余的sstables就会被放在L2层中。随后,当L1生成新的SStable时,就会和L2中的SSTables合并,最后系统中的sstables就表现如下:
这样做就解决了上面tired compaction的问题:
1 可以保证90%的读都可以在一个sstable中完成。最坏的情况是一个记录存在在每一层,但是这个时候10TB的数据也就7层,查7个SStable就可以了。
2 最多只有10%的空间会被浪费。因为最坏的情况是该层的记录和完全存在在下一层中,而且每一层都是这种情况。也就是会所每一层都有10%(下一层数据是上一层的10倍)的数据时冗余的。
3 在压缩合并操作的开销上,每次只会使用10倍于要压缩的sstable大小的空间。
适用性
对于一个更新操作和删除操作比较多的系统,使用分层压缩是比较合适的。因为这种系统会产生同一份数据的多个版本。但是由于这种压缩会在压缩中进行更多的IO操作,所以如果是一个主要是insert操作的系统,建议不要使用分层压缩方法。
缺点
在实际使用中,我发现用leveled compaction在进行写操作时,往往会不断生成小文件。原因应该是leveled compaction,每次写数据到L0层,都要触发compaction,因此写入就会异常缓慢。对于这点的解决方法,目前我的思路是:
1 设定multithreaded_compaction,多线程comapction以提高效率。
2 增大mentable的大小,也就是增加默认的生成sstable的大小(增大L0层的大小)。这样可以降低comapction的频率。
3 另外开辟一个空间,保存写入的数据,再后台对这些数据进行compaction.
转载请注明!
posted on 2011-11-29 10:49 lindan_xmu 阅读(2597) 评论(0) 编辑 收藏 举报