運維派 你有自己的Web快取知識體系嗎?

2021-07-14 13:53:25 字數 3502 閱讀 6056

趙舜東:江湖人稱趙班長,曾在武警某部負責指揮自動化的架構和運維工作,2023年退役後一直從事網際網路運維工作。曾帶團隊負責國內某電商的運維工作,《saltstack入門與實踐》作者,某學院高階講師。學技術一定要成體系,這是我個人的學習目標,也就是在乙個特定的範圍內,把與此相關的技術都盡量的搞清楚、搞明白。

我把與web快取相關的內容從我編寫的《web運維知識體系》(鏈結1)中拿了出來,進行完善後,形成了乙個單獨的《web快取知識體系》(鏈結2),分享給大家,僅供參考。

備註:

鏈結1 : 

鏈結 2 : 

在web架構中,我們經常會聽到分級或者分層這個詞,這就是架構中比較重要的乙個理念:分層設計(分級設計)。

那麼對於乙個web站點來說,從乙個http請求產生到伺服器返回資料,會經過非常多不同層次的快取,我整理了乙個「相對」完善的web快取分層體系。

本體系從全域性七個層面列舉了各個層面涉及到的快取技術和方法,此體系結構僅包含讀快取(cache),不包含寫緩衝(buffer),所以很多緩衝區沒有列舉,請見諒。

我們先來說說cache(快取),這個是我們最容易理解的。cache是為了提高資料的讀取速度。

比如我們把經常用的資料從遠處讀取到乙個離自己最近最快的快取區後,這樣再次使用這個資料,就可以直接從離自己最近最快的這個快取區讀取,這顯然提高了效能。

這裡我們拿cpu來舉例說明,作為運維工程師我相信大家都知道cpu讀取檔案是要從記憶體來讀取的,而且cpu的速度是遠遠高於記憶體的,那麼如果每次cpu都從記憶體來讀取顯然是比較慢的。

於是cpu現在增加了快取,一般伺服器的cpu都支援**快取:

l1 cache

l2 cache

l3 cache

cpu cache是位於cpu與記憶體之間的臨時儲存器,它的容量比記憶體小的多但是交換速度卻比記憶體要快得多,cpu cache中儲存著cpu剛用過或迴圈使用的一部分資料。

當cpu再次使用該部分資料時可從cache中直接呼叫,而不用去讀取記憶體,這樣就減少了cpu的等待時間,提高了系統的效率。

所以我們在實際的運維的一些場景中(例如kvm調優)也會使用taskset命令來將程序繫結到乙個固定的cpu上,其實就是為了降低cpu的cache miss,從而提高效能。

我們理解了cache,再來說說buffer。目前buffer和cache之間是爭議還是比較多的,主要是概念上。我準備拿生活中的乙個例子來解釋buffer。

目前在中國,汽車的普及率很高,很多的朋友都有駕照,所以對於交規應該都很熟悉。我們先放下技術來做乙個交規考試:

看下面這個圖,請回答下圖中白色虛線的區域叫做什麼?

左轉彎待轉區

答案:這個白色的區域叫做左轉彎待轉區,我們先放下技術,來複習一下交規,保證大家上路行駛的安全性。

左轉彎的車道增加了數公尺長的白色虛線框,直接連線到了馬路中間。

這些白色虛框線就是設定的「左轉彎待轉區」,供同向直行道綠燈亮起時,左轉彎車道的車輛越過停止線,提前進入這個區域等待轉彎,等到左轉彎訊號燈變成綠色時再通過路口。

左轉彎待轉區的作用

此舉將有效地提高路口機動車通過量,減少車輛滯留,也就是讓車輛更快的轉彎。從圖中我們可以看到這個待轉區是乙個彎曲的,離轉彎的目的地更近。

這個左轉彎待轉區其實就是我們要討論的buffer(緩衝區)的乙個生活例子。

這個待轉區這就是乙個緩衝區,這個緩衝區可以讓我們把車輛停到離目的地更近的乙個地方。就像我們把資料寫到乙個離目的更近的地方一樣。

什麼是buffer?

buffer:緩衝區,乙個用於儲存速度不同步的裝置或優先順序不同的裝置之間傳輸資料的區域。

這次我們拿記憶體和磁碟來舉例,剛才我們說了cpu速度比記憶體的速度要快很多,那麼拿記憶體和硬碟相比呢?

記憶體的速度要比硬碟的速度快非常多。但是我們知道記憶體是易失性的儲存,我們持久化的資料最終要儲存到硬碟上。

但是硬碟又那麼的慢,cpu要是等待資料完全寫到硬碟上,那顯然是不現實的。

