最近寫的《假如給我百倍流量》講稿
從三到萬。
這是一次務虛的分享,主要想介紹大型后端系統(tǒng)的架構(gòu)演進方案澎粟,以及后續(xù)的思考活烙。
世間普適的法則。
這個思想很重要气笙,從CPU芯片到硬件到內(nèi)核到協(xié)議到應用潜圃,幾乎涵蓋了所有計算機領(lǐng)域。本圖是緩存領(lǐng)域的多個層級隧出。
Linux 內(nèi)核的層級。
OSI 協(xié)議的層級赏廓。
我們的項目經(jīng)過天使輪,開工了既忆。
用 Python 開擼,大學生的水平苛吱。
項目干得不錯,融了 A 輪援所。用戶量增加后服務器 QPS 壓力增大住拭。除了平攤 IO 壓力瘟檩,另外一個考慮是為了平滑上線卓研。不能每次上線期間服務都不可用是吧寥闪。
一般使用 Nginx疲憋。
負載均衡的基本概念。
繼續(xù)融資 B1 輪,用戶量繼續(xù)增長灰追。緩存也是很基礎的優(yōu)化方案弹澎。
一般使用 Redis。
緩存的一般意義。
繼續(xù)融資 B2 輪音五,業(yè)務增加了 LBS 的功能躺涝,需要用到 PostgreSQL + PostGIS 的能力夯膀。但是基于地理信息的數(shù)據(jù)不適合使用緩存,為了平攤壓力俺猿,引入讀寫分離押袍。
左半邊服務器的 pg 連接沒有畫。
讀寫分離的基本概念圈盔。
項目長足發(fā)展,融了 C1 輪的錢癌佩,用戶量也繼續(xù)上漲。產(chǎn)品設計了很多提交性的功能姚建,為了減輕數(shù)據(jù)庫的寫壓力掸冤,引入了消息隊列,削峰填谷饺藤。
右邊服務器的 MQ 連接沒畫罗丰。
一般使用 Kafka,談談 Kafak 高吞吐的實現(xiàn)方式谜嫉。
繼續(xù)融資 C2 輪哆档,用戶量繼續(xù)上漲澳淑,數(shù)據(jù)庫單機不論是存儲量還是吞吐量都已經(jīng)是瓶頸「苎玻現(xiàn)在開始發(fā)大招:數(shù)據(jù)庫分庫分表。
分庫分表后的架構(gòu)嫩海。
分庫分表后的的概念,記住不要輕易使用奕谭,特別是在項目前期不要過度設計血柳。
繼續(xù)融資 C3 輪,用戶量繼續(xù)上漲±バ冢現(xiàn)有架構(gòu)已經(jīng) hold 不住了满粗。
首先是數(shù)據(jù)庫連接數(shù)吃緊。
無法做資源隔離捅彻,作為一個開發(fā),可能自己的功能沒有問題缭裆,但是數(shù)據(jù)庫被別人拖掛澈驼,服務本身也可能被別人拖掛。
業(yè)務越多氏淑,整體架構(gòu)越復雜假残,微服務帶來的收益越大。
過早引入反而是增加開發(fā)和運維的工作眶俩。
數(shù)據(jù)庫連接數(shù)減少纲岭。
整個身心都清爽了止潮。
如果一個人負責太多微服務,還不如他寫到一個服務里面燃乍。
勝利在前方,但是感覺架構(gòu)又拖了后腿舆瘪。
Google 爸爸已經(jīng)幫你準備好了堤舒。
不管什么語言什么框架寫的應用(Go, Python, Node.js)箕戳,Kubernetes 都可以在任何環(huán)境中安全的啟動它,物理服務器壮虫、虛擬機囚似、云環(huán)境饶唤。
Kubernetes 如果發(fā)現(xiàn)有節(jié)點工作不飽和办素,便會重新分配 pod,幫助我們節(jié)省開銷季二,高效的利用內(nèi)存胯舷、處理器等資源。
如果一個節(jié)點宕機了逃顶,Kubernetes 會自動重新創(chuàng)建之前運行在此節(jié)點上的 pod以政,在其他節(jié)點上運行盈蛮。
網(wǎng)絡、負載均衡袒炉、復制等特性,對于 Kubernetes 都是開箱即用的十性。
pod 是無狀態(tài)運行的劲适,任何時候有 pod 宕了霞势,立馬會有其他 pod 接替它的工作草雕,用戶完全感覺不到墩虹。
如果用戶量突然暴增,現(xiàn)有的 pod 規(guī)模不足了菌湃,那么會自動創(chuàng)建出一批新的 pod惧所,以適應當前的需求下愈。
反之亦然,當負載降下來的時候叫编,Kubernetes 也會自動縮減 pod 的數(shù)量。
利用鏡像杯拐,從開發(fā)到調(diào)試到上線一條龍,酸爽顶滩。
Kubernetes 如此流行的一個重要原因是:應用會一直順利運行盐欺,不會被 pod 或 節(jié)點的故障所中斷冗美。
如果出現(xiàn)故障,Kubernetes 會創(chuàng)建必要數(shù)量的應用鏡像属韧,并分配到健康的 pod 或節(jié)點中挫剑,直到系統(tǒng)恢復。
完善后的架構(gòu)哲戚。
如果繼續(xù)發(fā)展呢?
上面一排是指導思想,下面一排是具體方案秒裕。
計算機領(lǐng)域很重要的思想几蜻。
也是很重要的思想。
如果僅用一句話來形容高并發(fā)、高可用蹬敲?副本足以。
IO 復用是節(jié)約進程這個資源,讓單個進程可以監(jiān)聽多個 fd食店。
也就是說不要無端提高系統(tǒng)復雜度。
展開分析自娩。
單元化的實現(xiàn)。針對流水型數(shù)據(jù)姊扔,在本單元就消化完成了恰梢。
把分流的動作提前到網(wǎng)關(guān)處。
針對共享型數(shù)據(jù)摧茴,則涉及到跨地區(qū)的訪問尘分。比如三地五中心這種經(jīng)典架構(gòu)培愁。
異地災備的基礎是谍咆,其他地區(qū)的數(shù)據(jù)也要進行冗余存儲摹察。
服務治理的進化方向黄娘,此處無法展開逼争。
除了 MySQL 和 PostgreqSQL 我們還有啥。
跨領(lǐng)域的結(jié)合。
期待量子計算機稿壁。