在《如何安装和配置Cassandra》中,我们可以在DataFileDirectories中配置数据的存放位置。
当Cassandra启动后,向其中插入的数据就会放在DataFileDirectories的目录下,如图:
这里有2个Column Family,分别是Standrad1,Super1。
大家可以想象,如果没有压缩功能的话,那么随着数据量的增加,DataFileDirectories目录中的文件会越来越多。
在Cassandra中的压缩功能避免了在DataFileDirectories目录中存在大量的数据文件。
当Cassandra启动以后,我们可以使用sh bin/nodetool –h hostname –p jmxport getcompactionthreshold 获得到当前Cassandra的压缩参数:最小压缩值,最大压缩值。
我们也可以使用sh bin/nodetool –h hostname –p jmxport setcompactionthreshold minthreshold maxthreshold的命令设置Cassandra的最小压缩值和最大压缩值。
为了测试,我们可以先将压缩功能关闭,执行如下命令即可:sh bin/nodetool –h hostname –p jmxport setcompactionthreshold 0 0
执行完这个命令,Cassandra的压缩功能就关闭了,当我们插入大量数据以后,你会发现在DataFileDirectories目录下出现了大量的数据文件。
在上一步中,我们关闭了压缩,这样做的好处是可以提高大数据量导入的速度(后面会介绍到这个问题)。但是缺点是导致DataFileDirectories目录下出现了大量的数据文件。
如果想将这些数据文件压缩。我们可以执行如下命令: sh bin/nodetool –h hostname –p jmxport compact
当执行完这个命令后,Cassandra会将不同的Column Family文件分别合并成一个文件。合并的顺序是按照数据文件产生的时间先后顺序进行合并的。
由于Cassandra的压缩参数是无法在配置文件中设定的,所以每次启动Cassandra,都会使用默认的参数:最小压缩值 4,最大压缩值 32。
压缩操作会在已下2个场景中使用:
当Cassandra启动的时候,会执行压缩操作:遍历每一个CF的文件数量,如果超过了最小值4,那么就会求一个平均值( (4 + 32)/2 ),然后按照数据文件产生的时间先后顺序排序,取这个平均值和实际文件数量的较小的数来做一个文件的合并操作。
当memtable中的数据达到阀值时(这个阀值的大小可以在配置文件中指定),将会产生一个新的SSTable文件。这个时候,系统就会进行上面“Cassandra启动”的逻辑进行判断,是否需要进行压缩操作,如果需要进行压缩操作,哪些文件就会被合并。
以上介绍的这些就是Cassandra中压缩操作的工作情况。更多的详细信息可以参考org.apache.cassandra.db.CompactionManager。
希望这篇文章能帮助你理解Cassandra中的压缩操作。