Cassandra
如果 2 個 Cassandra 節點在 RF=2 時出現故障,數據是否仍然可用?
我是C *的新手,所以任何人都可以幫忙。假設在我的環境中有一個由 6 個節點組成的集群和一個 RF=2 的密鑰空間。有一天,六分之二的節點出現故障,所以我可以從其他 4 個節點獲取數據(也許)我失去了兩個節點上的一些條目的數據),如何做到這一點?
謝謝。
答案取決於幾個因素,但主要取決於兩個不可用節點是否是彼此的“鄰居”。讓我用一個例子來說明。
考慮具有以下令牌分配的集群:
node1
擁有令牌範圍 0-9node2
擁有 10-19node3
擁有 20-29node4
擁有 30-39- 等等
回想一下,副本儲存在“鄰居節點”上,因此
RF=2
,數據node1
複製到node2
(其鄰居),node2
數據複製到node3
等等。假設我們要檢索由
user = 'alice'
擁有的數據node1
。以下是可能的情況:
- 如果我們以一致性級別
LOCAL_QUORUM
(2 個副本必須響應)進行查詢,並且兩者node1
都node5
關閉,那麼讀取請求將失敗,因為兩個副本(node1
和node2
)都必須響應但只有node2
可用。- 如果我們使用 , 和兩者進行查詢,並且
LOCAL_QUORUM
兩者都關閉,那麼讀取將失敗,因為兩個副本都關閉了。node1``node2
- 如果我們使用
LOCAL_QUORUM
, 和兩者進行查詢,node3
並且node4
都關閉(不是數據的所有者),那麼讀取請求將返回數據。- 如果我們查詢
LOCAL_ONE
並且協調器選擇node1
但它已關閉,則讀取請求將失敗。沒關係,node2
因為使用LOCAL_ONE
,只會查詢一個節點。- 如果我們用 查詢
LOCAL_ONE
,協調器選擇node1
,並且node2
關閉,數據將被返回。沒關係,node2
因為只會查詢一個節點(node1
)。如果您想了解有關讀取和一致性級別的更多資訊,請參閱以下文件:
乾杯!
在一個有 6 個節點的集群中,當 2 個節點宕機時,其 keyspace 的 RF=2,可以查詢剩餘 4 個節點的數據嗎?
因此,在 6 節點集群中 RF=2(節點數量並不重要),所有數據的兩個副本將分佈在這些節點周圍。每個節點都有自己的主要令牌範圍,以及一組輔助範圍以保存來自其他節點的額外數據副本。
在上述場景中,可能存在在這兩個節點上都有其主副本和輔助副本的數據分區。因此,在 RF=2 和 2 個節點停機的情況下,Cassandra 無法再保證 100% 的數據可用性。
剩下的 4 個節點仍然可以提供它們的數據。但是,對於 2 個“DN”節點的令牌在主要和次要範圍內的數據的請求將失敗。