gpt4 book ai didi

cassandra - 可内存的理解

转载 作者:行者123 更新时间:2023-12-04 22:30:27 25 4
gpt4 key购买 nike

我有一些关于 cassandra memtable 的问题。我将不胜感激。

关于 memtable 的事实:

1) 放置在内存中;

2) per-ColumnFamily 结构;

3) 一个列族可能存在多个memtables;

问题:

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

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

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

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

非常感谢!

最佳答案

  • 对于给定的列族,内存中通常只有一个 Memtable,除非在修复过程或挂起的刷新等特殊情况下。
  • 当 Commit Log 已满时,会触发flush:将 Memtable 作为 SSTable 写入磁盘,然后清除 Memtable 并回收 Commit Log。一个新的循环以一个空的提交日志/内存表开始
  • 当 Memtable 超过给定的大小时,会像上面一样触发刷新。
  • 通常 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

    关于cassandra - 可内存的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28982925/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com