Cassandra杂记3-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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值