Cassandra - 如何禁用memtable flush

时间:2017-05-25 00:38:46

标签: cassandra nodetool

我使用非常小的数据集运行Cassandra,以便数据只能存在于memtable中。以下是我的配置:

在jvm.options中:

-Xms4G
-Xmx4G

在cassandra.yaml,

memtable_cleanup_threshold: 0.50
memtable_allocation_type: heap_buffers

根据cassandra.yaml中的文档, memtable_heap_space_in_mb memtable_heap_space_in_mb 将设置为堆大小的1/4,即1000MB

根据此处的文档(http://docs.datastax.com/en/cassandra/3.0/cassandra/configuration/configCassandra_yaml.html#configCassandra_yaml__memtable_cleanup_threshold),如果memtabl(s)的总大小超过(1000 + 1000)* 0.50 = 1000MB,则会触发memtable flush。

现在,如果我执行几次写入请求导致大约300MB的数据,那么memtable仍会被刷新,因为我看到sstables是在文件系统上创建的(Data.db等),我不明白为什么。

有人能解释这种行为并指出我是否在这里遗漏了什么?

2 个答案:

答案 0 :(得分:1)

memtable flushing的另一个触发器是使用的commitlog空间(默认为32mb)。

http://docs.datastax.com/en/cassandra/3.0/cassandra/operations/opsMemtableThruput.html

http://docs.datastax.com/en/cassandra/3.0/cassandra/configuration/configCassandra_yaml.html#configCassandra_yaml__commitlog_total_space_in_mb

由于Cassandra应该是持久的,它应该写入磁盘以在节点失败后提供数据。如果您不需要这种持久性,您可以使用任何其他基于内存的数据库 - redis,memcache等。

答案 1 :(得分:0)

以下是我从Cassandra用户组获得的回复,将其复制到此处以防其他人正在寻找类似的信息。

在考虑了您的场景后,我相信您的小SSTable大小可能是由于数据压缩造成的。默认情况下,所有表都启用SSTable压缩。

让我们看看你的情景。我们假设您已经为您的Cassandra节点分配了4GB。你的memtable_heap_space_in_mb和 memtable_offheap_space_in_mb大概会达到1GB左右。由于memtable_cleanup_threshold为.50表,当总分配的可记忆空间超过1 / 2GB时,将触发清理。请注意,清理阈值为.50的1GB,而不是堆和堆堆空间的组合。此可记忆分配大小是节点上所有表的可用总量。这包括所有与系统相关的密钥空间。清理过程会将最大的memtable写入磁盘。

对于您的情况,我假设您在一个节点上,只有一个表具有插入活动。我不认为提交日志会在这种情况下触发刷新,因为默认情况下提交日志有8192 MB的空间,除非提交日志放在一个非常小的磁盘上。

我假设由于压缩,磁盘上的表小于500MB。您可以在桌面上禁用压缩,看看这是否有助于获得所需的大小。

我写了一篇博文,解释了memtable flushing(http://abiasforaction.net/apache-cassandra-memtable-flush/

如果您有任何其他问题,请与我们联系。

我希望这会有所帮助。