如何構(gòu)建一個(gè)大型后端系統(tǒng)

最近寫的《假如給我百倍流量》講稿

image

從三到萬。


image

這是一次務(wù)虛的分享,主要想介紹大型后端系統(tǒng)的架構(gòu)演進(jìn)方案,以及后續(xù)的思考。


image

世間普適的法則。


image

這個(gè)思想很重要,從CPU芯片到硬件到內(nèi)核到協(xié)議到應(yīng)用,幾乎涵蓋了所有計(jì)算機(jī)領(lǐng)域。本圖是緩存領(lǐng)域的多個(gè)層級(jí)。


image

Linux 內(nèi)核的層級(jí)。


image

OSI 協(xié)議的層級(jí)。


image

我們的項(xiàng)目經(jīng)過天使輪,開工了。


image

用 Python 開擼,大學(xué)生的水平。


image

項(xiàng)目干得不錯(cuò),融了 A 輪。用戶量增加后服務(wù)器 QPS 壓力增大。除了平攤 IO 壓力,另外一個(gè)考慮是為了平滑上線。不能每次上線期間服務(wù)都不可用是吧。


image

一般使用 Nginx。


image

負(fù)載均衡的基本概念。


image

繼續(xù)融資 B1 輪,用戶量繼續(xù)增長(zhǎng)。緩存也是很基礎(chǔ)的優(yōu)化方案。


image

一般使用 Redis。


image

緩存的一般意義。


image

繼續(xù)融資 B2 輪,業(yè)務(wù)增加了 LBS 的功能,需要用到 PostgreSQL + PostGIS 的能力。但是基于地理信息的數(shù)據(jù)不適合使用緩存,為了平攤壓力,引入讀寫分離。


image

左半邊服務(wù)器的 pg 連接沒有畫。


image

讀寫分離的基本概念。


image

項(xiàng)目長(zhǎng)足發(fā)展,融了 C1 輪的錢,用戶量也繼續(xù)上漲。產(chǎn)品設(shè)計(jì)了很多提交性的功能,為了減輕數(shù)據(jù)庫的寫壓力,引入了消息隊(duì)列,削峰填谷。


image

右邊服務(wù)器的 MQ 連接沒畫。


image

一般使用 Kafka,談?wù)?Kafak 高吞吐的實(shí)現(xiàn)方式。


image

繼續(xù)融資 C2 輪,用戶量繼續(xù)上漲,數(shù)據(jù)庫單機(jī)不論是存儲(chǔ)量還是吞吐量都已經(jīng)是瓶頸?,F(xiàn)在開始發(fā)大招:數(shù)據(jù)庫分庫分表。


image

分庫分表后的架構(gòu)。


image

分庫分表后的的概念,記住不要輕易使用,特別是在項(xiàng)目前期不要過度設(shè)計(jì)。


image

繼續(xù)融資 C3 輪,用戶量繼續(xù)上漲?,F(xiàn)有架構(gòu)已經(jīng) hold 不住了。


image

首先是數(shù)據(jù)庫連接數(shù)吃緊。


image

無法做資源隔離,作為一個(gè)開發(fā),可能自己的功能沒有問題,但是數(shù)據(jù)庫被別人拖掛,服務(wù)本身也可能被別人拖掛。


image

業(yè)務(wù)越多,整體架構(gòu)越復(fù)雜,微服務(wù)帶來的收益越大。
過早引入反而是增加開發(fā)和運(yùn)維的工作。


image

數(shù)據(jù)庫連接數(shù)減少。


image

整個(gè)身心都清爽了。


image

如果一個(gè)人負(fù)責(zé)太多微服務(wù),還不如他寫到一個(gè)服務(wù)里面。


image

勝利在前方,但是感覺架構(gòu)又拖了后腿。


image

Google 爸爸已經(jīng)幫你準(zhǔn)備好了。


image

不管什么語言什么框架寫的應(yīng)用(Go, Python, Node.js),Kubernetes 都可以在任何環(huán)境中安全的啟動(dòng)它,物理服務(wù)器、虛擬機(jī)、云環(huán)境。


image

Kubernetes 如果發(fā)現(xiàn)有節(jié)點(diǎn)工作不飽和,便會(huì)重新分配 pod,幫助我們節(jié)省開銷,高效的利用內(nèi)存、處理器等資源。

如果一個(gè)節(jié)點(diǎn)宕機(jī)了,Kubernetes 會(huì)自動(dòng)重新創(chuàng)建之前運(yùn)行在此節(jié)點(diǎn)上的 pod,在其他節(jié)點(diǎn)上運(yùn)行。


image

網(wǎng)絡(luò)、負(fù)載均衡、復(fù)制等特性,對(duì)于 Kubernetes 都是開箱即用的。

pod 是無狀態(tài)運(yùn)行的,任何時(shí)候有 pod 宕了,立馬會(huì)有其他 pod 接替它的工作,用戶完全感覺不到。

如果用戶量突然暴增,現(xiàn)有的 pod 規(guī)模不足了,那么會(huì)自動(dòng)創(chuàng)建出一批新的 pod,以適應(yīng)當(dāng)前的需求。

反之亦然,當(dāng)負(fù)載降下來的時(shí)候,Kubernetes 也會(huì)自動(dòng)縮減 pod 的數(shù)量。


image

利用鏡像,從開發(fā)到調(diào)試到上線一條龍,酸爽。


image

Kubernetes 如此流行的一個(gè)重要原因是:應(yīng)用會(huì)一直順利運(yùn)行,不會(huì)被 pod 或 節(jié)點(diǎn)的故障所中斷。

如果出現(xiàn)故障,Kubernetes 會(huì)創(chuàng)建必要數(shù)量的應(yīng)用鏡像,并分配到健康的 pod 或節(jié)點(diǎn)中,直到系統(tǒng)恢復(fù)。


image

完善后的架構(gòu)。


image

如果繼續(xù)發(fā)展呢?


image

上面一排是指導(dǎo)思想,下面一排是具體方案。


image

計(jì)算機(jī)領(lǐng)域很重要的思想。


image

也是很重要的思想。


image

如果僅用一句話來形容高并發(fā)、高可用?副本足以。


image

IO 復(fù)用是節(jié)約進(jìn)程這個(gè)資源,讓單個(gè)進(jìn)程可以監(jiān)聽多個(gè) fd。


image

也就是說不要無端提高系統(tǒng)復(fù)雜度。


image

展開分析。


image

單元化的實(shí)現(xiàn)。針對(duì)流水型數(shù)據(jù),在本單元就消化完成了。
把分流的動(dòng)作提前到網(wǎng)關(guān)處。


image

針對(duì)共享型數(shù)據(jù),則涉及到跨地區(qū)的訪問。比如三地五中心這種經(jīng)典架構(gòu)。


image

異地災(zāi)備的基礎(chǔ)是,其他地區(qū)的數(shù)據(jù)也要進(jìn)行冗余存儲(chǔ)。


image

服務(wù)治理的進(jìn)化方向,此處無法展開。


image

除了 MySQL 和 PostgreqSQL 我們還有啥。


image

跨領(lǐng)域的結(jié)合。


image

期待量子計(jì)算機(jī)。


image

原文載于假如給我百倍流量

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容