2012-04-10 150 views
2

當Fetchinig多個密鑰集,我可以看到,客戶端發出在一個長字符串的請求,併發送至所連接的couchbase服務器(協議似乎包括每個按鍵的vbucket地圖以及)獲取一組密鑰?

所以,一個網絡來自客戶端的所有密鑰,他們的vbucketmaps。

服務器如何響應此請求?

如果連接的服務器具有請求的所有值,那麼我希望連接的服務器只給出請求的值。

但是,如果有多個羣集,則連接的服務器可能沒有請求的密鑰。服務器在這種情況下做什麼?我可以看到請求中包含vbucket映射,由此可以預料,連接的服務器可能會詢問特定的Key的主服務器的值。這只是我的猜測,我想知道服務器在這種情況下如何迴應。

此外,如果密鑰存在,會發生什麼情況,但由於「服務器繁忙」或其他錯誤導致服務器無法返回值。

始終與您的幫助表示讚賞

回答

3

有兩種不同的方式會發生這種情況,要麼沒戲或不末席。

沒有末席(智能客戶端)

的客戶端進行與Couchbase的連接,將首先獲得所有的集羣和vbucket地圖中的服務器列表。然後它連接到羣集中的每個服務器。當您執行多操作時,客戶端將諮詢其包含的vbucket映射,並確定服務器屬於哪個vbucket。如果我們有三臺服務器,那麼客戶端將最多組合三個多操作,並將每個操作發送到包含該多操作中所有密鑰的對應服務器。每臺服務器都會響應客戶端,客戶端會將所有結果放在一組結果中。

隨着末席

在這種情況下,客戶不知道羣集或vbucket地圖,但沒戲呢。客戶端會將所有密鑰發送給moxi,然後moxi會負責將它們分開併發送給相應的服務器。

Sever的向下情景:

如果服務器停機或繁忙然後在服務器的特定多操作鍵都將失敗。客戶端應該返回它可以從其他服務器獲得的密鑰並提醒您錯誤。

重新平衡方案:

在重新平衡有一個小的機會,一個請求將被髮送到錯誤的服務器。在這種情況下,客戶端應該重試正確的服務器上的操作。在重新平衡期間,每個客戶端都應該收到一個「快進」vbucket映射,表明所有vbuckets在重新平衡之後的位置。它將使用此vbucket映射中的服務器進行重試。

+0

嗯有點難以理解atm ... 對於第一部分,正如我可以從你的寫作看到的,看起來像多個網絡調用可以由客戶端完成,你也說「發送每個相應的包含該多操作中所有密鑰的服務器「如果這種服務器不存在,該怎麼辦?在第二部分中,您說過「將其拆分併發送到適當的服務器」這是否意味着客戶端連接到多個服務器併發送適當的請求? 第三部分,如果有3個鍵和1未能得到。整個請求是否返回錯誤?想詳細瞭解更多。謝謝 – 2012-04-12 01:35:45

+0

我很抱歉我的回答有點混亂。您開始提出更詳細的問題,以便您可以告訴我您使用哪個客戶端連接到Couchbase。這樣我可以更好地回答你的問題。 – mikewied 2012-04-15 03:53:02

+0

由客戶端,你的意思是我認爲...我還沒有決定使用哪個庫,但看着spymemcached(JAVA)和libcouchbase(C++)。看起來像兩個行事很相似 – 2012-04-16 00:38:23