memtable的理解

Memtable understanding

我对 cassandra memtable 有一些疑问。我将不胜感激。

关于 memtable 的事实:

1) 放入内存;

2) per-ColumnFamily 结构;

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

问题:

1) 何时为列族创建额外的内存表?需要什么条件?我假设在创建额外的提交日志文件后创建了额外的内存表。这是真的吗?

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

3) 当达到 memtable 大小阈值时会发生什么?像以前的情况一样会开始刷新到 sstable? commit log 的某些部分也将始终为空,memtable 内存将被填充到 90-100%?

4) 关于 memtable_allocation_type: 在官方资源中 - "offheap_buffers moves the cell name and value to DirectBuffer objects. This has the lowest impact on reads — the values are still “live” Java buffers — but only reduces heap significantly when you are storing large strings or blobs."。 DirectBuffer 是什么意思?它放在java 堆中?您能否提供指向包含相关信息的网站的链接?

非常感谢!

  1. 对于给定的列族,内存中通常只有一个 Memtable,除非在修复过程或挂起的刷新等特殊情况下。
  2. 当Commit Log写满后,触发flush:将Memtable作为SSTable写入磁盘,然后清空Memtable,回收Commit Log。一个新的周期从一个空的 Commit 开始 Log/Memtable
  3. 当 Memtable 超过给定大小时,如上触发刷新。
  4. 通常Memtable默认保存在Java堆内存中。 As of Cassandra 2.1, Memtable can be stored outside the Java Heap 缓解GC压力。但是,此设置是针对某些特殊情况的优化。 Cassandra 可以使用 JNA 将数据存储在 Java 堆之外,这意味着该数据不符合垃圾回收条件,因为它不为 JVM 所知。然而 Java 对象必须转换为 stored/retrieved in/from 它。这就是为什么这些 Java 对象不被视为 "alive".
  5. 的原因

我建议你看https://academy.datastax.com/courses/learning-cassandra-write-path