2015-06-10 23 views
1

我想了解在使用交換重新平衡向數據庫傳入操作的聯機升級過程中,數據一致性如何維護。Couchbase交換重新平衡如何工作?

  • 當我說交換重新平衡(1個節點添加和刪除)時,來自一個節點的數據被複制到新添加的節點。在這個轉換時間內,到達正在被刪除的節點的請求會發生什麼?
  • 在交換過程中我們看到任何數據可用性問題嗎?

回答

5

再平衡在內部是由移動節點之間的vBuckets增量完成。無論您添加還是刪除節點。

vBucket基本上是一個「分區ID」或「碎片」。在整個集羣生命週期中,給定密鑰的vBucket是不變的。基本上:

vbucket = hash(key) % number_of_vbuckets-1 

由於總vbuckets的數量在集羣的持續時間內永遠不會改變,所以vbucket是恆定的。

要確定給定的vBucket屬於哪個服務器節點,每個服務器都有一個同步的「Cluster Map」,它基本上提供了一個映射,確定哪個vBucket由哪個服務器擁有。客戶端在初始連接階段接收此映射,並定期更新(通過各種方式)。

客戶端在發送數據請求(get,store)時,在請求包中指示該項目所屬的實際vbucket。如果一切正常,客戶端會將請求發送到正確的服務器,操作將繼續。

重新平衡是將vbuckets重新分配給其他服務器的概念。在添加節點的情況下,新節點取得其他節點先前擁有的一些vbuckets的所有權;在刪除節點的情況下,其餘的服務器都會獲得舊節點擁有的其他vbuckets。

重新平衡是遞增執行的;這意味着並不是所有的vbuckets都是一次傳輸的。在此過程中,客戶端可能會向舊節點發送不再擁有的vbuckets的請求。發生這種情況時,節點以「NOT MY VBUCKET」錯誤作出響應,實質上告訴客戶端不再對此vbucket負責,並且客戶端應重新配置自身。然後客戶端內部重新配置自己並重新發送操作到正確的節點。

如果節點被完全刪除,客戶端也會將此作爲提示重新配置自身,並再次將操作重新發送到正確的節點。

如果客戶端在vbucket被傳輸之前發出請求,傳輸將被延遲,直到該特定操作再次傳播到新節點。

在所有情況下,由於Couchbase體系結構的原因,客戶端和每個節點之間總是存在明確的關於節點是否是正確操作的協議。

+0

很好的答案。謝謝@mnunberg – minion

0

在交換重新平衡過程中,您是正確的,數據將從已移除的節點複製到新節點。最簡單的是它一次完成這個v_bucket。在複製哈希映射期間,客戶端將點用於傳出節點上的v_bucket。一旦複製了所有數據(包括複製期間所做的任何更改),則傳出節點上的v_bucket將被鎖定以進行更新,然後哈希映射更改爲指向新節點上的v_bucket。在v_buckets之間切換時會有最小的中斷,但它應該全部由客戶端處理,您不會期望看到任何問題,只是在切換時響應時間稍微增加。所有數據在重新平衡期間保持可用。然後它轉到下一個v_bucket。