1.0 版本 hello world
1.0 版本最簡單的網(wǎng)站,瀏覽客戶端以及移動端,通過DNS解析域名,然后訪問網(wǎng)站。網(wǎng)站可以通過JAVA web構(gòu)建,部署到Tomcat里面啟動,后端就是一個單點的MySQL 數(shù)據(jù)庫。這個網(wǎng)站已經(jīng)簡單到不能再簡單了。

這個網(wǎng)站每秒處理兩三百個請求應(yīng)該是沒有問題的。但是有無論是webserver還是數(shù)據(jù)庫都是單點,任何一個掛了,整個網(wǎng)站就掛了。
2.0 版本 負載均衡
為了解決業(yè)務(wù)的單點故障,以及提升并發(fā)性能。我們還需要在 webserver前面加一個負載均衡器(load balancer),這個負載均衡器可以是一個Nginx或者haproxy。這個負載均衡器本身也是需要保障高可用的。客戶端請求先打到負載均衡,然后負載均衡會根據(jù)負載算法(輪訓(xùn)、最少連接數(shù)、權(quán)重、iphash等)將流量分配到后端 webserver中。

可以配合健康檢查,如果有一個后端server 宕機了,負載均衡會自動將流量摘除,請求會轉(zhuǎn)發(fā)到其他的server上面,保障業(yè)務(wù)高可用。
3.0 版本 DB主從
在2.0 版本里面雖然解決了業(yè)務(wù)單點和并發(fā),但是當(dāng)業(yè)務(wù)流量增大時,數(shù)據(jù)庫往往成為性能的瓶頸。這時候第一步通常是把數(shù)據(jù)庫搞成集群,最簡單的集群就是 一主多從,譬如mysql主從之間通常通過binlog復(fù)制數(shù)據(jù)。主節(jié)點負責(zé)讀寫,而從節(jié)點只負責(zé)讀。

這里就開始需要借助各種JDBC框架幫我們做讀寫分離。由于上面的主節(jié)點只有一個,宕機的時候還需要臨時將從節(jié)點提升為主節(jié)點,也可以部署多主多從結(jié)構(gòu),多master 都允許寫入。
3.1版本 DB分庫分表
3.0 版本的所有表都集中在一個數(shù)據(jù)庫(database)里面,那么這個請求集中在一個數(shù)據(jù)庫上。3.1 版本我們開始分庫分表,將表打散到不同的數(shù)據(jù)庫里面。

如上圖,我們將product表、forums表以及users表 分別放到三個database里面.
3.2 版本 DB分片
3.1 版本雖然實現(xiàn)了分庫,但請求都還是集中在一個物理的DB 服務(wù)器上,如果數(shù)據(jù)量非常大,我們還可以采用分片的方式,我們可以部署多套DB服務(wù)集群,將一張表分配到不同的DB服務(wù)器存儲,譬如通過用戶ID做水平拆分。這個動作被稱為sharding。

當(dāng)然我們也可以做垂直拆分,譬如將不同的表分配到不同的數(shù)據(jù)庫中。
4.0 緩存
這里的緩存分別兩部分,一部分是webserver里面添加緩存。很多數(shù)據(jù)先從cache server中,如果緩存中沒有,再去 database 中獲取。這里需要保障緩存和database數(shù)據(jù)的一致性。

緩存如果被擊穿是非常危險的,很容易導(dǎo)致所有流量達到DB,直接干崩數(shù)據(jù)庫。除了給數(shù)據(jù)庫增加緩存,還可以給整個網(wǎng)站加緩存。客戶端通過域名解析,先訪問CDN,如果CDN沒有則會回源。

CDN通常只緩存靜態(tài)數(shù)據(jù),譬如靜態(tài)網(wǎng)頁、視頻或者圖片。
5.0 匯總
好了,我們將上面的所有的東西都匯總一下畫到一個圖中。這里面主要涉及到負載均衡、數(shù)據(jù)庫分片、緩存和CDN。有些特別大的網(wǎng)站還會分地域部署,譬如在北美、歐洲會單獨部署一套服務(wù),然后有一個中心節(jié)點,地域的數(shù)據(jù)會定時同步到中心。
