Cassandra

僅從本地 cassandra 節點中的分區讀取

  • May 7, 2020

我知道我可以從任何 cassandra 節點讀取數據,它充當協調器從包含特定分區的節點讀取數據,但我可以只從我正在連接的節點上的分區讀取數據嗎?

換句話說,當一個 cassandra 集群有 10 個節點時,它在每個節點上包含 10 個分區(並且可能在設置 RF 時在其他節點上包含副本)。當我發送 SELECT * FROM TABLE 時,我只想獲得總數據的 1/10,這些數據實際上儲存在該特定節點上,而沒有任何流量到其他節點。

非常感謝!

您可以按以下方式進行(類名稱等用於驅動程序 3.x,在 4.x 中可能略有不同):

  • 確定特定節點處理哪些令牌範圍 - 您可以從Metadata類中獲取此資訊cluster.getMetadata().getTokenRanges(keyspace, host)(請參閱doc);

  • 對於每個令牌範圍重複:

    • 生成類似的查詢select * from table where token(part_keys) > rangeStart AND token(part_keys) <= rangeEnd(但這可能不會一直有效,因為您需要處理節點的令牌範圍在令牌環結束和令牌環開始之間分割的情況 - 請參閱連結程式碼)
    • 為每個查詢創建一個實例Statement(例如 as SimpleStatement),並將一致性級別設置LOCAL_ONE應該發送查詢的主機(通過setHost 函式
    • execute使用or函式執行查詢executeAsync並處理數據

可以在此處找到執行完整集群掃描的原始碼- 您可以重用其中的一部分,以生成對令牌範圍的查詢等。

引用自:https://dba.stackexchange.com/questions/266609