通过Stargate API读取DSE Cassandra集群数据时报错如何解决?
报错原因
- Cassandra普通二级索引仅支持等值(
=)查询,不支持$gt、!=、<这类范围或不等操作符,你测试用的$gt查询以及业务所需的不等、范围过滤都不符合普通二级索引的使用规则。 - Cassandra为了避免无差别全表扫描引发的性能问题,默认禁止执行无法命中索引的过滤查询,因此抛出提示要求你明确确认是否接受性能风险。
- 你业务需要的三个过滤条件包含两个不等判断、一个范围判断,即使单个字段加了普通二级索引,多条件组合的情况下也无法直接通过索引执行查询,必然需要扫描大量数据。
解决方案
按照生产可用性从高到低排序:
- 调整表结构适配Cassandra查询驱动的设计逻辑
基于你常用的查询条件设计主键,可新增一张专门用于待重试数据查询的表,将业务分片字段(如日期、业务区域等)作为分区键,attemp_count、status、status_code作为聚类键,即可直接通过聚类键的范围查询拿到符合条件的数据,无额外索引开销,查询性能最优。 - 更换为支持范围查询的索引类型
若不希望调整表结构,可将status、status_code、attemp_count三个字段的普通二级索引替换为SASI索引,SASI索引原生支持范围查询、不等查询等操作,可以满足你的查询需求,适合写入QPS不高的场景。 - 启用DSE Search索引
你使用的是DSE Cassandra,可开启DSE Search功能为相关字段建搜索索引,支持任意组合的过滤查询,灵活度最高,适合查询条件多变的业务场景,对应存储和写入开销也更高。 - 临时测试添加ALLOW FILTERING参数(仅测试可用,生产禁止)
小数据量测试场景下,可在Stargate API的查询参数中添加allow-filtering=true强制执行查询,示例如下:
该方案本质是强制触发全表扫描,数据量大时会出现查询超时甚至节点稳定性问题,绝对禁止用于生产环境。{{url}}/v2/keyspaces/dco/mc_inbound_log?where={"status_code":{"$gt":"201"}}&allow-filtering=true
内容的提问来源于stack exchange,提问作者Romano
相关产品推荐
相关产品推荐

