难忘的理解

时间:2015-03-11 09:37:04

标签: cassandra nosql

我对cassandra memtable有一些疑问。我很感激你的帮助。

关于memtable的事实:

1)放入RAM;

2)per-ColumnFamily结构;

3)单个列族可能存在多个memtable;

问题:

1)何时创建列族的附加记忆?需要什么条件?我假设在创建其他提交日志文件后会创建其他memtables。这是真的吗?

2)达到提交日志大小阈值后会发生什么?我假设将开始将memtables放入队列;队列填充后将开始将memtable刷新到sstable,然后删除旧的提交日志(在hdd上)和相应的memtable s (在ram中)。在这种情况下,memtable内存的某些部分将一直为空,并且提交日志总是会被填充到90-100%?

3)达到记忆大小阈值时会发生什么?像以前的情况一样会开始冲到sstable吗?提交日志的某些部分也将一直为空,可记忆的内存将被填充到90-100%?

4)关于memtable_allocation_type: 在官方资源中 - “offheap_buffers将单元名称和值移动到DirectBuffer对象。这对读取的影响最小 - 值仍然是”实时“Java缓冲区 - 但只有在存储大字符串或blob时才会显着减少堆。“。 DirectBuffer是什么意思?它放在java堆中?你能给出有关它的信息的网站链接吗?

非常感谢你!

1 个答案:

答案 0 :(得分:8)

  1. 对于给定的列族,内存中通常只有一个Memtable,除非在特殊情况下,例如修复过程或待处理的刷新。
  2. 当提交日志已满时,将触发刷新:将Memtable作为SSTable写入磁盘,然后清除Memtable并回收提交日志。新周期以空提交日志/可记忆
  3. 开始
  4. 如果Memtable超过给定的大小,则会触发上述刷新。
  5. 通常,Memtable默认保存在Java堆内存中。从Cassandra 2.1, Memtable can be stored outside the Java Heap起缓解GC压力。但是,此设置是针对某些特殊情况的优化。 Cassandra可以使用JNA将数据存储在Java堆外部,这意味着此数据不符合垃圾回收的条件,因为它不为JVM所知。但是,必须转换Java对象以在其中存储/检索它们。这就是为什么这些Java对象不被视为“活着”的原因。
  6. 我建议你观看https://academy.datastax.com/courses/learning-cassandra-write-path