——來自《10分鐘搞懂互聯網系統演進規律:支撐億級用戶的架構都是這樣來的!》數據庫
互聯網主要面對的技術挑戰,用一句話歸納:就是用戶不斷上升產生的併發訪問壓力以及數據存儲壓力,因此係統須要更強的處理能力才能解決這些問題。後端
而系統處理能力提高,主要有兩種途徑:緩存
1.垂直伸縮:安全
提高單臺服務器的處理能力,好比用更快頻率的cpu,用更多核的cpu,用更大的內存,用更快的網卡,用更多的磁盤組成一臺服務器,使單臺服務器的處理能力獲得提高,經過這種手段提高系統的處理能力。服務器
缺點以下:網絡
a.當垂直伸縮達到必定程度之後,繼續增長計算須要花費更多的錢。架構
b.垂直伸縮是有物理極限的,即便是大型機,也有本身的物理極限,它不可能無限地伸縮下去的。併發
c.操做系統的設計或者應用程序的設計制約着垂直伸縮,最多隻能達到一個點沒法繼續提升。負載均衡
在大型互聯網出現以前,傳統的軟件,好比銀行、電信這些企業的軟件系統,主要是使用垂直伸縮這種手段實現系統能力提高的,在服務器上加強,提高服務器的硬件水平。當某種類型的服務器能力提高到了瓶頸之後,就會用更強大的服務器,好比說從服務器升級到小型機,從小型機提高到中型機,從中型機提高到大型機,服務器愈來愈強大,處理能力愈來愈強大,固然價格也愈來愈昂貴,運維愈來愈複雜。運維
2.水平伸縮:
單機的處理能力並不提高,也不使用更昂貴的更快的更厲害的硬件,而是經過更多的服務器,將這些服務器構成一個分佈式集羣,經過這個集羣,統一對外提供服務,以此來提升系統總體的處理能力。
水平伸縮優勢:
a.只要架構合理,可以添加服務器到集羣中,你的系統就是永遠能夠正常運行。
b.它沒有極限,它的成本也不會說到了某個臨界點就忽然增長。並且逐漸的增長服務器,得到相同的計算處理能力,只會比之前的服務器更便宜,不會更貴,由於硬件的價格老是在不斷地降低的。
c.應用程序運行在一個服務器上,是爲單一服務器而設計的,而增長服務器的話只是讓程序部署在更多的服務器上,因此也不須要對應用程序進行太多的改變,應用程序不會受到硬件制約。
在互聯網行業中多采用水平伸縮的手段。
應用程序、數據庫、文件等全部的資源都集中在一臺服務器上,典型案例:基於LAMP架構的PHP網站。
若是用戶訪問量愈來愈多,會致使性能愈來愈差,數據存儲空間不足。
隨着業務發展,單臺服務器再也不知足需求,將應用和數據分離後成三臺服務器(應用服務器、文件服務器和數據庫服務器)。應用服務器須要處理大量的業務,所以須要更快更強大的CPU;數據庫服務器須要快速磁盤檢索和數據緩存,所以須要更快的磁盤和更大的內存;文件服務器須要存儲大量用戶上傳的文件,所以須要更大的硬盤。
當用戶訪問巨大,會致使數據庫壓力太大,訪問延遲,影響網站性能,用戶體驗差。
網站訪問特色80%的業務訪問集中在20%的數據上,所以能夠經過使用緩存的方式,減小數據庫的訪問壓力,提升網站的數據訪問速度。緩存分爲兩種:緩存在應用服務器上的本地緩存和緩存在專門的分佈式緩存服務器上的遠程緩存。本地緩存訪問速度快,但緩存數據量有限;遠程分佈式緩存可使用集羣方式,容量不受限制。
單一應用服務器可以處理的請求鏈接有限,在網站訪問高峯期,應用服務器會成爲整個網站的瓶頸。
使用集羣是網站解決高併發、海量數據問題的經常使用手段。改善系統性能,從而實現系統的可伸縮性。經過負載均衡調度服務器,能夠將用戶的訪問請求分發到集羣中的任何一臺服務器上,使應用服務器的負載壓力再也不成爲網站的瓶頸。
網站在使用緩存後,絕大部分數據讀操做訪問均可以不經過數據庫就能完成,但仍有一部分讀操做(緩存訪問不命中、緩存過時)和所有的寫操做須要訪問數據庫,在網站的用戶達到必定規模後,數據庫由於負載壓力太高而成爲網站的瓶頸。
大部分主流數據庫都提供主從熱備功能,經過配置兩臺數據庫主從關係,將一臺數據庫服務器的數據更新同步到另外一臺服務器上。網站利用數據庫的這一功能,實現數據庫讀寫分離,從而改善數據庫負載壓力。
CDN和反向代理的基本原理都是緩存,區別在於CDN部署在網絡提供商的機房,使用戶在請求網站服務時,能夠從距離本身最近的網絡提供商機房獲取數據;而反向代理則部署在網站的中心機房,當用戶請求到達中心機房後,首先訪問的服務器是反向代理服務器,若是反向代理服務器中緩存着用戶請求的資源,就將其直接返回給用戶。
使用CDN和反向代理的目的都是儘早返回數據給用戶,一方面加快用戶訪問速度,另外一方面也減輕後端服務器的負載壓力。
隨着網站業務的發展,兩臺數據庫服務器仍然沒法知足需求,文件系統也同樣。分佈式數據庫是網站數據庫拆分的最後手段,只有在單表數據規模很是龐大的時候才使用。不到不得已,網站更經常使用的數據庫拆分手段是業務分庫,將不一樣業務的數據庫部署在不一樣的物理服務器上。
隨着網站業務愈來愈複雜,對數據存儲和檢索的需求也愈來愈複雜,網站須要採用一些非關係型數據庫技術如NoSQL和非數據庫查詢技術如搜索引擎。NoSQL和搜索引擎都是源自互聯網的技術手段,對可伸縮的分佈式特性具備更好的支持。應用服務器則經過一個統一數據訪問模塊訪問各類數據,減輕應用程序管理諸多數據源的麻煩。
經過分而治之的手段將整個網站業務分紅不一樣的產品線,如淘寶將首頁、商鋪、訂單、賣家、買家等拆分紅不一樣的產品線,分歸不一樣的業務團隊負責。各個應用之間能夠經過創建一個超連接創建關係,也能夠經過消息隊列進行數據分發。
既然每個應用系統都須要執行許多相通的業務操做,好比用戶管理、商品管理等,那麼能夠將這些共用的業務提取出來,獨立部署。
大型網站架構技術的核心價值不是從無到有搭建一個大型網站,而是可以伴隨小型網站業務的漸進發展,慢慢地演化成一個大型網站。
業務成就了技術,事業成就了人,而不是相反。
大公司的經驗和成功模塊值得學習借鑑,但不能盲從。
技術是爲業務而存在的,除此毫無心義。
技術是用來解決業務問題的,而業務的問題,也能夠經過業務的手段去解決。好比12306真正的問題其實不在於它的技術架構,而在於它的業務架構。