在移動互聯網時代,咱們面對的是更多的客戶端,更低的請求延遲,這固然須要對數據作大量的 Cache 以提升讀寫速度。web
節點:指集羣裏的一臺服務器。redis
目前業界使用得最多的 Cache 系統主要是 memcached 和 redis。 這兩個 Cache 系統都有都有很大的用戶羣,能夠說是比較成熟的解決方案,也是不少系統固然的選擇。 不過,在使用 memcached 和 redis 過程當中,仍是碰到了很多的問題和侷限:算法
Cluster 支持不夠。在擴容、負載均衡、高可用等方面存在明顯不足。數據庫
持久化支持很差,出現問題後恢復的代價大。memcached 徹底不支持持久化,redis 的持久化會形成系統間歇性的負載很高。後端
良好的 cluster 支持服務器
Key 能夠動態分散(Auto Sharding)在不一樣的服務器上,能夠經過動態添加服務器節點增長系統容量。負載均衡
沒有單點失效,任何一個單點都不會形成數據不可訪問。運維
讀寫負載能夠均勻分佈在系統的不一樣節點上。異步
支持異步持久化支持memcached
方便快速恢復,甚至能夠直接用做 key/value 數據庫。 常常在跟業界朋友交流時,會提到用 key 分段的方法來作容量擴展以及負載均衡。可是用靜態的 key 分段會有很多問題:
Cache 系統自己及使用 cache
的客戶端都須要預設一個分段邏輯,這個邏輯後期若是須要調整將會很是困難。不能解決單點失效的問題,還須要額外的手段。運維須要更多的人爲參與,避免 key 超出現有分區,一旦出現 key 找不到對應服務器,訪問直接失敗。
基於這些想法,我花了幾天時間在 google, stack overflow, quora 上看了不少你們關於 cache cluster 的討論,找到一個比較新系統 Couchbase。
mem vs cb memcached VS couchbase
Couchbase 羣集全部點都是對等的,只是在建立羣或者加入集羣時須要指定一個主節點,一旦結點成功加入集羣,全部的結點對等。
對等網的優勢是,集羣中的任何節點失效,集羣對外提供服務徹底不會中斷,只是集羣的容量受影響。 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 把 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 創始團隊成員。