文章大綱
一、演變過程思路圖
二、何為大型網(wǎng)站
三、架構(gòu)體系演進
四、架構(gòu)總結(jié)
五、參考文章
一、演變過程思路圖

二、何為大型網(wǎng)站
1. 大型網(wǎng)站特性
既然說的是大型網(wǎng)站架構(gòu),那么架構(gòu)的背后自然是解決人因面對大型網(wǎng)站特性而帶來的問題。這樣可以先給大家說下大型網(wǎng)站的特性,這些特性帶來的問題就是人要解決的問題:
(1)高并發(fā)、大流量:PV 量巨大;
(2)高可用:7*24 小時不間斷服務(wù);
(3)海量數(shù)據(jù):文件數(shù)目分分鐘 xxTB;
(4)用戶分布廣泛,網(wǎng)絡(luò)情況復(fù)雜:網(wǎng)絡(luò)運營商;
(5)安全環(huán)境惡劣:黑客的攻擊;
(6)需求快速變更,發(fā)布頻繁:快速適應(yīng)市場,滿足用戶需求;
(7)漸進式發(fā)展:慢慢地運營出大型網(wǎng)站;
2. 大型網(wǎng)站架構(gòu)理解
大型網(wǎng)站架構(gòu)的概念對于每一個開發(fā)者來說很籠統(tǒng)、很模糊,正如盲人摸象,看到的、了解到的只是很小的一部分,大部分情況下我們只是負責架構(gòu)中的一小塊內(nèi)容,所以很難清晰地給出具體定義。這就是所謂“不識廬山真面目 只緣身在此山中”的尷尬吧。所以我們要跳出來,站在宏觀的角度,從整體到細節(jié)實現(xiàn)來認識大型網(wǎng)站架構(gòu)。
那么從宏觀的角度怎么去認識大型網(wǎng)站架構(gòu)呢?正如前面幾篇《細品架構(gòu)系列》所描述對架構(gòu)的認識,按照問題識別—>概念認知—>架構(gòu)切分的思路,來分析大型網(wǎng)站架構(gòu)的誕生:
- 問題識別:當前什么問題、誰的問題、問題邊界;
- 概念認知:通過分析問題,會產(chǎn)生哪些概念,統(tǒng)一概念認知,達成溝通交流規(guī)范;
- 架構(gòu)切分:根據(jù)概念來解決問題,如何架構(gòu)切分,產(chǎn)生哪些架構(gòu),提出具體解決方案;
PS:上面的三個步驟具體如何識別、認知、切分,請詳細參考前面幾篇《細品架構(gòu)系列》文章,可能使你會對架構(gòu)有重新的認識。
在進行分析大型網(wǎng)站架構(gòu)的演進之路前,首先我們要明確的兩個價值觀:
- 核心價值:隨網(wǎng)站所需靈活應(yīng)對;大型網(wǎng)站不是從無到有一步就搭建好一個大型網(wǎng)站,而是能夠伴隨小型網(wǎng)站業(yè)務(wù)的漸進發(fā)展,慢慢地演化成一個大型網(wǎng)站;
- 驅(qū)動力量:網(wǎng)站的業(yè)務(wù)發(fā)展— 業(yè)務(wù)成就了技術(shù),事業(yè)成就了人,而不是相反;
還有,大型網(wǎng)站架構(gòu)演進必須避免的幾個誤區(qū):
- 一味追隨大公司的解決方案;
- 為了技術(shù)而技術(shù)-->常見問題;
- 企圖用技術(shù)解決所有問題:技術(shù)是用來解決業(yè)務(wù)問題的,而業(yè)務(wù)的問題,也可以通過業(yè)務(wù)的手段去解決;
三、架構(gòu)體系演進
1. 單機時代
草根時期,快速開發(fā)網(wǎng)站并上線。當然,通常只是先試水,用戶規(guī)模也沒有形成,經(jīng)濟能力和投入也非常有限。應(yīng)用程序、數(shù)據(jù)庫、文件等所有資源都集中在一臺 Server上,典型案例:基于 LAMP 架構(gòu)的 PHP 網(wǎng)站;

