1.0 版本 hello world
1.0 版本最簡單的網站,瀏覽客戶端以及移動端,通過DNS解析域名,然后訪問網站。網站可以通過JAVA web構建,部署到Tomcat里面啟動,后端就是一個單點的MySQL 數據庫。這個網站已經簡單到不能再簡單了。
這個網站每秒處理兩三百個請求應該是沒有問題的。但是有無論是webserver還是數據庫都是單點,任何一個掛了,整個網站就掛了。
2.0 版本 負載均衡
為了解決業務的單點故障,以及提升并發性能。我們還需要在 webserver前面加一個負載均衡器(load balancer),這個負載均衡器可以是一個Nginx或者haproxy。這個負載均衡器本身也是需要保障高可用的。客戶端請求先打到負載均衡,然后負載均衡會根據負載算法(輪訓、最少連接數、權重、iphash等)將流量分配到后端 webserver中。
可以配合健康檢查,如果有一個后端server 宕機了,負載均衡會自動將流量摘除,請求會轉發到其他的server上面,保障業務高可用。
3.0 版本 DB主從
在2.0 版本里面雖然解決了業務單點和并發,但是當業務流量增大時,數據庫往往成為性能的瓶頸。這時候第一步通常是把數據庫搞成集群,最簡單的集群就是 一主多從,譬如mysql主從之間通常通過binlog復制數據。主節點負責讀寫,而從節點只負責讀。
這里就開始需要借助各種JDBC框架幫我們做讀寫分離。由于上面的主節點只有一個,宕機的時候還需要臨時將從節點提升為主節點,也可以部署多主多從結構,多master 都允許寫入。
3.1版本 DB分庫分表
3.0 版本的所有表都集中在一個數據庫(database)里面,那么這個請求集中在一個數據庫上。3.1 版本我們開始分庫分表,將表打散到不同的數據庫里面。
如上圖,我們將product表、forums表以及users表 分別放到三個database里面.
3.2 版本 DB分片
3.1 版本雖然實現了分庫,但請求都還是集中在一個物理的DB 服務器上,如果數據量非常大,我們還可以采用分片的方式,我們可以部署多套DB服務集群,將一張表分配到不同的DB服務器存儲,譬如通過用戶ID做水平拆分。這個動作被稱為sharding。
當然我們也可以做垂直拆分,譬如將不同的表分配到不同的數據庫中。
4.0 緩存
這里的緩存分別兩部分,一部分是webserver里面添加緩存。很多數據先從cache server中,如果緩存中沒有,再去 database 中獲取。這里需要保障緩存和database數據的一致性。
緩存如果被擊穿是非常危險的,很容易導致所有流量達到DB,直接干崩數據庫。除了給數據庫增加緩存,還可以給整個網站加緩存。客戶端通過域名解析,先訪問CDN,如果CDN沒有則會回源。
CDN通常只緩存靜態數據,譬如靜態網頁、視頻或者圖片。
5.0 匯總
好了,我們將上面的所有的東西都匯總一下畫到一個圖中。這里面主要涉及到負載均衡、數據庫分片、緩存和CDN。有些特別大的網站還會分地域部署,譬如在北美、歐洲會單獨部署一套服務,然后有一個中心節點,地域的數據會定時同步到中心。