Cassandra读取查询返回空结果使用springframework数据cassandra

问题描述

当我执行Cassandra读取查询时,它总是返回空结果,但是cassandra表中存在记录。

在同一分区上执行删除操作时,我遇到了这个问题。

例如: 分区A包含1 M条记录,并且较早前,我已在同一分区A上删除了900K条记录。 后来我无法在同一分区上获得剩余的100K记录。有时会抛出ReadTimeoutException或返回空结果。

使用springframework数据cassandra查询时会发生这种情况。我可以执行相同的查询,并通过cassandra工具(Datastax或Dbeaver)获得结果。

您能帮我吗?

解决方法

Cassandra不会立即删除数据,它标记为删除,并且将在配置的时间后删除。同时,您的查询可能需要更长的时间。如果您需要更快地删除数据,则需要运行压缩:

./nodetool compact <ks_name> <cf_name>

无论如何,生产中的数据库都需要压缩以保持良好状态。

从Spring-boot查询100K行在时间,从可用带宽传输的信息量以及所用内存方面来说都是昂贵的。您可以发布配置的详细信息,并检查Spring-boot微服务服务器是否在查询期间用完了内存并进行了交换吗?

free -h

更多东西。您可以检查您要从Spring-boot查询哪个节点吗? 您可以在这里粘贴Spring-boot发送的CQL吗? 您是从cqlsh中查询该节点/分区上的数据还是所有100K行? 您在Spring-boot项目中使用的是负载平衡器,代理服务还是其他服务(如Consul)?

要解决网络问题,请ssh到您要查询的cassandra节点,并使用tcpdump进行检查,以确认它实际上是从运行微服务的计算机获取连接。

假设使用spring-boot的计算机是10.0.10.100,请ssh到您认为正在接收连接的Cassandra节点并执行:

sudo tcpdump | grep "10.0.10.100"

现在尝试从Spring-boot运行查询。

在Spring-boot服务器中打开iftop,然后查看从Cassandra获取内容所消耗的带宽是多少。

iftop

希望有帮助。请提供更多信息。

欢呼