目錄
背景
- 大型互聯網網站及應用是隨着業務的逐步發展與不斷創新慢慢演化而成的。在這個進化過程中,會有一些通用的問題需要解決,也會有一些常規的中間件需要構建,本文將對這個演化過程中涉及的分布式技術架構常用套路進行說明與分析。
1、單機架構
- 上線初期,負載較小,應用程序、數據庫、文件等所有的資源都部署在一台服務器上。
- 架構上一般采用LAMP(Linux+Apache+Mysql+PHP)技術或Java MVC技術。
2、應用服務與數據服務分離
- 隨着訪問量的不斷增多,服務器的負載持續升高,越來越多的數據及文件資源導致存儲不足,這時候需要將應用服務與數據服務進行分離。
- 應用和數據分離后,不同特性的服務器承擔不同的角色,並發處理能力和數據存儲空間得到了改善。
- 原有的LAMP(Linux+Apache+Mysql+PHP)技術或MVC技術仍然能支撐這種架構。
3、應用服務器集群架構
- 單一應用服務器能夠處理的請求連接有限,在業務訪問高峰期內,應用服務器成了網站的最大瓶頸。
- 使用集群架構是解決高並發問題的常用套路:將來自用戶的訪問請求分發到應用服務器集群中的任何一台服務器上,使得單位時間內可以接納更多的訪問請求。
- 加入負載均衡調度服務:通過成熟的負載均衡系統可以有效分配外部請求的流量,使應用服務器的負載壓力不再成為整個網站的瓶頸。
3.1 應用服務器集群架構下的Session管理
- 問題:同一客戶的請求在負載均衡機制下,會被分配到不同的應用服務器,造成產生不同的Session,即同一個客戶在同一網站下產生了不同的狀態。
- 解決方案:引入基於Redis的K-V內存數據庫,將用戶請求產生的Session集中存儲並共享,可解決Session不同步的問題。
4、數據庫讀寫分離
- 業務量的急速增加,對於數據庫的讀寫頻率也會明顯升高,數據庫因為負載壓力過高也成為網站的瓶頸。大多數業務對數據庫的操作是讀多寫少,將數據庫讀庫與寫庫分離,是解決此問題的常用套路。
應用服務器在寫數據的時候,訪問主數據庫,主數據庫通過主從復制機制將數據更新同步到讀數據庫,即讀數據庫的數據與主數據庫保持同步,這樣當應用服務器讀數據的時候,就可以通過讀數據庫獲得數據。
- 應用服務器端使用專門的數據訪問模塊,比如通過Spring+Mybatis配置多數據源,實現應用端的讀寫分離。
5、利用緩存技術進行加速
- 數據緩存:將業務系統中的“熱數據”放入緩存中,應用服務在讀取這些數據中,直接從緩存中讀取,可以減少數據庫的訪問壓力,從而提高整個網站的數據訪問速度。
- 使用反向代理和CDN加速網站響應:既加快了用戶訪問速度,也減輕后端服務器的負載壓力。
CDN和反向代理的基本原理都是緩存,區別在於CDN部署在網絡提供商的機房,使用戶在請求網站服務時,可以從距離自己最近的網絡提供商機房獲取數據;而反向代理則部署在網站的中心機房,當用戶請求到達中心機房后,首先訪問的服務器是反向代理服務器,如果反向代理服務器中緩存着用戶請求的資源,就將其直接返回給用戶。
6、分布式數據庫系統與分布式文件系統
- 與應用服務一樣,任何強大的單一服務器都滿足不了持續增長的業務需求,單機的數據庫系統與文件系統同樣也會遇到瓶頸。
- 將不同的業務數據拆分到不同的數據庫中,並將對應不同的業務數據庫部署在不同的物理服務器上,形成分布式數據庫系統。
- 同理存儲的文件也可以按文件的業務屬性進行拆分,並部署在不同的物理服務器上,形成分布式文件系統。
- Mycat是現階段流行的分布式數據庫系統;常見的分布式文件系統有FastDFS等。
7、NoSQL數據庫作為補充
- 互聯網與大數據的高速發展,需要面對高效存儲、高可擴展性等難題,NoSQL(Not Only SQL)數據庫快速的查詢響應,靈活的數據模型等特性,正好可以作為傳統關系型數據的一個有力補充。
8、使用搜索引擎
- 隨着網站業務越來越復雜,對數據存儲和檢索的需求也越來越復雜,大型互聯網應用需要非數據庫查詢技術如搜索引擎。
- Elasticsearch是一個實時的分布式搜索和分析引擎,可以用於全文搜索,結構化搜索以及分析,該技術目前在互聯網行業得到了廣泛應用。
9. 分布式服務
- 將大型應用中的功能按單一職責的原則進行拆分,每個拆分出來的功能都可被稱為一項服務,通過中間件技術(RPC、消息隊列、分布式事務等)實現各個服務之間的相互連接與通訊。
9.1 微服務
- 微服務也是一種分布式服務:把服務按單一職責原則進行拆分,形成更小的粒度,獨立部署與運行,並由獨立的團隊負責服務的生命周期管理。