作者:李小翀 鏈接:https://www.zhihu.com/question/22764869/answer/31277656 來源:知乎 1.初始 初始階段 的小型系統 應用程式、資料庫、文件等所有的資源都在一臺伺服器上通俗稱為LAMP特征:應用程式、資料庫、文件等所有的資源都在一臺伺服器上。 ...
作者:李小翀
鏈接:https://www.zhihu.com/question/22764869/answer/31277656
來源:知乎
1.初始
初始階段 的小型系統 應用程式、資料庫、文件等所有的資源都在一臺伺服器上通俗稱為LAMP特征:應用程式、資料庫、文件等所有的資源都在一臺伺服器上。描述:通常伺服器操作系統使用linux,應用程式使用JSP/PHP/ASP開發,然後部署在Apache上,資料庫使用Mysql,彙集各種免費開源軟體以及一臺廉價伺服器就可以開始系統的發展之路了。
特征:
應用程式、資料庫、文件等所有的資源都在一臺伺服器上。
描述:
通常伺服器操作系統使用linux,應用程式使用PHP開發,然後部署在Apache上,資料庫使用Mysql,彙集各種免費開源軟體以及一臺廉價伺服器就可以開始系統的發展之路了
2.應用服務和數據服務分離
好景不長,發現隨著系統訪問量的再度增加,webserver機器的壓力在高峰期會上升到比較高,這個時候開始考慮增加一臺webserver
特征:
應用程式、資料庫、文件分別部署在獨立的資源上。
描述:
數據量增加,單台伺服器性能及存儲空間不足,需要將應用和數據分離,併發處理能力和數據存儲空間得到了很大改善。
3.使用緩存提高性能
特征:
資料庫中訪問較集中的一小部分數據存儲在緩存伺服器中,減少資料庫的訪問次數,降低資料庫的訪問壓力。
描述:
系統訪問特點遵循二八定律,即80%的業務訪問集中在20%的數據上。
緩存分為本地緩存和遠程分散式緩存,本地緩存訪問速度更快但緩存數據量有限,同時存在與應用程式爭用記憶體的情況。
4.應用伺服器集群
在做完分庫分表這些工作後,資料庫上的壓力已經降到比較低了,又開始過著每天看著訪問量暴增的幸福生活了,突然有一天,發現系統的訪問又開始有變慢的趨勢了,這個時候首先查看資料庫,壓力一切正常,之後查看webserver,發現apache阻塞了很多的請求,而應用伺服器對每個請求也是比較快的,看來 是請求數太高導致需要排隊等待,響應速度變慢
特征:
多台伺服器通過負載均衡同時向外部提供服務,解決單台伺服器處理能力和存儲空間上限的問題。
描述:
使用集群是系統解決高併發、海量數據問題的常用手段。通過向集群中追加資源,提升系統的併發處理能力,使得伺服器的負載壓力不再成為整個系統的瓶頸。
5.資料庫讀寫分離
享受了一段時間的系統訪問量高速增長的幸福後,發現系統又開始變慢了,這次又是什麼狀況呢,經過查找,發現資料庫寫入、更新的這些操作的部分資料庫連接的資源競爭非常激烈,導致了系統變慢
特征:
多台伺服器通過負載均衡同時向外部提供服務,解決單台伺服器處理能力和存儲空間上限的問題。
描述:
使用集群是系統解決高併發、海量數據問題的常用手段。通過向集群中追加資源,使得伺服器的負載壓力不在成為整個系統的瓶頸。
6.反向代理和CDN加速
特征:
採用CDN和反向代理加快系統的 訪問速度。
描述:
為了應付複雜的網路環境和不同地區用戶的訪問,通過CDN和反向代理加快用戶訪問的速度,同時減輕後端伺服器的負載壓力。CDN與反向代理的基本原理都是緩存。
7.分散式文件系統和分散式資料庫
隨著系統的不斷運行,數據量開始大幅度增長,這個時候發現分庫後查詢仍然會有些慢,於是按照分庫的思想開始做分表的工作
特征:
資料庫採用分散式資料庫,文件系統採用分散式文件系統。
描述:
任何強大的單一伺服器都滿足不了大型系統持續增長的業務需求,資料庫讀寫分離隨著業務的發展最終也將無法滿足需求,需要使用分散式資料庫及分散式文件系統來支撐。
分散式資料庫是系統資料庫拆分的最後方法,只有在單表數據規模非常龐大的時候才使用,更常用的資料庫拆分手段是業務分庫,將不同的業務資料庫部署在不同的物理伺服器上。
8.使用NoSQL和搜索引擎
特征:
系統引入NoSQL資料庫及搜索引擎。
描述:
隨著業務越來越複雜,對數據存儲和檢索的需求也越來越複雜,系統需要採用一些非關係型資料庫如NoSQL和分資料庫查詢技術如搜索引擎。應用伺服器通過統一數據訪問模塊訪問各種數據,減輕應用程式管理諸多數據源的麻煩。
9.業務拆分
特征:
系統上按照業務進行拆分改造,應用伺服器按照業務區分進行分別部署。
描述:
為了應對日益複雜的業務場景,通常使用分而治之的手段將整個系統業務分成不同的產品線,應用之間通過超鏈接建立關係,也可以通過消息隊列進行數據分發,當然更多的還是通過訪問同一個數據存儲系統來構成一個關聯的完整系統。
縱向拆分:
將一個大應用拆分為多個小應用,如果新業務較為獨立,那麼就直接將其設計部署為一個獨立的Web應用系統
縱向拆分相對較為簡單,通過梳理業務,將較少相關的業務剝離即可。
橫向拆分:
將復用的業務拆分出來,獨立部署為分散式服務,新增業務只需要調用這些分散式服務
橫向拆分需要識別可復用的業務,設計服務介面,規範服務依賴關係。
10.分散式服務
特征:
公共的應用模塊被提取出來,部署在分散式伺服器上供應用伺服器調用。
描述:
隨著業務越拆越小,應用系統整體複雜程度呈指數級上升,由於所有應用要和所有資料庫系統連接,最終導致資料庫連接資源不足,拒絕服務。