当前位置: 首页 > 知识库问答 >
问题:

关于卡桑德拉的准备声明的最大数量

利思源
2023-03-14

背景:我们正在使用Cassandra来存储一些时间序列数据,并且我们正在使用准备好的语句来访问数据。

我们通过以下方式对表中的数据进行分区:

  • 时间段(如一周或一个月)和
  • 保留策略(如 1 年、5 年或 10 年)

对于不同的表,我们需要为查询、时间段和保留策略的每个组合准备一个不同的语句(仅在使用时),因此我们将有一个爆炸式的预准备语句数量。一些数学:

timePeriods = 12..52 * yearsOfData
maxNumOfPrepStatements = timePeriods * policies * numOfQueries

ourCase => (20 * 10 y) * 10 p * 10 q = 20.000 prep statements

在客户端,我只能在缓存中保留最常用的PS,但是我找不到一种方法从服务器中删除未使用的PS,因此我担心拥有大约20.000个准备好的语句对于每个节点来说都是一个很大的成本。

问题:此数量的PS是否会导致服务器出现问题?

这分成更小的问题:

  • 这些准备好的语句的服务器端成本是多少?
  • 服务器将保留所有PS还是删除较少使用的PS?
  • 有没有比重新启动卡桑德拉节点清理PS缓存更好的解决方案?
  • 使用Java客户机,关闭会话/集群对象是否会缓解这种情况(服务器端)?

共有1个答案

柏高丽
2023-03-14

这些准备好的报表的服务器端成本是多少?

每个预准备的语句都将被解析并进一步存储在缓存中,使用其 MD5 摘要作为键。客户端是关于重新注册的相同的 prepare 语句将导致服务器将 MD5 摘要与现有语句进行匹配,因此应避免这样做。执行已注册的语句将使客户端将 MD5 与查询参数一起发送到服务器,并且服务器能够使用 MD5 检索缓存的语句,与解析常规 CQL 语句相比,MD5 的执行速度更快。每个缓存的语句还将消耗 Java 堆的一部分,该堆对应于 MD5 键的总大小和语句对象的表示形式。

服务器会保留所有的PS还是会删除那些不常用的?

准备好的语句由服务器管理,方法是创建一个基于ConprestLinkedHashMap的缓存。缓存的容量取决于可用内存:Runtime.getRuntime(). maxMemory()/256。条目也根据其内存使用情况进行加权,如果达到容量,将首先从缓存中驱逐大型语句。您可以使用org.apache.cassandra.metrics.CQL.PreparedStatementsEvictedJMX指标监控此行为。

有没有比重启Cassandra节点清理PS缓存更好的解决方案?

我不知道。我也不确定您为什么要这样做,因为将为相同的查询创建相同的MD5摘要。还请注意,Java客户端将自动重新注册在服务器上找不到的准备好的语句,例如,如果它已从缓存中删除(另请参阅此答案)。

使用Java客户机,关闭会话/集群对象是否会缓解这种情况(服务器端)?

我不这么认为。为了安全地清理这些语句,服务器必须跟踪数百个潜在客户注册了哪些语句。

 类似资料:
  • 我正在使用Cassandra作为我的一个应用程序。我想使用Cassandra通过cql提供的Prepared语句。如果我准备了一个查询,这是否在所有节点中都准备好了?。 任何帮助是值得赞赏的。

  • 我们对DataStax Cassandra的查询使用缓存的准备声明。但是,如果我们需要向表中添加新列,我们需要重新启动应用程序服务器以重新缓存准备好的语句。 我在卡珊德拉遇到了这个错误,这解释了https://datastax-oss.atlassian.net/browse/JAVA-420的解决方案 它基本上提供了一种解决方法,在查询中不使用“SELECT*FROM table”,而是使用“s

  • 我并不完全理解预准备语句的概念,但是根据python驱动程序文档,预准备语句是< code >“针对至少一个Cassandra节点准备的语句”。对我来说,在集群中的某个地方有关于已经准备好的查询的信息。该文档还规定< code >“prepared statement应该只准备一次。重新准备语句可能会影响性能(因为该操作需要网络往返),"。 如果我的概念是正确的,那么从集群中接收已经准备好的语句而

  • 我已经开始使用DataTax PHP驱动程序学习PHP中的Cassandra,我必须使用准备好的语句在CQL中设置映射的值,查询是: 提交的“属性”是MAP类型,因此我尝试将其作为字符串传递: 在PHP中: 但是我得到了错误“java.lang.IllegalArgumentException”,对于准备好的语句中的映射或列表之类的集合,哪种语法是正确的?

  • 我有一个必须添加到采购订单的产品列表。采购订单具有序列号,添加产品后,应更改其状态以指示这些产品已出货。 1 个采购订单中处理的典型产品数为 500。 在DB上-我有2张桌子- 各方面的建议告诉我应该使用多个异步查询。然而,我关心的是整个操作的原子性。鉴于我的要求,请建议什么是最好的前进方式。 先谢谢你。

  • 我使用的是spring数据cassandra,需要使用jpa映射一个字段,在cassandra中,该字段的类型为