構建高可用的緩存集羣的開源解決方案

不少應用都經過使用緩存來避免全部的請求都查詢數據庫,以加快系統的響應速度,Memcached是經常使用的緩存服務器(如今比較流行的還有Redis),它一個高性能的分佈式內存對象緩存系統,旨在經過緩存數據庫查詢結果,減小數據庫的訪問次數。可是在運行多個Memcached服務器時,每每還須要考慮其它的問題,好比緩存一致性、緩存失效等,緩存一致性是指要保證多個Memcached服務器中數據的一致,緩存失效的後果相對來講比較嚴重,當在大併發訪問的場景下,若是Memcached緩存失效,全部請求會在同一瞬間併發訪問數據庫,可能會致使數據庫宕機。爲了保證緩存系統的穩定和高可用,不少公司都研發了相應的系統。本文彙總了Twitter、Facebook、Youtube在緩存方面的解決方案,供讀者參考。git

  1. Twitter的Redis/Memcached代理服務:Twemproxy
    Twemproxy是一個使用C語言編寫的Redis 和 Memcache 代理服務器,經過引入一個代理層,將應用程序後端的多臺Redis或Memcached實例進行統一管理,使應用程序只須要在Twemproxy上進行操做,而不用關心後面具體有多少個真實的Redis或Memcached實例。當某個節點宕掉時,Twemproxy能夠自動將它從集羣中剔除,而當它恢復服務時,Twemproxy也會自動鏈接。因爲是代理,因此Twemproxy會有微小的性能損失。github

  2. Facebook的Memcached協議路由器:McRouter
    McRouter是一個使用C++(主要語言,使用了大量的C++ 11特性)開發的基於Memcached協議的路由器,它是Facebook和Instagram緩存架構的核心組件,在高峯時期能夠處理近50億請求。McRouter中客戶端能夠共享鏈接池,這樣能減小鏈接的數量。McRouter能夠根據key前綴把客戶端分配到不一樣的Memcached池中,容許以主機、池或者集羣爲單位設置任何請求的速率的閥值,同時也支持限制請求的速度以減緩請求的發送速度,以保障服務質量。redis

  3. Youtube的Mysql中間件:Vitess
    緩存層存在的初衷是減小應用與數據庫的交互,以提升響應時間,與其將緩存與數據庫分離,不如直接將緩存嵌入數據庫中。Vitess是Youtube的開源分佈式MySQL工具集,主要使用Go語言編寫,已經用於Youtube生產環境。Vitess支持行級緩存,並與Memcached進行了集成,能夠有效提升帶主鍵查詢的速率,查詢只有在Memcached中查詢不到時纔會進入數據庫查詢,而當數據被修改或者數據庫表結構發生變化時,緩存數據會被刪除。sql

另外,還有一些未開源的解決方案,好比Box的Tron。同時,InfoQ也很是關注國內相關問題的解決方案,歡迎讀者在評論中留言與我探討。數據庫

相關文章
相關標籤/搜索