难忘的理解

bis*_*uit 4 cassandra nosql

我有一些关于cassandra 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堆中?你能给出有关它的信息的网站链接吗?

非常感谢你!

G Q*_*ana 11

  1. 对于给定的列族,内存中通常只有一个Memtable,除非在特殊情况下(例如修复过程或挂起的刷新).
  2. 提交日志已满时,将触发刷新:将Memtable作为SSTable写入磁盘,然后清除Memtable并回收提交日志.新的循环以空的Commit Log/Memtable开始
  3. 当Memtable超过给定大小时,如上所述触发刷新.
  4. 通常,Memtable默认保存在Java堆内存中.从Cassandra 2.1开始,Memtable可以存储在Java堆之外,以缓解GC压力.但是,此设置是针对某些特殊情况的优化.Cassandra可以使用JNA在Java堆外部存储数据,这意味着这些数据不符合垃圾收集的条件,因为它不为JVM所知.但是,必须转换Java对象以在其中存储/检索它们.这就是为什么这些Java对象不被视为"活着"的原因.

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