背景:我们正在使用Cassandra来存储一些时间序列数据,并且我们正在使用准备好的语句来访问数据。
我们通过以下方式对表中的数据进行分区:
对于不同的表,我们需要为查询、时间段和保留策略的每个组合准备一个不同的语句(仅在使用时),因此我们将有一个爆炸式的预准备语句数量。一些数学:
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是否会导致服务器出现问题?
这分成更小的问题:
这些准备好的报表的服务器端成本是多少?
每个预准备的语句都将被解析并进一步存储在缓存中,使用其 MD5 摘要作为键。客户端是关于重新注册的相同的 prepare 语句将导致服务器将 MD5 摘要与现有语句进行匹配,因此应避免这样做。执行已注册的语句将使客户端将 MD5 与查询参数一起发送到服务器,并且服务器能够使用 MD5 检索缓存的语句,与解析常规 CQL 语句相比,MD5 的执行速度更快。每个缓存的语句还将消耗 Java 堆的一部分,该堆对应于 MD5 键的总大小和语句对象的表示形式。
服务器会保留所有的PS还是会删除那些不常用的?
准备好的语句由服务器管理,方法是创建一个基于ConprestLinkedHashMap的缓存。缓存的容量取决于可用内存:Runtime.getRuntime(). maxMemory()/256
。条目也根据其内存使用情况进行加权,如果达到容量,将首先从缓存中驱逐大型语句。您可以使用org.apache.cassandra.metrics.CQL.PreparedStatementsEvicted
JMX指标监控此行为。
有没有比重启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中,该字段的类型为