4

我知道Cassandra具有不同的讀取一致性級別,但是我沒有看到一致性級別,它只允許從一個節點按鍵讀取數據。我的意思是,如果我們有一個複製因子爲3的羣集,那麼當我們閱讀時,我們將始終詢問所有節點。即使我們選擇一個一致性級別,我們也會詢問所有節點,但要等待來自任何節點的第一個響應。這就是爲什麼我們在讀取時不僅會加載一個節點,而且會加載3個(4個帶有協調器節點)。即使設置了更大的複製因子,我認爲我們也無法真正提高讀取性能。

真的只能從單個節點讀取嗎?是否可以僅從複製因子爲3的Cassandra集羣中的單個節點讀取數據?

回答

3

您使用令牌感知負載平衡策略嗎?

如果您是,您使用LOCAL_ONE/ONE的一致性查詢,讀取查詢應只聯繫單個節點。

給文章Ideology and Testing of a Resilient Driver一個閱讀。在這裏面,你會發現,使用TokenAwarePolicy有這樣的效果:

「對於單個數據中心的情況下,TokenAwarePolicy通過避免選擇典型的主副本是在削減延遲的希望所選擇的協調協調者 - 副本跳躍「。

這就是發生了什麼事。假設我有一個跟蹤Kerbalnauts的表格,我想獲取「Bill」的所有數據。我會用這樣的查詢:

SELECT * FROM kerbalnauts WHERE name='Bill'; 

司機我散列分區鍵值(名)的(SELECT token(name) FROM kerbalnauts WHERE name='Bill';返回該值)的標記。如果我有6個節點的集羣工作,那麼我的主令牌範圍將是這樣的:

node start range    end range 
1)  9223372036854775808 to -9223372036854775808 
2) -9223372036854775807 to -5534023222112865485 
3) -5534023222112865484 to -1844674407370955162 
4) -1844674407370955161 to 1844674407370955161 
5)  1844674407370955162 to 5534023222112865484 
6)  5534023222112865485 to 9223372036854775807 

爲節點5是負責包含分區鍵的標記範圍「比爾,」我的查詢將被髮送到節點5.當我讀取LOCAL_ONE的一致性時,將不需要聯繫另一個節點,並且結果將返回給客戶端...僅擊中單個節點。

注:標記範圍計算有:

python -c'print [str(((2**64 /5) * i) - 2**63) for i in range(6)]' 
+0

哇!謝謝你澄清。我是否正確理解,如果我們增加複製因子,那麼我們線性增加讀取吞吐量? – Alexandr

+0

@Alexandr這個想法有很多矛盾的信息。當然,它會增加您的可用性。但就吞吐量而言,下面是一個問題的鏈接,似乎證實了相反的情況(表明較高的RF *降低了吞吐量,並且鏈接到一個問題,其中一個答案表明與*相反*讓你決定自己):http://stackoverflow.com/questions/27084341/effects-of-increasing-the-replication-factor-on-the-performance-of-cassandra – Aaron

2

我的意思是如果我們有3個複製因子集羣,然後我們會一直要求所有節點時,我們讀到

錯誤,一致性級別ONE協調器選擇最快的節點(具有最低延遲的節點)來請求數據。

它如何知道哪個副本是最快的?通過保持每個節點的內部延遲統計信息。

隨着一致性水平> =法定人數,協調會要求數據從最快的節點和還詢問消化來自其他副本

從客戶端,如果您選擇合適的負載均衡策略(如TokenAwareStrategy)使用一致性級別時,客戶端將始終與主副本進行聯繫ONE

+1

好的工作澄清關於「總是詢問所有節點「,當在RF上閱讀」1「時,這聽起來並不正確。 – Aaron

相關問題