3

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

当同一分区上发生删除操作时,我遇到了这个问题。

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

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

你能帮我解决这个问题吗?

4

1 回答 1

2

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

./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 Server 中打开 iftop 并查看从 Cassandra 获取所消耗的带宽。

iftop

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

干杯

于 2020-10-23T19:38:14.680 回答