優(yōu)點:簡單、快速迭代達成業(yè)務(wù)目標;
缺點:存在單點、談不上高可用;
技術(shù)點:應(yīng)用設(shè)計要保證可擴展;
2. 緩存出場
有一定的業(yè)務(wù)量和用戶規(guī)模了,想提升網(wǎng)站速度,于是,緩存出場了。

優(yōu)點:簡單有效、方便維護;
缺點:存在單點、談不上高可用;
技術(shù)點:客戶端(瀏覽器)緩存、前端頁面緩存、頁面片段緩存、本地數(shù)據(jù)緩存/數(shù)據(jù)庫緩存、遠程緩存;
如上圖,緩存可以分為:
- 頁面緩存:客戶端緩存,減少對網(wǎng)站的訪問;
- 本地緩存:訪問速度快,但數(shù)據(jù)量有限,減少對DB查詢;
- 遠程緩存:遠程訪問,可以集群,因此容量不受限制;
3. 數(shù)據(jù)服務(wù)與應(yīng)用分離
市場反響還不錯,用戶量每天在增長,數(shù)據(jù)庫瘋狂讀寫,逐漸發(fā)現(xiàn)一臺服務(wù)器快撐不住了。于是,決定把數(shù)據(jù)服務(wù)和APP做分離。

優(yōu)點:簡單有效、方便維護、提高不同Server對硬件資源的利用率;
缺點:存在單點、談不上高可用;
技術(shù)點:文件服務(wù)器部署、數(shù)據(jù)庫服務(wù)器,擴展數(shù)據(jù)訪問模塊;
分離后三臺 Server 對硬件資源的需求各不相同:
- 應(yīng)用服務(wù)器:需要更快更強大的 CPU;
- 數(shù)據(jù)庫服務(wù)器:需要更快的硬盤和更大的內(nèi)存;
- 文件服務(wù)器:需要更大的硬盤;
4. 數(shù)據(jù)庫讀寫分離
單臺數(shù)據(jù)庫也感覺快撐不住了,一般都會嘗試做“讀寫分離”。由于大部分互聯(lián)網(wǎng)“讀多寫少”的特性所決定的。Salve的臺數(shù),取決于按業(yè)務(wù)評估的讀寫比例。

優(yōu)點:簡單有效、降低數(shù)據(jù)庫單臺壓力;
缺點:讀寫分離,增加程序難度,架構(gòu)變復(fù)雜,維護難度增加;
技術(shù)點:數(shù)據(jù)庫主從同步部署,擴展數(shù)據(jù)訪問模塊,實現(xiàn)讀寫分離;
5. 應(yīng)用服務(wù)集群
數(shù)據(jù)庫層面是緩解了,但是應(yīng)用程序?qū)用嬉渤霈F(xiàn)了瓶頸,由于訪問量增大,加上早期程序員水平有限寫的代碼也很爛,人員流動性也大,很難去維護和優(yōu)化。所以,很常用的辦法還是“堆機器”。

優(yōu)點:增加服務(wù)器和HA機制,系統(tǒng)性能及可用性得到保證;
缺點:應(yīng)用之間緩存、Session一致性問題;
技術(shù)點:負載均衡;
通過集群解決高并發(fā)、海量數(shù)據(jù)問題的常用手段,實現(xiàn)系統(tǒng)的可伸縮性。通過負載均衡調(diào)度器,可將用戶訪問分發(fā)到集群中的某臺 Server 上,應(yīng)用服務(wù)器的負載壓力不再成為整個網(wǎng)站的瓶頸。
6. 集中式緩存、Session集中存儲
加機器誰都會加,關(guān)鍵是加完之后得有效果,加完之后可能會引發(fā)一些問題。例如非常常見的:集群應(yīng)用之間頁面輸出緩存和本地緩存一致性的問題,Session保存的問題......。

