我使用非常小的数据集运行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等),我不明白为什么。
有人能解释这种行为并指出我是否在这里遗漏了什么?
答案 0 :(得分:1)
memtable flushing的另一个触发器是使用的commitlog空间(默认为32mb)。
http://docs.datastax.com/en/cassandra/3.0/cassandra/operations/opsMemtableThruput.html
由于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/)
如果您有任何其他问题,请与我们联系。
我希望这会有所帮助。