在cassandra yaml文件中有一个mem表堆大小配置.lets说它是2gb ...现在如果清理阈值是33%..那么在占用675 mb的mem表空间之后... ... usssandra将刷新最大的mem表到磁盘。我的问题是cassandra对剩余的mem表空间的影响是1373 mb(2048-675)。
根据我的理解,在任何时间点,可记忆空间中的数据不会超过675 Mb,瞬间mem表数据增长超过675 mb,最大memtable刷新到磁盘,mem表空间中的数据大小再次变小超过675 mb ......这个过程继续...那么为什么我们需要分配2GB的mem表空间...它背后的原因是什么... mem表空间包含除mem表之外的任何东西..
答案 0 :(得分:1)
刷新不是即时的,它不会阻止其他写入进入。它实际上创建了一个新的"活跃的"可记忆写入并将前一个写入队列以刷新到磁盘(它仍可用于读取直到刷新)。因此堆上使用的空间绝对可以超过threshold * space
。
这种行为在较旧版本的Cassandra上有所不同,它会在刷新完成之前实际阻止写入(tpstats在FlushWriter下显示为阻塞,这已不再可能)。
由于memtables的大小可以在刷新时继续增长,因此有一个截止限制(memtable_heap_space_in_mb
设置),它实际上会停止写入以防止它失控并导致OutOfMemory异常。这个设置更多的是它可以增长到超过立即分配并为memtables保留的一块内存。
另请注意,memtable_cleanup_threshold
已弃用:
默认计算是唯一合理的选择。