【问题标题】:Memtable understanding可记忆的理解
【发布时间】:2015-05-13 00:35:25
【问题描述】:

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

关于内存表的事实:

1) 放置在 RAM 中;

2) per-ColumnFamily 结构;

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

问题:

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

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

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

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

非常感谢!

【问题讨论】:

    标签: cassandra nosql


    【解决方案1】:
    1. 对于给定的列族,内存中通常只有一个 Memtable,除非在修复过程或挂起的刷新等特殊情况下。
    2. 当Commit Log满时触发flush:Memtable作为SSTable写入磁盘,然后Memtable被清空,Commit Log被回收。一个新的周期从一个空的 Commit Log/Memtable 开始
    3. 当 Memtable 超过给定大小时,会像上面一样触发刷新。
    4. 通常 Memtable 默认保存在 Java 堆内存中。截至Cassandra 2.1, Memtable can be stored outside the Java Heap 以减轻GC 压力。但是,此设置是针对某些特殊情况的优化。 Cassandra 可以使用 JNA 将数据存储在 Java 堆之外,这意味着这些数据不适合垃圾收集,因为它不为 JVM 所知。但是,必须转换 Java 对象以在其中存储/检索。这就是为什么这些 Java 对象不被视为“活动”的原因。

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

    【讨论】:

    • 谢谢!但在一些文章和书籍中存在不同的信息。哪里是真的? 1) 这是 Eben Hewitt 的《Cassandra: The Definitive Guide》一书中的引述:“这种刷新是一种非阻塞操作;单个列族可能存在多个内存表,一个当前的,其余的等待刷新”。
    • 2) 好的。为什么我需要 memtable_flush_queue_size 参数?默认情况下它等于 4。4 表示列族的计数。来自官方文档的引用:“memtable_flush_queue_size (Default: 4) The number of full memtables to allow pending flush (memtables waiting for a write thread)”。 “全内存”是什么意思?如果我的键空间中有 3 个列族 - 我在 ram 中的内存表不会超过 3 个? 3)如上。 4) 我不知道什么是 DirectBuffer。它位于原生 Cassandra 内存之外?假设没有。那为什么我们可以看到描述“这些值仍然是“活的”Java 缓冲区”?
    • 这个队列大小在这里是因为 Cassandra 作为具有工作队列的 SEDA 架构,所有任务都通过这些队列执行。这允许控制同时完成多少工作。通常 3 个列族意味着 3 个内存表。如果刷新需要时间(加载的节点),可能会有一些待处理的内存表,但这不是名义上的情况。 DirectBuffer 是使用 JNA(可能使用 malloc)直接分配的内存区域,它不能不包含“实时”Java 对象,它们必须被序列化。然而,这个内存不是由 JVM 管理的,因此被 GC 忽略了。
    • 当心《Cassandra:权威指南》这本书有点老了,有些信息对于最近的 Cassandra 版本不是最新的。
    • 我想澄清一下:刷新后将删除所有提交日志文件和所有内存表并创建新的?
    猜你喜欢
    • 2016-10-14
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多