Cassandra - 如何禁用 memtable 刷新

Cassandra - how to disable memtable flush

我是 运行 Cassandra,数据集非常小,因此数据只能存在于 memtable 上。以下是我的配置:

在jvm.options中:

-Xms4G
-Xmx4G

在cassandra.yaml、

memtable_cleanup_threshold: 0.50
memtable_allocation_type: heap_buffers

根据 cassandra.yaml 中的文档,memtable_heap_space_in_mbmemtable_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 刷新。

现在,如果我执行多个写入请求,导致将近 ~300MB 的数据,memtable 仍然会被刷新,因为我看到在文件系统上创建了 sstables(Data.db 等),我不明白为什么。

谁能解释一下这种行为并指出我是否遗漏了什么?

内存表刷新的另一个触发器是提交日志 space 使用(默认 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 等。

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

考虑到您的情况后,我相信您的 SSTable 较小可能是由于数据压缩造成的。默认情况下,所有 table 都启用 SSTable 压缩。

让我们来看看你的场景。假设您已为 Cassandra 节点分配了 4GB。你的 memtable_heap_space_in_mb 和 memtable_offheap_space_in_mb 大概会达到 1GB 左右。因为你有 memtable_cleanup_threshold 到 .50 table 当分配的总内存 table space 超过 1/2GB 时将触发清理。请注意,清理阈值是 1GB 的 0.50,而不是堆和堆外的组合 space。此 memtable 分配大小是节点上所有 table 可用的总量。这包括所有与系统相关的键space。清理过程会将最大的 memtable 写入磁盘。

对于你的情况,我假设你在一个只有一个 table 和插入 activity 的节点上。我认为在这种情况下提交日志不会触发刷新,因为默认情况下提交日志有 8192 MB space 除非提交日志放在非常小的磁盘上。

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

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

如果您有任何其他问题,请告诉我。

希望对您有所帮助。