2015-07-10 136 views
1

我指的是this文檔的應用程序堆棧部分中的Couchbase服務器,概述了Couchbase羣集的所需架構。Couchbase羣集故障轉移架構

我注意到圖中的5個Couchbase節點都有相應的Web服務器。我也知道Couchbase SDK旨在建立到單個節點的連接,併爲所有請求保留該連接,但故障切換事件除外。

首先,我想確認圖中5個Web服務器中的每一個都將建立到5個Couchbase節點之一的單個連接。我認爲會導致1:1的關係;每個Web服務器都將連接到相應的Couchbase節點,從而不會有2個Web服務器建立到同一個Couchbase節點的連接。

如果是這種情況,那麼在發生Couchbase節點故障時,假設該節點是不可恢復的,我應該刪除相應的Web服務器嗎?這可能看起來不直觀,但這裏的情況是我的理解:

  1. Couchbase節點#1死
  2. Web服務器#1(連接到Couchbase節點1#)建立到下一個可用節點的連接, Couchbase節點#2(大多數SDK處理這個,FAIA)
  3. Couchbase節點#2現在有2個已建立的連接;從Web服務器#2(其對應的服務器)和現在也從網絡服務器#1(其對應Couchbase節點是死的)

我擔心的是我已經注意到短暫端口耗盡問題與Couchbase Server中,建立更多的時候而不是1個連接到單個節點。 This generally results in client timeouts

獲取http://0.0.0.0:8091/pools:撥打TCP 0.0.0.0:8091:操作超時 出

再次,在此基礎上,當Couchbase節點死亡是否也應該刪除相應的Web服務器,以避免到同一個Couchbase節點的多個連接,以及潛在的臨時端口耗盡?

回答

1

Web服務器和Couchbase節點之間沒有1:1的關係。每個Web服務器都有連接到每個Couchbase節點。在Couchbase中,羣集的每個節點的整個數據集的百分比均處於活動狀態,而不是完整副本。 Couchbase自動分割數據,並且這些分片(vBuckets)均勻分佈在整個集羣中。

因此,當Web服務器或應用程序服務器要讀取/寫入對象時,它將轉到擁有該對象所在的vBucket的集羣中的對應節點。在Couchbase軟件開發工具包中有一個一致的散列,它取得每個對象的ID,散列的輸出是1到1024之間的數字。有1024個活動vBuckets,每個副本有另外1024個。因此,該一致性的輸出是vBucket對象將居住的ID是否有意義?然後,SDK快速查找其集羣映射的副本(每當集羣拓撲發生變化時都會更新),集羣的哪個節點位於該集羣的哪個節點上,然後直接與該對象的特定節點進行交互。

所以你的失敗情況並不完全正確。如果Couchbase羣集的節點發生故障,則只有該節點上的vBuckets不可用。所以只有整個數據集的一個百分比。如果您啓用了自動故障(默認爲關閉),那麼在羣集中設置超時之後,羣集將自動使節點超時失效,並將副本v箱料提升爲活動狀態,從而使您回到100%活動數據集。集羣基本上犧牲了這些副本vBuckets。由於這是一個拓撲變化,所以新的羣集映射會通過SDK發送到您的客戶端應用程序,並且實時移動。此外,您需要重新平衡羣集以重新生成那些現在缺少副本vBuckets並讓您恢復正常。

至於你的臨時端口耗盡,你如何管理你的集羣連接?您是否重複使用連接或每次打開新連接然後不關閉它們?你想打開連接並重復使用它們,而不是一遍又一遍地打開新的連接。如果你每次打開新文件而沒有清理,你肯定會耗盡你的端口,因此文件描述符。就像我說的,重用它們。