Couchbase 介紹 - 更好的 Cache 系統

在移動互聯網時代,咱們面對的是更多的客戶端,更低的請求延遲,這固然須要對數據作大量的 Cache 以提升讀寫速度。web

術語

節點:指集羣裏的一臺服務器。redis

現有 Cache 系統的特色

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

  • Cluster 支持不夠。在擴容、負載均衡、高可用等方面存在明顯不足。數據庫

  • 持久化支持很差,出現問題後恢復的代價大。memcached 徹底不支持持久化,redis 的持久化會形成系統間歇性的負載很高。後端

我期待的理想 Cache 系統

良好的 cluster 支持服務器

  • Key 能夠動態分散(Auto Sharding)在不一樣的服務器上,能夠經過動態添加服務器節點增長系統容量。負載均衡

  • 沒有單點失效,任何一個單點都不會形成數據不可訪問。運維

  • 讀寫負載能夠均勻分佈在系統的不一樣節點上。異步

支持異步持久化支持memcached

  • 方便快速恢復,甚至能夠直接用做 key/value 數據庫。 常常在跟業界朋友交流時,會提到用 key 分段的方法來作容量擴展以及負載均衡。可是用靜態的 key 分段會有很多問題:

  • Cache 系統自己及使用 cache
    的客戶端都須要預設一個分段邏輯,這個邏輯後期若是須要調整將會很是困難。不能解決單點失效的問題,還須要額外的手段。運維須要更多的人爲參與,避免 key 超出現有分區,一旦出現 key 找不到對應服務器,訪問直接失敗。

最接近需求的系統:Couchbase

基於這些想法,我花了幾天時間在 google, stack overflow, quora 上看了不少你們關於 cache cluster 的討論,找到一個比較新系統 Couchbase。

couchbase vs memcached
mem vs cb memcached VS couchbase

Couchbase 的集羣設計對等網

Couchbase 羣集全部點都是對等的,只是在建立羣或者加入集羣時須要指定一個主節點,一旦結點成功加入集羣,全部的結點對等。

couchbase server cluster

對等網的優勢是,集羣中的任何節點失效,集羣對外提供服務徹底不會中斷,只是集羣的容量受影響。 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 已經被咱們在生產環境中大量採用。

關於做者

張虎
weibo: @Tiger_張虎雲巴 (yunba.io) 創始人,yunba.io 雲後端服務。 JPush 創始人,原CTO。 Oracle VM 創始團隊成員。

相關文章
相關標籤/搜索