本文是學習大型分散式網站架構的技術總結。 對架構一個高效能、高可用、可伸縮及可擴展的分散式網站進行了概要性描述,並給予一個架構參考。 文中一部分為閱讀筆記,一部分是個人經驗總結,對大型分散式網站架構有較好的參考價值。
#以使用者為中心,提供快速的網頁存取體驗。主要參數有較短的反應時間、較大的同時處理能力、較高的吞吐量與穩定的效能參數。
可分為前端最佳化、應用層最佳化、程式碼層最佳化與儲存層最佳化。
#大型網站應該在任何時候都可以正常訪問,正常提供對外服務。因為大型網站的複雜性,分散式,廉價伺服器,開源資料庫,作業系統等特點,要確保高可用是很困難的,也就是說網站的故障是不可避免的。
如何提高可用性,就是需要迫切解決的問題。首先,需要從架構層級考慮,在規劃的時候,就考慮可用性。產業內一般用幾個9表示可用性指標,例如四個9(99.99),一年內允許的不可用時間是53分鐘。
不同層級使用的策略不同,一般採用冗餘備份和失效轉移解決高可用問題。
伸縮性是指在不改變原有架構設計的基礎上,透過增加/減少硬體(伺服器)的方式,提高/降低系統的處理能力。
#可以方便地進行功能模組的新增/移除,提供程式碼/模組等級良好的可擴充性。
#對已知問題有有效的解決方案,對未知/潛在問題建立發現和防禦機制。對於安全問題,首先要提高安全意識,建立一個安全的有效機制,從政策層面,組織層面進行保障,例如伺服器密碼不能洩露,密碼每月更新,並且三次內不能重複;每周安全掃描等。以製度化的方式,加強安全體系的建構。同時,需要注意與安全有關的各個環節。安全問題不容忽視,包括基礎設施安全,應用系統安全,資料保密安全等。
常用的加解密演算法(單項雜湊加密[MD5、SHA],對稱加密[DES、3DES、RC]) ,非對稱加密[RSA]等。
網站的架構設計,維運管理要適應變化,提供高伸縮性,高擴展性。方便的因應快速的業務發展,突增高流量存取等要求。
除上述介紹的架構要素外,還需要引進敏捷管理,敏捷開發的想法。使業務,產品,技術,維運統一起來,隨需應變,快速回應。
#以上採用七層邏輯架構,第一層客戶層,第二層前端最佳化層,第三層應用層,第四層服務層,第五層資料儲存層,第六層大資料儲存層,第七層大資料處理層。
一個成熟的大型網站(如淘寶、天貓、騰訊等)的系統架構並不是一開始設計時就具備完整的高性能、高可用、高伸縮等特性的,它是隨著用戶量的增加,業務功能的擴展逐漸演變完善的,在這個過程中,開發模式、技術架構、設計思想也發生了很大的變化,就連技術人員也從幾個人發展到一個部門甚至一條產品線。
所以成熟的系統架構是隨著業務的擴展而逐步完善的,並不是一蹴而就;不同業務特徵的系統,會有各自的重點,例如淘寶,要解決海量的商品信息的搜索、下單、支付;例如騰訊,要解決數億用戶的即時訊息傳輸;百度它要處理海量的搜尋請求。
他們都有各自的業務特性,系統架構也有所不同。儘管如此我們也可以從這些不同的網站背景中,找出其中共用的技術,這些技術和手段廣泛運用在大型網站系統的架構中,下面就透過介紹大型網站系統的演化過程,來認識這些技術和手段。
最初的架構,應用程式、資料庫、檔案都部署在一台伺服器上,如圖:
隨著業務的擴展,一台伺服器已經無法滿足效能需求,故將應用程式、資料庫、檔案各自部署在獨立的伺服器上,並且根據伺服器的用途配置不同的硬件,達到最佳的效能效果。
在硬體優化效能的同時,同時也透過軟體進行效能優化,在大部分的網站系統中,都會利用快取技術改善系統的效能,使用快取主要源自於熱點資料的存在,大部分網站存取都遵循28原則(即80%的存取請求,最終落在20%的資料上),所以我們可以對熱點資料進行緩存,減少這些資料的存取路徑,提高使用者體驗。
快取實作常見的方式是本機快取、分散式快取。當然還有CDN、反向代理等,這個後面再說。本地緩存,顧名思義是將資料緩存在應用程式伺服器本地,可以存在記憶體中,也可以存在文件,OSCache就是常用的本地快取元件。本地快取的特點是速度快,但因為本地空間有限所以快取資料量也有限。分散式快取的特點是,可以快取海量的數據,並且擴展非常容易,在門戶類網站中常被使用,速度按理沒有本地緩存快,常用的分佈式緩存是Memcached、Redis。
#應用程式伺服器作為網站的入口,會承擔大量的請求,我們往往透過應用伺服器集群來分擔請求數。應用程式伺服器前面部署負載平衡伺服器調度使用者請求,根據分發策略將請求分發到多個應用程式伺服器節點。
常用的負載平衡技術硬體的有F5,價格比較貴,軟體的有LVS、Nginx、HAProxy。 LVS是四層負載平衡,根據目標位址和連接埠選擇內部伺服器,Nginx和HAProxy是七層負載平衡,可以根據封包內容選擇內部伺服器,因此LVS分發路徑優於Nginx和HAProxy,效能要高些,而Nginx和HAProxy則較具配置性,如可用來做動靜分離(根據請求封包特徵,選擇靜態資源伺服器或應用伺服器)。
#隨著使用者量的增加,資料庫成為最大的瓶頸,改善資料庫效能常用的手段是進行讀寫分離以及分庫分錶,讀寫分離顧名思義就是將資料庫分為讀庫和寫庫,透過主備功能實現資料同步。分庫分錶則分為水平切分和垂直切分,水平切分則是對一個資料庫特大的表進行拆分,例如使用者表。垂直切分則是根據業務的不同來切分,如用戶業務、商品業務相關的表格放在不同的資料庫中。
假如我們的伺服器都部署在成都的機房,對於四川的用戶來說訪問是較快的,而對於北京的用戶訪問是較慢的,這是由於四川和北京分別屬於電信和聯通的不同發達地區,北京用戶訪問需要通過互聯路由器經過較長的路徑才能存取到成都的伺服器,返迴路徑也一樣,所以資料傳輸時間比較長。對於這種情況,常常使用CDN解決,CDN將數據內容緩存到運營商的機房,用戶訪問時先從最近的運營商獲取數據,這樣大大減少了網絡訪問的路徑。比較專業的CDN業者有藍汛、網宿。
而反向代理,則是部署在網站的機房,當用戶要求達到時首先訪問反向代理伺服器,反向代理伺服器將快取的資料傳回給用戶,如果沒有快取資料才會繼續訪問應用程式伺服器獲取,這樣做減少了獲取數據的成本。反向代理有Squid、Nginx。
用戶一天天增加,業務量越來越大,產生的檔案越來越多,單一的檔案伺服器已經無法滿足需求,這時就需要分散式檔案系統的支援。常用的分散式檔案系統有GFS、HDFS、TFS。
#對於海量資料的查詢和分析,我們使用NoSQL資料庫加上搜尋引擎可以達到更好的效能。並不是所有的數據都要放在關係型數據中。常用的NoSQL有MongoDB、HBase、Redis,搜尋引擎有Lucene、Solr、Elasticsearch。
隨著業務進一步擴展,應用程式變得非常臃腫,這時我們需要將應用程式進行業務拆分,如百度分為新聞、網頁、圖片等業務。每個業務應用負責相對獨立的業務運作。業務之間透過訊息進行通訊或共享資料庫來實現。
這時我們發現各個業務應用程式都會使用到一些基本的業務服務,例如用戶服務、訂單服務、支付服務、安全服務,這些服務是支援各業務應用的基本要素。我們將這些服務抽取出來利用分部式服務架構建構分散式服務。阿里的Dubbo是一個不錯的選擇。
分散式大型網站,目前看主要有幾類:
大型門戶一般是新聞類信息,可以使用CDN,靜態化等方式優化,開心網等交互性比較多,可能會引入更多的NoSQL,分佈式緩存,使用高效能的通訊框架等。電商網站具備以上兩類的特點,例如產品詳情可以採用CDN,靜態化,互動性高的需要採用NoSQL等技術。因此,我們採用電商網站作為案例,進行分析。
客戶需求:
客戶就是客戶,不會告訴你具體要什麼,只會告訴你他想要什麼,我們很多時候要引導,挖掘客戶的需求。好在提供了明確的參考網站。因此,下一步要進行大量的分析,結合產業,以及參考網站,提供給客戶方案。 需求功能矩陣需求管理傳統的做法,會使用使用案例圖或模組圖(需求清單)進行需求的描述。這樣做常常忽略掉一個很重要的需求(非功能需求),因此推薦大家使用需求功能矩陣,進行需求描述。本電商網站的需求矩陣如下:
#但是,目前主流的網站架構已經發生了翻天覆地的變化。一般都會採用集群的方式,進行高可用設計。至少是下面這個樣子:
#沒好好學數學後悔了吧? ! (不知道以上算是否有錯誤,呵呵~~) 伺服器預估:(以tomcat伺服器舉例) 按一台web伺服器,支援每秒300個並發計算。平常需要10台伺服器(約等於);[tomcat預設配置是150],高峰期需要30台伺服器;容量預估:70/90原則 系統CPU一般維持在70%左右的水平,高峰期達到90%的水平,是不浪費資源,並比較穩定的。內存,IO類似。以上預估僅供參考,因為伺服器配置,業務邏輯複雜度等都有影響。在此CPU,硬碟,網路等不再進行評估。 5.網站架構分析 根據上述預估,有幾個問題:
大型網站一般需要做以下架構優化(優化是架構設計時,就要考慮的,一般從架構/程式碼層級解決,調優主要是簡單參數的調整,例如JVM調優;如果調優涉及大量程式碼改造,就不是調優了,屬於重構):
根據業務屬性進行垂直切分,分割為產品子系統,購物子系統,支付子系統,評論子系統,客服子系統,介面子系統(對接如進銷存,簡訊等外部系統)。依業務子系統進行等級定義,可分為核心系統與非核心系統。核心系統:產品子系統,購物子系統,支付子系統;非核心:評論子系統,客服子系統,介面子系統。
拆分後的架構圖:
#參考部署方案2
如上圖每個應用程式單獨部署,核心系統和非核心系統組合部署
叢集部署後架構圖:
快取依存放的位置一般可分為兩類本機快取和分散式快取。本案例採用二級緩存的方式,進行緩存的設計。一級快取為本地緩存,二級緩存為分散式快取。 (還有頁面緩存,片段緩存等,那是更細粒度的劃分) 一級緩存,緩存資料字典,和常用熱點資料等基本不可變/有規則變化的信息,二級緩存緩存需要的所有緩存。當一級快取過期或不可用時,存取二級快取的資料。如果二級快取也沒有,則存取資料庫。快取的比例,一般1:4,即可考慮使用快取。 (理論上是1:2即可)。
可根據業務特性可使用下列快取過期策略:
結合Cache中間件,實現的分散式Session,可以很好的模擬Session會話。
大型網站需要儲存海量的數據,為達到大量資料存儲,高可用,高效能一般採用冗餘的方式進行系統設計。一般有兩種方式讀寫分離和分庫分錶。讀寫分離:一般解讀比例遠大於寫比例的場景,可採用一主一備,一主多備或多主多備方式。本案例在業務拆分的基礎上,結合分庫分錶和讀寫分離。如下圖:
相關中間件可參考Cobar(阿里,目前已不在維護),TDDL(阿里),Atlas(奇虎360), MyCat。分庫分錶後序列的問題,JOIN,事務的問題,會在分庫分錶主題分享中,介紹。
將多個子系統公用的功能/模組,進行抽取,作為公用服務使用。例如本案例的會員子系統就可以抽取為公用的服務。
訊息佇列可以解決子系統/模組之間的耦合,實現異步,高可用,高效能的系統。是分散式系統的標準配置。本案例中,訊息佇列主要應用在購物,配送環節。
以上是10分鐘速解 | 大型分散式電商系統架構的詳細內容。更多資訊請關注PHP中文網其他相關文章!