了解Apache Cassandra Memtable Flush

时间:2017-08-13 14:36:30

标签: cassandra

为每个表或列系列创建一个memtable。表可以有多个memtable,但只有一个表是活动的。其余的将等待被冲洗。有一些属性会影响memtables大小和刷新频率。其中包括:

memtable_flush_writers - 这是为刷新memtables到磁盘分配的线程数。默认为两个。

memtable_heap_space_in_mb - 这是Apache Cassandra节点上所有memtables的总分配空间。默认情况下,这是堆大小的四分之一。指定此属性会导致绝对堆大小(MB),而不是总JVM堆的百分比。

memtable_cleanup_threshold - 将触发memtable清理的总可用memtable空间的百分比。 memtable_cleanup_threshold默认为1 /(memtable_flush_writers + 1)。默认情况下,这基本上是memtable_heap_space_in_mb的33%。

计划的清理会导致刷新占用可记录空间最大部分的表/列系列。这种情况一直持续到可用的可记忆内存低于清理阈值为止。

假设我们有一个已分配4G空间的Apache Cassandra实例。其中只有3,925.5MB可供Java运行时使用。请查看以下StackOverflow问题(Why do -Xmx and Runtime.maxMemory not agree),了解其背后的原因。其中,默认情况下,我们为memtable分配了981 MB,即3,925.5的1/4。我们的memtable_cleanup_threshold是默认值,即总memtable堆和off堆内存的33%。在我们的示例中达到327 MB。因此,当为所有memtables分配的总空间大于327 MB时,将触发可记忆的清理。清理过程会查找最大的memtable并将其刷新到磁盘。

如果我为mem表分配981MB并且cassandra在327 Mb之后启动刷新,这意味着在任何时候cassandra将有最多327 mb的活动memtables ...那么(981-327)mb = 654mb mem空间。它用于什么。我能感觉到排队等待刷新的记事本占据了这个654mb的一部分,但其余的空间怎么样呢,不是浪费了吗?

0 个答案:

没有答案