優(yōu)點:應(yīng)用之間緩存、Session一致,存儲無限制,可以擴展;
缺點:不如本地緩存訪問快,緩存服務(wù)器、Session服務(wù)器等仍存在單點問題;
技術(shù)點:緩存服務(wù)器部署、Session集中存儲方案;
7. 動靜分離
動靜分離也是提高網(wǎng)站響應(yīng)速度的一種常用方式。將動態(tài)請求與靜態(tài)請求分離開,盡量減少對應(yīng)用服務(wù)器的壓力。同時,可以再進一步對靜態(tài)請求,進行緩存,以加快響應(yīng)速度??梢孕枰_發(fā)人員配合(把靜態(tài)資源放獨立站點下),也可以不需要開發(fā)人員配合(利用7層反向代理來處理,根據(jù)后綴名等信息來判斷資源類型)。

優(yōu)點:減輕應(yīng)用負載壓力,針對靜態(tài)文件緩存;
缺點:靜態(tài)文件緩存更新失效問題;
技術(shù)點:動靜分離、靜態(tài)文件緩存方案;
8. 反向代理和CDN加速網(wǎng)站響應(yīng)
使用反向代理和CDN加速網(wǎng)站響應(yīng):CDN 和反向代理的基本原理都是緩存,區(qū)別在于:
- CDN部署在網(wǎng)絡(luò)提供商的機房;
- 反向代理則部署在網(wǎng)站的中心機房;
使用 CDN 和反向代理的目的都是盡早返回數(shù)據(jù)給用戶,一方面加快用戶訪問速度,另一方面也減輕后端服務(wù)器的負載壓力。

優(yōu)點:減輕應(yīng)用負載壓力,異地緩存有效解決不同地方用戶訪問過慢的問題;
缺點:成本大幅增加,架構(gòu)進一步復(fù)雜化,也維護難度進一步增大,靜態(tài)文件緩存更新失效問題;
技術(shù)點:CDN、反向代理方案;
9. 使用NoSQL和搜索引擎
到這里,已經(jīng)基本做到了DB層面和應(yīng)用層面的橫向擴展了,可以開始關(guān)注一些其它方面,例如:站內(nèi)搜索的精準度,對DB的依賴,開始引入全文索引、NoSQL。
NoSQL和搜索引擎都是源自互聯(lián)網(wǎng)的技術(shù)手段,對可伸縮的分布式特性具有更好的支持。應(yīng)用服務(wù)器則通過一個統(tǒng)一數(shù)據(jù)訪問模塊訪問各種數(shù)據(jù),減輕應(yīng)用程序管理諸多數(shù)據(jù)源的麻煩。

優(yōu)點:降低DB依賴;
缺點:單點問題,談不上高可用;
技術(shù)點:NoSQL、搜索引擎、分布式;
到目前為止,一個能夠承載日均百萬級訪問量的中型網(wǎng)站架構(gòu)基本介紹完了。
10. 如何保證高可用
在做擴展?jié)M足了基本的性能需求后,我們會逐漸關(guān)注“可用性”(也就是我們通常聽別人吹牛時說的SLA、幾個9)。如何保證真正“高可用”,也是個難題。
對關(guān)鍵應(yīng)用/服務(wù),做集群冗余負載,這也是保證高可用比較常用的手段:
- 文件系統(tǒng)、數(shù)據(jù)庫系統(tǒng)集群;
- 靜態(tài)內(nèi)容服務(wù)器集群;
- CDN服務(wù)器集群;
- 反向代理服務(wù)器集群;
- 負載均衡調(diào)度器集群;
- 分布式NoSQL服務(wù)器集群;
- 搜索引擎服務(wù)器集群;
- 分布式緩存服務(wù)器集群;
- 分布式Session服務(wù)器集群;

優(yōu)點:集群負載,保證高可用;
缺點:數(shù)據(jù)一致性、數(shù)據(jù)有狀態(tài)問題;
技術(shù)點:負載調(diào)度器、集群方案;
截止目前為止,都沒有怎么去改動應(yīng)用程序的架構(gòu),或者說通俗點,都不怎么需要大面積的修改代碼。
如果上面那些手段都用光了,還是支撐不住怎么辦?不停的加機器也不是辦法???
11. 應(yīng)用垂直拆分
隨著業(yè)務(wù)越來越復(fù)雜,網(wǎng)站的功能越來越多,雖然部署層面是采用的集群,但是應(yīng)用程序架構(gòu)層面還是“集中式”的,這樣會導致很多耦合,不便于開發(fā)、維護,而且容易“一榮俱損”。所以,通常會把網(wǎng)站拆分出不同的子站點來單獨宿主。
通過分而治之的手段將整個網(wǎng)站業(yè)務(wù)分成不同的產(chǎn)品線,如首頁、商鋪、訂單、賣家、買家等 拆分成不同的產(chǎn)品線,分歸不同的業(yè)務(wù)團隊負責。各個應(yīng)用之間可以通過建立一個超鏈接建立關(guān)系,也可以通過消息隊列進行數(shù)據(jù)分發(fā)。

