在 Cassandra 日志中执行 LOGGED BATCH 警告

Posted

技术标签:

【中文标题】在 Cassandra 日志中执行 LOGGED BATCH 警告【英文标题】:Executing a LOGGED BATCH warning in Cassandra logs 【发布时间】:2019-06-30 02:25:03 【问题描述】:

我们的 Java 应用程序对表的 1 个进行批量插入, 该表架构类似于..

CREATE TABLE "My_KeySpace"."my_table" (
    key text,
    column1 varint,
    column2 bigint,
    column3 text,
    column4 boolean,
    value blob,
    PRIMARY KEY (key, column1, column2, column3, column4)
) WITH CLUSTERING ORDER BY ( column1 DESC, column2 DESC, column3 ASC, column4 ASC )
AND COMPACT STORAGE
AND bloom_filter_fp_chance = 0.1
AND comment = ''
AND crc_check_chance = 1.0
AND dclocal_read_repair_chance = 0.0
AND default_time_to_live = 0
AND gc_grace_seconds = 0
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.1
AND speculative_retry = 'NONE'
AND caching = 
    'keys' : 'ALL',
    'rows_per_partition' : 'NONE'

AND compression = 
    'chunk_length_in_kb' : 64,
    'class' : 'LZ4Compressor',
    'enabled' : true

AND compaction = 
    'class' : 'LeveledCompactionStrategy',
    'sstable_size_in_mb' : 5
;

gc_grace_seconds = 0 在上述架构中。因此,我收到以下警告:

2019-02-05 01:59:53.087 WARN   [SharedPool-Worker-5 - org.apache.cassandra.cql3.statements.BatchStatement:97] Executing a LOGGED BATCH on table [My_KeySpace.my_table], configured with a gc_grace_seconds of 0. The gc_grace_seconds is used to TTL batchlog entries, so setting gc_grace_seconds too low on tables involved in an atomic batch might cause batchlog entries to expire before being replayed.

我看过 Cassandra 代码,这个警告出于显而易见的原因出现在:this line

在应用程序中无需更改批处理代码的任何解决方案? 我应该增加 gc_grace_seconds 吗?

【问题讨论】:

这只是简单的插入? 是的,简单的插入! 【参考方案1】:

在 Cassandra 中,批处理不是优化插入数据库的方法 - 它们通常主要用于 coordinating writing into multiple tables, etc. 如果您使用批处理插入多个分区,您甚至会得到 worse performance。

您可以通过使用异步命令执行(通过executeAsync)和/或使用批处理来获得更好的插入吞吐量,但仅限于针对同一分区的插入。

【讨论】:

我们的应用程序中没有针对多个分区的所有批次(未记录的批次)。只有记录的批次是针对单个分区的。此外,如果有的话,我们已经对未记录的批次使用了异步执行。 如果我没记错的话,针对同一分区的批处理会被转换为未记录的批处理。 我认为,根据this page 是不正确的,请检查也许我错了。 这里是单个分区与多个分区批次的示例:github.com/alexott/dse-java-playground/blob/master/src/main/… 虽然我需要检查一下 gc_grace_period

以上是关于在 Cassandra 日志中执行 LOGGED BATCH 警告的主要内容,如果未能解决你的问题,请参考以下文章

cassandra 日志中一直出现Connection reset by peer

如何将 cassandra 提交日志中的数据转换为可读格式

正在追踪cassandra是追踪卡桑德拉时间的正确选择

就磁盘空间使用而言,Cassandra 是不是足够适合存储日志?

用于将日志文件加载到 cassandra 的堆栈

如何在 Cassandra 4.0 Docker 容器上启用完整查询日志记录?