对于完全不变的数据,cassandra需要自动压缩吗?

sycxhyv7  于 2021-06-10  发布在  Cassandra
关注(0)|答案(3)|浏览(414)

我试图优化生产中的cassandra表的性能,它是带有时间戳的经典事件数据。通过不同的设置,我花了一些时间研究了压缩策略,以及cassandra的压缩策略。
起初,我认为TimeWindowCompression非常适合我们的用例,但后来我意识到我们从不删除或更新数据。
完全禁用压缩是否可能更好?在没有压缩策略的情况下,sstables是如何形成的?

tcbh2hod

tcbh2hod1#

当内存存储(memtables)已满或已刷新时,sstables将写入磁盘。如果对表禁用压缩,那么最终将得到许多非常小的表。无论是要更新还是删除数据,都需要在写入数据时压缩数据。
您使用哪种压缩策略将取决于您的访问需求。这是一个很好的选择压缩策略的基本指南,这是一个更详细的指南压缩在Cassandra。

bjg7j2ky

bjg7j2ky2#

如前所述,当发生写操作时,内存会在特定条件下刷新到磁盘。每次发生这种情况,您都会得到一个sstable。随着时间的推移,随着更改的继续,将有多个sstables组成该节点上的表。假设一个表有多个sstables,那么可以有一个“行”位于多个sstable中,当对该行进行读取时,cassandra必须读取该行的所有sstables,合并结果,然后做出响应。这会减慢读取速度。记住,cassandra是高度优化的写,读付出代价。如您所述,压缩也用于逻辑删除/删除清理。
你可以决定如何压缩发生。默认值是大小分层压缩策略(stcs)。该策略的算法是,当x个sstables的大小相似时,它们会被压缩到一个新的sstable中(旧的sstables会被丢弃)。如果新sstable的结果更大(例如,将4个sstable压缩为1,并且所有行都是唯一的),则可能需要很长一段时间才能再次参与压缩(因为需要x个大小相同的sstable才能符合条件)。这有道理吗?
你的意思是“为什么不一张table呢”。对于读取,一个“打包”的单一sstable是最佳选择。但是,随着时间的推移,随着更改的发生,您将拥有新的sstable(sstables将始终为新更改生成-您无法停止),并且您的一个大sstable(如前所述)可能无法得到清理,从而导致性能再次下降。那是STC。
还有其他策略-每种策略都针对特定条件进行了优化。这样做的目的是尽可能地保持事物的整洁,而不必不断地压缩数据,这样就可以选择不同的方法/策略。每个人都有自己的优点和缺点。
要记住的另一点是,读取发生在分区级别。如果您有一个表,其中分区键是主键,并且插入的每一行都没有删除、ttl或任何其他性质的内容,那么您是对的,这种类型的表根本不需要压缩。你可以有100万张表,这无关紧要。但是,如果您有一个主键,其中分区键是它的一部分,而不是全部,那么读取性能可能会受到影响(读取发生在分区级别,并且每个分区都有多个行和sstable)。在这种情况下,您可能不需要压缩来进行清理(同样假设只有insert,没有ttl/deletes等),但是单个分区的sstables越多,读取速度就越慢(取决于每个分区驻留多少sstables,以及使用一些内置优化来过滤分区的sstables)。
希望这有帮助。

zlwx9yxi

zlwx9yxi3#

禁用压缩确实不是一个好的选择,但您可以根据应用程序的行为更改压缩策略。在您的情况下,您可以使用大小分层压缩策略或分层压缩策略。
但是,timewindowcompactionstrategy是时间序列数据的一个很好的选择。您可以参考下面的细节来理解用例。
timewindowcompactionstrategy(twcs)是专门为磁盘上的数据按数据的时间戳分组是有益的工作负载而设计的,当工作负载本质上是时间序列或所有数据都是用ttl写入时,这是一个共同的目标。在expiring/ttl工作负载中,整个sstable的内容可能在大约相同的时间过期,从而允许完全删除它们。
http://cassandra.apache.org/doc/latest/operating/compaction.html

相关问题