paulwong

          Couchbase介紹,更好的Cache系統(tǒng)

          在移動(dòng)互聯(lián)網(wǎng)時(shí)代,我們面對(duì)的是更多的客戶端,更低的請(qǐng)求延遲,這當(dāng)然需要對(duì)數(shù)據(jù)做大量的 Cache 以提高讀寫速度。

          術(shù)語(yǔ)

          • 節(jié)點(diǎn):指集群里的一臺(tái)服務(wù)器。

          現(xiàn)有 Cache 系統(tǒng)的特點(diǎn)

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

          • Cluster 支持不夠。在擴(kuò)容、負(fù)載均衡、高可用等方面存在明顯不足。
          • 持久化支持不好,出現(xiàn)問題后恢復(fù)的代價(jià)大。memcached 完全不支持持久化,redis 的持久化會(huì)造成系統(tǒng)間歇性的負(fù)載很高。

          我期待的理想 Cache 系統(tǒng)

          良好的 cluster 支持

          • Key 可以動(dòng)態(tài)分散(Auto Sharding)在不同的服務(wù)器上,可以通過(guò)動(dòng)態(tài)添加服務(wù)器節(jié)點(diǎn)增加系統(tǒng)容量。
          • 沒有單點(diǎn)失效,任何一個(gè)單點(diǎn)都不會(huì)造成數(shù)據(jù)不可訪問。
          • 讀寫負(fù)載可以均勻分布在系統(tǒng)的不同節(jié)點(diǎn)上。

          支持異步持久化支持

          • 方便快速恢復(fù),甚至可以直接用作 key/value 數(shù)據(jù)庫(kù)。 經(jīng)常在跟業(yè)界朋友交流時(shí),會(huì)提到用 key 分段的方法來(lái)做容量擴(kuò)展以及負(fù)載均衡。但是用靜態(tài)的 key 分段會(huì)有不少問題:
          • Cache 系統(tǒng)本身及使用 cache 的客戶端都需要預(yù)設(shè)一個(gè)分段邏輯,這個(gè)邏輯后期如果需要調(diào)整將會(huì)非常困難。不能解決單點(diǎn)失效的問題,還需要額外的手段。運(yùn)維需要更多的人為參與,避免 key 超出現(xiàn)有分區(qū),一旦出現(xiàn) key 找不到對(duì)應(yīng)服務(wù)器,訪問直接失敗。

          最接近需求的系統(tǒng):Couchbase

          基于這些想法,我花了幾天時(shí)間在 google, stack overflow, quora 上看了很多大家關(guān)于 cache cluster 的討論,找到一個(gè)比較新系統(tǒng) Couchbase。

          mem vs cbmemcached VS couchbase

          Couchbase 的集群設(shè)計(jì)對(duì)等網(wǎng)

          Couchbase 群集所有點(diǎn)都是對(duì)等的,只是在創(chuàng)建群或者加入集群時(shí)需要指定一個(gè)主節(jié)點(diǎn),一旦結(jié)點(diǎn)成功加入集群,所有的結(jié)點(diǎn)對(duì)等。

          high_level_architecture

          圖片來(lái)源:couchbase.com

          對(duì)等網(wǎng)的優(yōu)點(diǎn)是,集群中的任何節(jié)點(diǎn)失效,集群對(duì)外提供服務(wù)完全不會(huì)中斷,只是集群的容量受影響。 Smart Client

          由于 couchbase 是對(duì)等網(wǎng)集群,所有的節(jié)點(diǎn)都可以同時(shí)對(duì)客戶端提供服務(wù),這就需要有方法把集群的節(jié)點(diǎn)信息暴露給客戶端,couchbase 提供了一套機(jī)制,客戶端可以獲取所有節(jié)點(diǎn)的狀態(tài)以及節(jié)點(diǎn)的變動(dòng),由客戶端根據(jù)集群的當(dāng)前狀態(tài)計(jì)算 key 所在的位置。 vBucket

          vBucket 概念的引入,是 couchbase 實(shí)現(xiàn) auto sharding,在線動(dòng)態(tài)增減節(jié)點(diǎn)的重要基礎(chǔ)。

          簡(jiǎn)單的解釋 vBucket 可以從靜態(tài)分片開始說(shuō)起,靜態(tài)分片的做法一般是用 key 算出一個(gè) hash,得到對(duì)應(yīng)的服務(wù)器,這個(gè)算法很簡(jiǎn)單,也容易理解。如以下代碼所示:

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

          但也有幾個(gè)問題:

          • 如果一臺(tái)服務(wù)器失效,會(huì)造成該分片的所有 key 失效。
          • 如果服務(wù)器容量不同,管理非常麻煩。
          • 前面提到過(guò),運(yùn)維、配置非常不方便。

          為了把 key 跟服務(wù)器解耦合,couchbase 引入了 vBucket。可以說(shuō) vBucket 代表一個(gè) cache 子集,主要特點(diǎn):

          • key hash 對(duì)應(yīng)一個(gè) vBucket,不再直接對(duì)應(yīng)服務(wù)器。
          • 集群維護(hù)一個(gè)全局的 vBucket 與服務(wù)器對(duì)應(yīng)表。
          • 前面提到的 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

          圖片來(lái)源:http://dustin.sallings.org/2010/06/29/memcached-vbuckets.html

          由于 vBucket 把 key 跟服務(wù)器的靜態(tài)對(duì)應(yīng)關(guān)系解耦合,基于 vBucket 可以實(shí)現(xiàn)一些非常強(qiáng)大有趣的功能,例如:

          • Replica,以 vBucket 為單位的主從備份。如果某個(gè)節(jié)點(diǎn)失效,只需要更新 vBucket 映射表,馬上啟用備份數(shù)據(jù)。
          • 動(dòng)態(tài)擴(kuò)容。新增加一個(gè)節(jié)點(diǎn)后,可以把部分 vBucket 轉(zhuǎn)移到新節(jié)點(diǎn)上,并更新 vBucket 映射表。

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

          總結(jié)

          • Couchbase 的對(duì)等網(wǎng)設(shè)計(jì),smart client 直接獲取整的集群的信息,在客戶端實(shí)現(xiàn)負(fù)載均衡,整個(gè)集群沒有單點(diǎn)失效,并且完全支持平行擴(kuò)展。
          • vBucket 的引入,完全實(shí)現(xiàn)了 auto sharding,可以方便靈活的把數(shù)據(jù)的子集在不同節(jié)點(diǎn)上移動(dòng),以實(shí)現(xiàn)集群動(dòng)態(tài)管理。
          • Couchbase 有一個(gè)非常專業(yè)的 web 管理界面,并且支持通過(guò) RESTful API 管理,這也是 memcached, redis 不能企及的。
          • 如果只是做 key/value 的 cache,Couchbase 可以完全取代 memcached。
          • Couchbase 已經(jīng)被我們?cè)谏a(chǎn)環(huán)境中大量采用。

          posted on 2016-05-04 15:00 paulwong 閱讀(582) 評(píng)論(0)  編輯  收藏 所屬分類: COUCHBASE


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 游戏| 涿鹿县| 乌兰察布市| 蕲春县| 梁河县| 阿图什市| 芦山县| 黎城县| 文登市| 连云港市| 饶平县| 湖州市| 黄骅市| 廉江市| 靖边县| 西安市| 罗田县| 元氏县| 长岭县| 河津市| 娱乐| 合作市| 黔南| 盐池县| 简阳市| 南昌市| 伊宁市| 泰顺县| 都匀市| 五原县| 澄迈县| 勃利县| 岳阳市| 张家港市| 吐鲁番市| 桂阳县| 龙州县| 富蕴县| 岫岩| 西城区| 鄂伦春自治旗|