【问题标题】:Cassandra read returns AssertionError: "Lower bound [INCL_END_BOUND() ] is bigger than first returned value"Cassandra 读取返回 AssertionError: \"Lower bound [INCL_END_BOUND() ] is greater than first returned value\"
【发布时间】:2022-10-24 17:12:56
【问题描述】:

我的 Cassandra 服务器已经死机,我试图在另一台计算机上恢复它。根据这篇文章https://community.datastax.com/questions/4818/backup-and-restore-cassandra-keyspace.html,我将data 文件夹移至新服务器。除了其中一个之外,所有表都已正确恢复。 当我尝试从中读取数据时,出现异常:

ERROR [ReadStage-2] 2022-10-19 07:47:55,026 AbstractLocalAwareExecutorService.java:166 - Uncaught exception on thread Thread[ReadStage-2,10,main]
java.lang.AssertionError: Lower bound [INCL_END_BOUND(2022-10-15 15:23Z) ]is bigger than first returned value [Row: utcdate=2022-10-15 11:07Z | data={t:0.880347,g:0.530729,a:180.0,v:11.7,d:5.896}] for sstable /var/lib/cassandra/data/Telematics_Energo/devicecoordinate-1005f1704edc11ed81fb63e346a603ff/mc-2158-big-Data.db
    at org.apache.cassandra.db.rows.UnfilteredRowIteratorWithLowerBound.computeNext(UnfilteredRowIteratorWithLowerBound.java:127) ~[apache-cassandra-3.11.11.jar:3.11.11]
    at org.apache.cassandra.db.rows.UnfilteredRowIteratorWithLowerBound.computeNext(UnfilteredRowIteratorWithLowerBound.java:48) ~[apache-cassandra-3.11.11.jar:3.11.11]
    at org.apache.cassandra.utils.AbstractIterator.hasNext(AbstractIterator.java:47) ~[apache-cassandra-3.11.11.jar:3.11.11]
    at org.apache.cassandra.utils.MergeIterator$Candidate.advance(MergeIterator.java:374) ~[apache-cassandra-3.11.11.jar:3.11.11]

< ... cut ... >

我的查询是这样的:

SELECT 
  utcdate, data 
FROM 
  devicecoordinate 
WHERE 
  id = 00a8efb3-7815-e911-a830-00155d03c802 
  and period = 1663 

  and utcdate >= '2022-10-09 08:55:00+0000' 
  and utcdate <= '2022-10-09 08:56:00+0000' 

order by 
  utcdate
;

对于其他时间段,查询可以毫无例外地执行,也可以在没有order by 子句的情况下执行。

表结构为:

CREATE TABLE devicecoordinate (
    id uuid,
    period int,
    utcdate timestamp,
    data text,
    PRIMARY KEY (( id, period ), utcdate)
) WITH CLUSTERING ORDER BY ( utcdate DESC )
AND bloom_filter_fp_chance = 0.01
AND comment = ''
AND crc_check_chance = 1.0
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = '99.0PERCENTILE'
AND caching = {
    'keys' : 'ALL',
    'rows_per_partition' : 'NONE'
}
AND compression = {
    'chunk_length_in_kb' : 64,
    'class' : 'LZ4Compressor',
    'crc_check_chance' : 1.0,
    'enabled' : true
}
AND compaction = {
    'base_time_seconds' : 14400,
    'class' : 'DateTieredCompactionStrategy',
    'enabled' : true,
    'max_sstable_age_days' : 5,
    'max_threshold' : 32,
    'min_threshold' : 4,
    'timestamp_resolution' : 'MICROSECONDS',
    'tombstone_compaction_interval' : 86400,
    'tombstone_threshold' : 0.2,
    'unchecked_tombstone_compaction' : false
};

Cassandra 版本:3.11.11

cql_version:3.4.4

native_protocol_version: 4

如何修复异常?

【问题讨论】:

  • 每个节点上的所有修复 (nodetool -pr repair) 是否一次完成并在恢复操作后不同步?此外,如果您可以使用 Cassandra 的确切major.minor.patch 版本更新您的问题,它将帮助审阅者更好地对问题进行分类。
  • nodetool repair -pr Telematics_Energo devicecoordinate 返回Replication factor is 1. No repair is needed for keyspace 'Telematics_Energo'

标签: cassandra cassandra-3.0


【解决方案1】:

这个AssertionError 是由UnfilteredRowIteratorWithLowerBound.computeNext() 抛出的,因为聚类列的值比前一个值“更大”,这意味着聚类行是无序的:

ERROR [ReadStage-2] 2022-10-19 07:47:55,026 AbstractLocalAwareExecutorService.java:166 - Uncaught exception on thread Thread[ReadStage-2,10,main]
java.lang.AssertionError: Lower bound [INCL_END_BOUND(2022-10-15 15:23Z) ]is bigger than first returned value [Row: utcdate=2022-10-15 11:07Z | data={t:0.880347,g:0.530729,a:180.0,v:11.7,d:5.896}] for sstable /var/lib/cassandra/data/Telematics_Energo/devicecoordinate-1005f1704edc11ed81fb63e346a603ff/mc-2158-big-Data.db
    at org.apache.cassandra.db.rows.UnfilteredRowIteratorWithLowerBound.computeNext(UnfilteredRowIteratorWithLowerBound.java:127) ~[apache-cassandra-3.11.11.jar:3.11.11]
    ...

在您的情况下,2022-10-15 15:23Z 大于 utcdate = 2022-10-15 11:07Z

我最后一次遇到这个问题是当 DBA 将表克隆到另一个集群但没有正确创建模式时。

在您发布的架构中,utcdate 的聚类顺序应为降序 (DESC):

CREATE TABLE devicecoordinate (
    ...
) WITH CLUSTERING ORDER BY (utcdate DESC)

但是很有可能在创建表时没有指定聚类顺序,因此它默认为升序 (ASC) 顺序:

WITH CLUSTERING ORDER BY (utcdate ASC)

当模式与 SSTables 中的数据不匹配时,Cassandra 将无法读取数据,因为这些行是无序的。

要修复它,您需要:

  1. 使用DROP TABLE devicecoordinate 删除表。
  2. 重新创建表。
  3. 将 SSTable 恢复到新表。

    这应该可以解决您的问题。干杯!

【讨论】:

    猜你喜欢
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 2021-07-11
    • 1970-01-01
    相关资源
    最近更新 更多