Couchbase:更好的Cache系統

作者: 張虎  來源: Tiger's Blog  發布時間: 2014-11-28 08:50  閱讀: 11875 次  推薦: 11   原文鏈接   [收藏]  

  在移動互聯網時代,我們面對的是更多的客戶端,更低的請求延遲,這當然需要對數據做大量的 Cache 以提高讀寫速度。

  術語

  • 節點:指集群里的一臺服務器。

  現有 Cache 系統的特點

  目前業界使用得最多的 Cache 系統主要是 memcached 和 redis。 這兩個 Cache 系統都有都有很大的用戶群,可以說是比較成熟的解決方案,也是很多系統當然的選擇。 不過,在使用 memcached 和 redis 過程中,還是碰到了不少的問題和局限:

  • Cluster 支持不夠。在擴容、負載均衡、高可用等方面存在明顯不足。
  • 持久化支持不好,出現問題后恢復的代價大。memcached 完全不支持持久化,redis 的持久化會造成系統間歇性的負載很高。

  我期待的理想 Cache 系統

  良好的 cluster 支持

  • Key 可以動態分散(Auto Sharding)在不同的服務器上,可以通過動態添加服務器節點增加系統容量。
  • 沒有單點失效,任何一個單點都不會造成數據不可訪問。
  • 讀寫負載可以均勻分布在系統的不同節點上。

  支持異步持久化支持

  • 方便快速恢復,甚至可以直接用作 key/value 數據庫。 經常在跟業界朋友交流時,會提到用 key 分段的方法來做容量擴展以及負載均衡。但是用靜態的 key 分段會有不少問題:
  • Cache 系統本身及使用 cache 的客戶端都需要預設一個分段邏輯,這個邏輯后期如果需要調整將會非常困難。不能解決單點失效的問題,還需要額外的手段。運維需要更多的人為參與,避免 key 超出現有分區,一旦出現 key 找不到對應服務器,訪問直接失敗。

  最接近需求的系統:Couchbase

  基于這些想法,我花了幾天時間在 google, stack overflow, quora 上看了很多大家關于 cache cluster 的討論,找到一個比較新系統 Couchbase。

mem vs cb

  Couchbase 的集群設計對等網

  Couchbase 群集所有點都是對等的,只是在創建群或者加入集群時需要指定一個主節點,一旦結點成功加入集群,所有的結點對等。

high_level_architecture

  對等網的優點是,集群中的任何節點失效,集群對外提供服務完全不會中斷,只是集群的容量受影響。

  Smart Client

  由于 couchbase 是對等網集群,所有的節點都可以同時對客戶端提供服務,這就需要有方法把集群的節點信息暴露給客戶端,couchbase 提供了一套機制,客戶端可以獲取所有節點的狀態以及節點的變動,由客戶端根據集群的當前狀態計算 key 所在的位置。

  vBucket

  vBucket 概念的引入,是 couchbase 實現 auto sharding,在線動態增減節點的重要基礎。

  簡單的解釋 vBucket 可以從靜態分片開始說起,靜態分片的做法一般是用 key 算出一個 hash,得到對應的服務器,這個算法很簡單,也容易理解。如以下代碼所示:

servers = ['server1:11211', 'server2:11211', 'server3:11211']server_for_key(key) = servers[hash(key) % servers.length]

  但也有幾個問題:

  • 如果一臺服務器失效,會造成該分片的所有 key 失效。
  • 如果服務器容量不同,管理非常麻煩。
  • 前面提到過,運維、配置非常不方便。

  為了把 key 跟服務器解耦合,couchbase 引入了 vBucket。可以說 vBucket 代表一個 cache 子集,主要特點:

  • key hash 對應一個 vBucket,不再直接對應服務器。
  • 集群維護一個全局的 vBucket 與服務器對應表。
  • 前面提到的 smart client 重要的功能就是同步 vBucket 表。

  如以下代碼所示:

servers = ['server1:11211', 'server2:11211', 'server3:11211']vbuckets = [0, 0, 1, 1, 2, 2]server_for_key(key) = servers[vbuckets[hash(key) % vbuckets.length]]

vBucket

  由于 vBucket 把 key 跟服務器的靜態對應關系解耦合,基于 vBucket 可以實現一些非常強大有趣的功能,例如:

  • Replica,以 vBucket 為單位的主從備份。如果某個節點失效,只需要更新 vBucket 映射表,馬上啟用備份數據。
  • 動態擴容。新增加一個節點后,可以把部分 vBucket 轉移到新節點上,并更新 vBucket 映射表。

  vBucket 非常重要,以后可以單獨寫一篇文章分享。

  總結

  • Couchbase 的對等網設計,smart client 直接獲取整的集群的信息,在客戶端實現負載均衡,整個集群沒有單點失效,并且完全支持平行擴展。
  • vBucket 的引入,完全實現了 auto sharding,可以方便靈活的把數據的子集在不同節點上移動,以實現集群動態管理。
  • Couchbase 有一個非常專業的 web 管理界面,并且支持通過 RESTful API 管理,這也是 memcached, redis 不能企及的。
  • 如果只是做 key/value 的 cache,Couchbase 可以完全取代 memcached。
  • Couchbase 已經被我們在生產環境中大量采用。
11
1
 
標簽:Couchbase
 
 

文章列表

全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()