大型網站技術架構演化
一、大型網站軟體系統的特點
1.高併發、大流量
a.什麼是高併發?
高併發是網際網路分散式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理多個請求。
b.高併發的衡量指標有哪些?
(1)響應時間:系統對請求做出響應。例如系統處理一個HTTP請求需要200ms,這個200ms就是系統的響應時間。
(2)吞吐量:單位時間內處理的請求數量。
(3)QPS:每秒響應請求數。在網際網路領域,這個指標和吞吐量區分的不那麼明顯。
(4)併發使用者數:同時承載正常使用系統功能的使用者數量。例如一個通訊系統,線上量一定程度上代表系統的併發使用者數,比如騰訊QQ。
c.什麼是大流量
大流量這個詞,顧名思義表示很多流量,這個很多可以用一千萬,一億或者百億等來衡量。
以流量來說,這個詞有比較多的含義,如:
(1)它可以表示手機無線網資料;
(2)網店或網站的訪問量;
(3)流體通過量,如水流量等;
在這裡主要指網站的流量(包含網站訪問量)。
d.那麼網站流量指標有哪些呢
主要指標包括:
(1)獨立訪問者數量;
(2)重複訪問者數量;
(3)頁面瀏覽數;
(4)每個訪問者的頁面瀏覽數;
(5)使用者在網站的停留時間;
(6)使用者來源網站(又叫”引導網站”);
(7)使用者所使用的搜尋引擎及其關鍵字;
2.高可用:系統需要不間斷提供服務
a.什麼是高可用
高可用是分散式系統架構設計中必須考慮的因素之一,它通常是指,通過設計減少系統不能提供正常服務的時間。
假設系統一直能夠提供服務,我們說系統的可用性是100%。
如果系統每執行100個時間單位,會有1個時間單位無法提供服務,系統的年停機時間為8.76個小時。
b.如何保障系統的高可用
我們都知道,單點是系統高可用的大敵,應該儘量在系統設計的過程中避免單點。方法論上,高可用保證的原則是“叢集化”,或者叫“冗餘”:只有一個單點掛了服務會受影響,如果有冗餘備份,掛了還有其它backup能夠頂上。
那麼什麼是單點呢?
你可以理解為所有的服務都在一個伺服器上。
為什麼要避免單點?
假定所有的服務在一個伺服器上,如果該伺服器因為某種原因掛掉了,那麼所有的服務都會收到影響,從而會增長系統不能提供正常服務的時間。
3.海量資料(又稱“大資料”)
什麼是是海量資料?海量資料又稱大資料。對於大資料,研究機構給出了這樣的定義:大資料是需要新處理模式才能具有更強的決策力、洞察力和流程化能力的海量、高增長率和多樣化的資訊資產。
從技術上看,大資料與雲端計算的關係就像一昧硬幣的正反面。大資料必然無法用單臺計算機進行處理,必須採用分散式架構。其特色在於可對海量資料進行分散式資料探勘,但必須依託雲端計算的分散式處理、分散式資料庫以及雲端儲存、虛擬化技術。
大資料的特點
(1)資料體量大,從TB級躍升到PB級別。
(2)資料型別繁多,比如網路日誌、視訊、圖片、地理位置等。
(3)處理速度快。
(4)資料價值大。
4.使用者分佈廣泛,網路情況複雜
許多大型網際網路都是為全球使用者提供服務的,使用者分佈範圍廣,各地網路情況千差萬別。在國內,還有各個運營商網路互通難的問題。
以在我老家的時候,聯通的網路不好,移動的網路好,導致使用聯通的使用者使用軟體受制於網路訊號差而無法使用。
5.安全環境惡劣
由於網際網路的開放性,使得網際網路站更容易受到攻擊,大型網站幾乎每天都會被黑客攻擊。以GitHub為例,無時無刻不在遭受到攻擊。
6.需求快速變更,釋出頻繁
和傳統軟體的版本釋出頻率不一樣,網際網路產品為了快速適應市場,滿足使用者需求,其產品釋出頻率是極高的。
7.漸進式發展:幾乎所有的大網站都是從一個小網站開始的
以最早期的淘寶來說,也是從單體應用來的。據說早期的架構是Linux+Apache+MySQL+PHP(LAMP)。
FaceBook是伯克扎克同學在哈佛大學的宿舍裡開發的;Google的第一臺伺服器部署在斯坦福大學的實驗室;阿里巴巴則是在馬雲家的客廳裡誕生。
好的網際網路產品都是慢慢運營出來的,不是一開始就開發好的,這也正好與網站架構的發展演化過程對應。
二、大型網站架構演化發展歷程
1.初始階段的網路架構:應用程式、資料庫、檔案等所有資源都在一臺伺服器上(單體應用)
2.應用服務和資料庫分離:網站使用三臺伺服器:應用伺服器、檔案伺服器、資料庫伺服器
一般情況下有這麼幾種形式?
(1)nginx+tomcat+ftp+mysql/oracle;
(2)nginx+tomcat+vsftp+mysql/oracle;
(3)apache+tomcat+ftp+mysql/oracle;
(4)nginx+tomcat;
(5)docker容器實踐思路(又稱容器化);
當然了,上述列出的僅僅是冰山一角,有部分公司擁有自己研發的DB或者應用伺服器。
3.使用快取改善網站效能:使用快取後資料庫訪問壓力得到有效緩解
a.那麼在什麼樣的情況應該使用快取?
(1)經常變化的資料,但是不需要立刻進行持久化的;
(2)經常被大量讀取,很少進行更新操作;
(3)大量的資料庫IO操作;
(4)通用的頁面,如JS、CSS、圖片等;
(5) 統計和計算需要暫存的資訊,需要加快計算的;
b.Java常用的快取框架有哪些呢?
一般情況下,用Redis或者Memcache,當然了,有的時候也會用ehcache,關於Java常用的快取框架程式碼示例和介紹可參考該篇文章: https://www.cnblogs.com/chinway/p/5534636.html
4.使用伺服器叢集改善網站的併發處理能力:通過負載均衡排程器將請求分配到叢集中的伺服器上
這種方式又可以稱作“中心化”,所有的請求全部經過Nginx,由Nginx分發請求到不同的應用伺服器上面(根據權重進行分配)。
5.資料庫讀寫分離:應用伺服器在寫資料的時候訪問主資料庫,主資料通過主從複製機制將資料更新同步到從資料庫,這樣當伺服器讀資料的時候就可以通過從資料庫了
6.使用反向代理和CDN加速網路響應
關於CDN可以參考我的這篇文章:談談CDN
不過覺得還是要貼一下圖,這樣會有一個感性的認識。
什麼是反向代理呢?
反向代理是指以代理伺服器來接收internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器。
7.使用分散式檔案系統和分散式資料庫系統
分散式檔案系統有哪些?
主要有MFS、Ceph、GlusterFS、Lustre等
關於它們的區別可參考:
分散式檔案系統MFS、Ceph、GlusterFS、Lustre的對比
8.使用NOSQL和搜尋引擎
應用比較多的NoSQL,比如Memcache、Redis、MongoDB等。
搜尋引擎,以solr和elasticsearch比較多。
9.業務拆分
關於業務拆分可參考我的這篇博文業務拆分的思考
10.分散式服務
可以去看看分散式服務架構這本書或是去看看國外相關專業人士的論文或文章。
分散式服務架構:原理、設計與實戰電子書下載地址為: https://pan.baidu.com/s/1hK3vlIHX0SgbD4NNKx_zTg
三、大型網站演化的價值觀
(1)大型網站架構核心價值是隨網站所需靈活應付;
(2)驅動網站技術發展的主要力量是網站發展業務;
大型網站的核心價值不是從無到有二搭建一個大型網站,而是能夠伴隨小型網站業務逐步發展,慢慢演化成一個大型網站,網站的架構選擇儘量滿足網站使用者增加需求。
四、網站架構設計誤區
誤區如下所示:
(1)一昧追隨大公司方案;
(2)為了技術而技術;
(3)企圖用技術解決所有問題;
參考資料如下:
什麼是高併發: https://blog.csdn.net/DreamWeaver_zhou/article/details/78587580
什麼是高可用: http://www.cnblogs.com/shizhiyi/p/7750530.html
什麼是海量資料?它具有哪些特徵?: http://www.znjj.tv/news/3322.html
在什麼情況使用Java快取: https://flychao88.iteye.com/blog/1532335
《大型網站技術架構:核心原理與案例分析》第一章概述第一節大型網站架構演化