天天看點

高性能緩存架構——緩存資料庫原理和關鍵設計點

作者:IT民工馮老師

最近學習了李運華老師在極客時間的《從0開始學架構》文章,為了了解深刻便于複習思考整理了思維導圖筆記,大家可以參考學習。

對于前面幾篇文章中的思維導圖原圖,有需要的同學可以關注後發私信,我會把原圖發給你們。

後續其他章節的思維導圖也會陸續更新。歡迎大家關注、收藏!

前言

雖然我們可以通過各種手段來提升存儲系統的性能,但在某些複雜的業務場景下,單純依靠存儲系統的性能提升不夠的,典型的場景有:

  • 需要經過複雜運算後得出的資料,存儲系統無能為力
  • 讀多寫少的資料,存儲系統有心無力

緩存資料庫

緩存就是為了彌補存儲系統在這些複雜業務場景下的不足,其基本原理是将可能重複使用的資料放到記憶體中,一次生成、多次使用,避免每次使用都去通路存儲系統。

緩存能夠帶來性能的大幅提升,以 Memcache 為例,單台 Memcache 伺服器簡單的 key-value 查詢能夠達到 TPS 50000 以上,其基本的架構是:

高性能緩存架構——緩存資料庫原理和關鍵設計點

圖檔來自網絡

緩存雖然能夠大大減輕存儲系統的壓力,但同時也給架構引入了更多複雜性。架構設計時如果沒有針對緩存的複雜性進行處理,某些場景下甚至會導緻整個系統崩潰。

緩存穿透

緩存穿透是指緩存沒有發揮作用,業務系統雖然去緩存查詢資料,但緩存中沒有資料,業務系統需要再次去存儲系統查詢資料。

高性能緩存架構——緩存資料庫原理和關鍵設計點

緩存雪崩

緩存雪崩是指當緩存失效(過期)後引起系統性能急劇下降的情況。當緩存過期被清除後,業務系統需要重新生成緩存,是以需要再次通路存儲系統,再次進行運算,這個處理步驟耗時幾十毫秒甚至上百毫秒。而對于一個高并發的業務系統來說,幾百毫秒内可能會接到幾百上千個請求。由于舊的緩存已經被清除,新的緩存還未生成,并且處理這些請求的線程都不知道另外有一個線程正在生成緩存,是以所有的請求都會去重新生成緩存,都會去通路存儲系統,進而對存儲系統造成巨大的性能壓力。這些壓力又會拖慢整個系統,嚴重的會造成資料庫當機,進而形成一系列連鎖反應,造成整個系統崩潰。

高性能緩存架構——緩存資料庫原理和關鍵設計點

緩存熱點

雖然緩存系統本身的性能比較高,但對于一些特别熱點的資料,如果大部分甚至所有的業務請求都命中同一份緩存資料,則這份資料所在的緩存伺服器的壓力也很大。例如,某明星微網誌釋出宣告戀愛了,短時間内上千萬的使用者都會來圍觀。

高性能緩存架構——緩存資料庫原理和關鍵設計點

實作方式

由于緩存的各種通路政策和存儲的通路政策是相關的,是以上面的各種緩存設計方案通常情況下都是內建在存儲通路方案中,可以采用“程式代碼實作”的中間層方式,也可以采用獨立的中間件來實作。

思考

Q:資料庫自身不是有緩存嗎?為什麼要再使用緩存程式呢?

A:以mysql為例

1. mysql第一種緩存叫sql語句結果緩存,但條件比較苛刻,程式員不可控

2. mysql第二種緩存是innodb buffer pool,緩存的是磁盤上的分頁資料,不是sql的查詢結果,sql的執行過程省不了。而mc,redis這些實際上都是緩存sql的結果,兩種緩存方式,性能差很遠。

是以,可控性,性能是資料庫緩存和獨立緩存的主要差別。