【问题标题】:Cassandra read queries return empty results Using springframework data cassandraCassandra读取查询返回空结果使用springframework数据cassandra
【发布时间】:2021-01-31 04:13:53
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: spring-boot cassandra cqlsh tombstone


    【解决方案1】:

    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
    

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

    干杯

    【讨论】:

    • 另外,您需要考虑为表定义的 gc_grace_seconds 设置。默认值为 864,000 秒(10 天);此配置确定系统中存在墓碑记录的时间。您可以在 cqlsh 中获取与命令 DESCRIBE TABLE &lt;ks_name&gt;.&lt;cf_name&gt; 一起使用的设置。如果删除记录并立即执行压缩,如果 gc_grace_seconds 时间段尚未完成,nodetool compact 将无法回收磁盘空间。
    猜你喜欢
    • 2013-09-27
    • 2018-05-09
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 2015-01-05
    • 1970-01-01
    • 2012-10-21
    相关资源
    最近更新 更多