優(yōu)點:降低耦合、分壓;
缺點:應(yīng)用架構(gòu)復(fù)雜;
技術(shù)點:業(yè)務(wù)抽取拆分;
12. 業(yè)務(wù)垂直分庫
應(yīng)用都拆了,由于單個數(shù)據(jù)庫的連接,QPS,TPS,I/O處理能力都非常有限,DB層面也可以去做垂直分庫操作。

優(yōu)點:降低DB耦合、分壓DB;
缺點:數(shù)據(jù)訪問模塊復(fù)雜;
技術(shù)點:業(yè)務(wù)抽取拆分;
13. 分布式服務(wù)化
拆分應(yīng)用和DB之后,其實還是會有很多問題。不同的站點,里面可能會有相同邏輯和功能的代碼。當然,對于一些基礎(chǔ)的功能我們可以封裝DLL或者Jar包去到處提供引用,但是這種強依賴也很容易造成一些問題(版本問題、依賴關(guān)系等處理起來非常麻煩)。
既然每一個應(yīng)用系統(tǒng)都需要執(zhí)行許多相通的業(yè)務(wù)操作,比如用戶管理、商品管理等,那么可以將這些共用的業(yè)務(wù)提取出來,獨立部署。這樣,傳說中的SOA的價值就得到體現(xiàn)了。

優(yōu)點:服務(wù)統(tǒng)一管理,提供重用度;
缺點:應(yīng)用架構(gòu)更復(fù)雜;
技術(shù)點:業(yè)務(wù)抽取拆分、服務(wù)化技術(shù)方案;
14. 消息隊列
應(yīng)用、服務(wù)之間還是會出現(xiàn)一些依賴問題,這時候,高吞吐量的解耦利器出現(xiàn)了。

優(yōu)點:提高吞吐量、應(yīng)用、服務(wù)之間解耦;
缺點:存在消息消費延遲問題;
技術(shù)點:消息隊列技術(shù)方案;
15. 分庫分表
最后,再介紹一個大型互聯(lián)網(wǎng)公司都用的絕技--分庫分表。個人經(jīng)驗,不是業(yè)務(wù)發(fā)展和各方面非常迫切,不要輕易走這一步。
因為分庫分表誰都會干,關(guān)鍵是拆完之后怎么辦。目前,市面上還沒有完全開源免費的方案,能讓你一勞永逸地解決數(shù)據(jù)庫拆分問題。
分庫分表:
橫向拆分;
縱向拆分;
分布式數(shù)據(jù)庫訪問層;
數(shù)據(jù)庫中間件(代理);
四、架構(gòu)總結(jié)
上面講述了在網(wǎng)站業(yè)務(wù)發(fā)展的不同階段,會面臨不同的問題,針對不同的問題,會選擇不同的架構(gòu)。大型網(wǎng)站架構(gòu)就是在不同階段時解決不同問題的過程中慢慢演進來的。
最后幾句話,送給有緣的你:
一切以解決業(yè)務(wù)目標為首要任務(wù);
沒有以業(yè)務(wù)為目標的任何架構(gòu)、技術(shù),都是毫無意義的耍流氓;
再牛逼的架構(gòu)、再牛逼的技術(shù),不能夠解決業(yè)務(wù)的問題,你也只能算是會架構(gòu)、會技術(shù)的工匠,而不能算是真正意義上的架構(gòu)師;
業(yè)務(wù)成就了技術(shù),平臺成就了人,事業(yè)成就了人,而不是相反;