【问题标题】:Cassandra Mem table contentCassandra Mem 表内容
【发布时间】:2018-01-21 15:19:22
【问题描述】:

cassandra yaml 文件中有一个 mem 表堆大小配置..可以说它是 2gb...现在如果清理阈值为 33%..那么在 675 mb 的 mem 表空间被占用后..cassandra 将刷新磁盘上最大的内存表..我的问题是 cassandra 对剩余的内存表空间 1373 mb(2048-675) 做了什么。

根据我的理解,在任何时候memtable空间中的数据都不会超过675 Mb,当mem表数据增长超过675 mb时,最大的memtable被刷新到磁盘并且mem表空间中的数据大小再次变小超过 675 mb ......这个过程还在继续......那么为什么我们需要分配 2GB 的 mem 表空间......背后的原因是什么...... mem table dpace 是否包含除了 mem table 之外的任何东西.. .

【问题讨论】:

    标签: cassandra cassandra-3.0


    【解决方案1】:

    刷新不是即时的,它不会阻止其他写入进入。它本质上为写入创建一个新的“活动”内存表,并将前一个放在队列中以刷新到磁盘(它仍然可以用于读取直到刷新)。所以堆上使用的空间绝对可以超过你的threshold * space

    这种行为在旧版本的 Cassandra 上有所不同,它实际上会阻止写入直到刷新完成(tpstats 显示这在 FlushWriter 下被阻止,这不再可能)。

    由于内存表的大小可以在刷新时继续增长,因此存在一个截止限制(memtable_heap_space_in_mb 设置),它实际上会停止写入以防止它失控并导致 OutOfMemory 异常。与立即分配并为 memtables 保留的一块内存相比,此设置更多的是它可以增长到的限制。

    另请注意 memtable_cleanup_threshold 已弃用:

    默认计算是唯一合理的选择。

    【讨论】:

    • 在某些用例中,您可能希望更频繁地刷新,在面对磁盘延迟时放弃吞吐量以实现持久性(尤其是发生磁盘暂停的环境,例如 EBS 支持的 AWS 实例)
    • 克里斯..非常感谢澄清..现在合理的选择是什么...什么逻辑 cassandra 3x 用于刷新内存表
    • 我建议坚持使用默认值,除非有理由不这样做。即,就像使用 EBS 时提到的 jeff 一样。即使在那里,我也会从默认值开始,并在尝试调整之前先在您自己的负载下进行一些测试。在内存表之前应该查看调优方面的较低成果。确保您使用推荐的内核设置 (docs.datastax.com/en/landing_page/doc/landing_page/…) 并首先查看 JVM 堆设置。
    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 2018-10-20
    • 2018-07-22
    • 1970-01-01
    • 2022-10-26
    • 2013-09-26
    • 2018-12-25
    • 1970-01-01
    相关资源
    最近更新 更多