1. 程式人生 > >那些年,我使用過的輪子(二)--memcached+couchbased

那些年,我使用過的輪子(二)--memcached+couchbased

背景

    memcached 出現的比較早了,支援的資料型別比較簡單,而且沒有持久化,在絕大多數的應用場景中都作為快取來使用,加上根據一致性Hash擴充套件成分散式的快取叢集也是網際網路中常用的方案設計。couchbase 文件較少,國內用的公司應該不多, 它作為一種NoSQL的資料庫,支援memcached協議,支援JSON的文件格式和索引,加上其天生的Auto-Sharding和P2P特性,在分散式領域中有著更為靈活的應用場景,之所以把這兩個放一塊說,主要是工作中的用途差不多,它們之間的差別還是很大的。

業務場景

  動態網頁快取

    網頁快取是提升網站訪問效能常用的手段之一,特別是動態網頁快取;比如網頁的內容和傳入的引數有關係,網頁的內容經常會發生變化等,在這種場景下,可以提升網站的訪問體驗,特別是在高峰期間的時候,可以分散後端伺服器的壓力。常用的方案是前端的nginx伺服器利用memcached_module進行擴充套件,提取頁面訪問請求的URI,引數等,組成memcached_key,然後去memcached去獲取,如果獲取成功,直接將渲染好的網頁內容或者資料返回給前端,如果cache裡面沒有,會重定向到後端伺服器進行處理。每臺nginx會指向local或者遠端的一臺memcached例項作為儲存伺服器。至於cache miss之後,可以在Filter層面統一對返回的資料進行攔截處理和寫入到memcached。
    從前端nginx配置memcached,到cache miss之後後端服務的資料再生產,到資料生產之後回寫memcached流程較長,也相對比較複雜,容易踩到比較多的坑,在每一步處理都有較多的細節需要處理和測試,不然達不到設計或者預期的效果;比如memcached的監控, nginx到memcached的連接回收,cache miss之後後端服務的操作流程,寫入資料的大小和是否壓縮等

  通用資料快取

    目前公司的基礎快取是基於couchbase搭建的,文章裡面關於couchbase的介紹比較齊全,就不重複了。couchbase以叢集方式執行,分為持久化和非持久化兩種,按應用分vBucket,持久化的方式效能較低,用的不多,這裡主要說非持久化。 應用的資料型別分兩種,k-v型別和json型別,k-v和memcached類似,可以相容memcached相關的操作,json格式的話,類似mongo了,支援按照欄位的索引,修改和查詢。
    由於是基礎快取,封裝的couchbase的dao較為完善,貌似沒有批量操作的介面支援,以及對原子操作的支援也不太好,不過擴容和監控相對方便,能省不少事。

一些教訓

    1. memcached 相對來說比較脆弱,supervisor之類的服務監控和拉起是非常有必要的,在cache miss的時候,後端服務對memcached的讀寫需要再控制一下,之前服務高峰期, memcached經常出現例項程序沒有或者不響應,在定位到問題前,保證它能快速響應很重要。     2. memcached和nginx的連接回收和超時也要注意觀察下,一不小心,系統的time wait就上來了。     3. memcached和couchbase的key, value會有限制,根據資料大小和應用場景選擇是否壓縮。
    4. couchbase的client會維護一個消費者和生產者的佇列,佇列內部積累的請求過多會拋異常,和請求數和批量取的key數量有關係, 需要通過上層限流來避免佇列溢位     5. 需要提前考慮快取批量丟失(節點損壞)帶來的影響以及預案,墨菲定律牢記心頭。