所以就拿我們的linux系統來說,會在記憶體設定乙個緩衝區叫做「磁碟緩衝區」,更準確點稱之為「記憶體的磁碟緩衝區」。

cpu把資料寫入到「記憶體的磁碟緩衝區」之後就認為自己寫完,然後轉去做別的事情,而不用等資料最終寫到硬碟。

然後linux有乙個核心執行緒叫做pdflush,用來把快取區的「相關」資料寫入到磁碟。這顯然提公升了cpu處理的速度。當然這其中還有很多的奧秘,有興趣的朋友可以深入研究。

你真的明白了嗎?

回顧起我曾經對於buffer和cache的探索經歷,大家讀到這裡,肯定心中還有很多疑惑,那麼記憶體到底是cache還是buffer呢?

答案:又是cache又是buffer,因為它確實同時擔任著兩個角色的功能,所以我們經常把這些即擔任的cache角色又擔任buffer角色的稱之為:buffer cache。

當然也有別的稱謂,我們不要太糾結,最簡單的是我們能夠按照他們的作用來區分。

好的,以後別人再問你什麼是buffer?什麼是cache的時候,你可以自信的回答:

首先cache和buffer解決的都是速度不一致有關的問題,他們都有一塊儲存區域。

但是:

注意:在很多時候我們把buffer和cache的名字混著用。也有統一叫做cache的。

我們這次主要是關注在web架構中,各個層級的cache,即便有些層級不僅僅是cache的功能還有buffer的功能。那麼既然使用cache,我們就需要關注cache幾個特別重要的指標。

3.1 cache存放位置

對於我們web架構中的快取存放可以分為三種位置:

很明顯儲存在使用者瀏覽器中的速度最快,其次是web伺服器的記憶體中,最後是硬碟中。

記憶體快,但是畢竟**貴、空間有限,所以我們也可以通過網路將資料寫入到其它伺服器的記憶體中,例如memcached和redis。

硬碟慢,但是**低、空間相對充足。所以在設計快取的時候經常會遇到分級設定,就像cpu的**快取。同時我們也可以將資料通過網路寫入到其它伺服器的硬碟中,例如nfs。

cache既然是乙個區域,那麼這個區域的儲存空間肯定是有限的,所有的快取肯定有乙個過期時間,不能一直存放。

在不同的層次,可以使用不同的方法設定快取的過期時間

既然cache有過期時間,那麼在沒有到達過期時間,我們又想讓cache馬上過期,怎麼辦?

這個也是我們在使用和設計cache的時候需要關注的問題,如何在源資料發生變化以後,讓快取強制過期。

快取最重要的指標就是命中率了!也就是每次快取查詢的時候是否能在快取區域,找到已經被快取的內容。

cache的命中率越高,效果越好!

我們可以想象如果加入了cache層,命中率很低,先不說我們要在管理cache增加的工作量,資料讀寫路徑多了一層,理論上就會影響效能。

所以說乙個完全沒有命中率的快取除了「極特殊」的需求外是不應該存在的。

最後,留下乙個快取相關的面試題:我們日常手機上使用的雲服務,例如雲通訊錄、雲簡訊、雲(也就是可以同步你的通訊錄、簡訊和到雲上)需要使用cdn嗎?

在此,感謝高效運維社群給我們提供了乙個學習和交流的平台。

web快取知識體系

關於運維你應該掌握並知道的

運維是什麼?需要對做的是互聯的運營維護和網路對接 1 應該熟悉各種常用的文字處理命令,例如sort tr cut,paste,uniq,tee等等。3 其中最重要之一的就是資料備份了吧,因為學校之前暖氣漏水,我曉得核心交換機壞了,所以老師給我們講解了關於資料備份的重要性 所以,關於資料,最好一月備份...

面試中如何介紹自己做過的運維專案

如果你是一位有運維工作經驗的職場人士,當你去面試的時候,面試官會很自然地問到你曾做過什麼專案,讓你詳細描述一下工作中曾處理過的乙個故障?這個看似很簡單,但是很多應聘者卻回答的不好,沒能在應答中展現自己的能力和水平。究其原因無外乎兩點 一 比較緊張,不能很好的表達自己和闡述專案。二 平時工作中不注重總...

面試中如何介紹自己做過的運維專案

如果你是一位有運維工作經驗的職場人士,當你去面試的時候,面試官會很自然地問到你曾做過什麼專案,讓你詳細描述一下工作中曾處理過的乙個故障?這個看似很簡單,但是很多應聘者卻回答的不好,沒能在應答中展現自己的能力和水平。究其原因無外乎兩點 一 比較緊張,不能很好的表達自己和闡述專案。二 平時工作中不注重總...