簡體   English   中英

在Cassandra上准備的最大聲明數量

[英]Max number of prepared statement on Cassandra

Backgound :我們使用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?
  • 有沒有比重新啟動Cassandra節點來清理PS緩存更好的解決方案?
  • 使用Java客戶端,關閉Session / Cluster對象會緩解這個(服務器端)嗎?

這些准備好的報表的服務器端成本是多少?

每個准備好的語句將被解析並使用它的MD5摘要作為關鍵字進一步存儲在緩存中。 客戶端關於重新注冊的相同准備語句將使服務器將MD5摘要與現有語句匹配,因此應該避免。 執行已注冊的語句將使客戶端將MD5連同查詢參數一起發送到服務器,並且服務器能夠使用MD5檢索緩存的語句,與解析常規CQL語句相比,執行速度更快。 每個緩存的語句也將使用部分Java堆,它對應於MD5鍵的總大小和語句對象的表示。

服務器會保留所有PS還是刪除較少使用的PS?

准備好的語句由服務器通過創建基於ConcurrentLinkedHashMap的緩存來管理。 緩存的容量取決於可用內存: Runtime.getRuntime().maxMemory() / 256 條目也按其內存使用情況加權,並且在達到容量的情況下,將首先從緩存中逐出大型語句。 您可以使用org.apache.cassandra.metrics.CQL.PreparedStatementsEvicted JMX度量標准監視此行為。

有沒有比重新啟動Cassandra節點來清理PS緩存更好的解決方案?

不是我知道的。 我也不確定你為什么要這樣做,因為將為相同的查詢創建相同的MD5摘要。 還請注意,Java客戶端將自動重新注冊在服務器上找不到的預准備語句 ,例如,如果它已從緩存中逐出(請參閱此答案 )。

使用Java客戶端,關閉Session / Cluster對象會緩解這個(服務器端)嗎?

我不這么認為。 服務器必須跟蹤數百個潛在客戶已注冊的語句,以便安全地清理它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM