以下內容主要摘自Jimmy Huang《大型互聯網架構概述》
大型互聯網架構的特點,依舊遵循著“分而治之”的理念。下圖是目前大型互聯網架構常見的邏輯架構:
互聯網架構的主要目標,是滿足以下非功能的需求:
- 低成本:主要可以用QPS(Query Per Second)指標來衡量
- 高可用
- 易伸縮
- 高安全
基于邏輯架構圖,對整個調用過程的簡要分析如下:
1.DNS
- 當用戶在瀏覽器中輸入網站地址后,瀏覽器會檢查瀏覽器緩存中是否存在對應域名的解析結果。如果有,則解析過程結束;否則進入下一個步驟
- 瀏覽器查找操作系統緩存中是否存在這個域名的解析結果。這個緩存的內容來源就是操作系統的hosts文件。如果有,則解析過程結束;否則進入下一個步驟
- 前兩個步驟都是本地查找,沒有發生網絡交互。在本步驟中,會使用到在網絡配置的中DNS地址。這個地址我們通常稱之為LDNS(Local DNS)。操作系統會把域名發送給LDNS解析。如果解析成功,則解析過程結束;否則進入下一個步驟
- LDNS將請求返回給GTLD(Global Top Level Domain)服務器,GTLD服務器查找此域名對應的Name Server域名的地址。這個Name Server通常就是你的域名提供商的服務器。Name Server根據客戶請求,返回該域名對應的IP地址和TTL(Time To Live)值。
- 瀏覽器根據TTL值,把這個域名對應的IP緩存在本地系統中。域名至此解析結束
2.CDN
CDN(Content Delivery Network,內容分發網絡)部署在網絡提供商的機房里面。在用戶請求網站服務時,可以從距離自己最近的網絡提供商獲取數據。比如視頻網站和內容網站的熱點內容。
如果需要自己搭建CDN系統,有3種主流方案可以選擇:
- squid是緩存服務器科班出生,自己實現了一套內存頁/磁盤頁的管理系統
- varnish是覺得squid性能不行,varnish覺得linux內核已經把虛擬內存管理做得很好了,squid的多此一舉反而影響了性能。
- nginx cache是屬于不務正業,得益于nginx強大的插件機制
3.LB
LB(Load Balance,負載均衡)就是將負載(用戶的請求)根據某些策略,將負載分攤給多個操作單元執行。該技術可以提供服務器的響應速度以及利用效率,避免出現單點失效。
這里回顧下前面介紹的兩個小節,其實本質上把數據分類(根據數據更新頻率,分為動態文件,靜態文件),并把數據放在離距離用戶最近的地方。另外一點就是,在DNS和CDN具體實現時,也是大量使用了負載均衡技術。
常見的負載均衡算法由:RR(Round Robin,輪詢),WRR(Weighted RR,加權輪詢),Random(隨機),LC(Least Connection,最少連接),SH(Source Hash,源址哈希)
在常見的互聯網架構中,通常使用軟件負載:
- LVS+HAproxy+WebServer(Nginx)。在部署時,LVS,HAProxy,WebServer都會部署一個集群,用來進行負載均衡。LVS工作在第4層,在網絡層利用IP地址進行轉發。 HAProxy工作在第7層,根據用戶的HTTP請求(比如根據URL,消息頭)來進行轉發。
- 在上述實現中,通常還會使用Keepalived+VIP(虛IP) 技術。Keepalived 提供健康檢查,故障轉移,提高系統的可用性。通過VIP(配置DNS 綁定域名)的形式對網站進行訪問。
4.WEB APP
- 前端技術:遵循基本的Web前端優化經驗,詳見CSDN《Web前端優化最佳實踐及工具集錦 》介紹。另外還可以使用BigPipe,動態頁面靜態化,無限滾動的翻頁技術等技術提供更好的用戶體驗。另外一部分就是考慮mobile技術了。
- 后端技術:
- HTTP協議:HTTP協議大概分為請求頭,請求體,響應頭,響應體。無論是WebServer還是ApplicationServer,很多花樣都是基于請求頭的請求路徑來玩的。
- API接口:使用RESTFUL API,暴露接口。它具有如下好處:
- 充分利用 HTTP 協議本身語義。
- 面向資源,一目了然,具有自解釋性。
- 無狀態,在調用一個接口(訪問、操作資源)的時候,可以不用考慮上下文,極大的降低了復雜度。
- Application Server:在Java中,為了保證程序能夠在各個廠商的Application Server中兼容運行,Sun公司為制定了J2EE規范。從技術發展路徑來看, Serverlet、JSP演變都是為了更好地方便程序員們編程。以典型的Tomcat為例,Connector和Container組成一個 Service,多個Service組成一個Server。Connector主要負責接受外部請求,Container負責處理請求。Server提供了生命周期管理,如啟動,停止等。
- Session Framework:在大型互聯網架構中,單臺機器已經存放不了用戶的登錄信息。同時為了支持故障轉移等特性,需要一套session管理機制,支持海量用戶同時在線。通常可以在遵循J2EE的容器內,使用Filter模式和分布式緩存系統來實現。
- MVC:即Model,View和Controller。Model代表業務邏輯,View表示頁面視圖,Controller表示根據用戶請求,執行相應的業務邏輯,并選擇適當的頁面視圖返回。用過ROR的同學都知道,里面的router配置了什么樣的URL和什么樣的action相對應。相應的,MVC的本質就是根據不同的URL選擇不同的servlet來執行。只不過,結合了Intercepting Filter提供了強大的功能而已。
- IOC:至于為什么需要IOC,在這篇文章進行了討論。究其本質實現,無非是反射+單例模式+Hash算法+字節碼增強+ThreadLocal。前3者用來實現對象生命周期的管理,后2者用來支持AOP,聲明式事務。
- ORM:ORM主要完成了類和表的映射,對象和一條表數據記錄的映射。其核心實現是通過jdbc獲取數據庫的meta信息,然后根據映射關系(這里可以通過COC(Conversion Over Configuration,約定優于配置),注解等技術來簡化配置)來動態生成sql和返回數據庫的執行結果。
5.SOA
網站架構的演進之路,從單一應用架構到垂直應用架構,分布式服務架構以及流動計算架構,越來越體現SOA框架的重要性。這里以優秀的開源實現dubbo為例,簡單介紹下。
dubbo的功能介紹見服務治理過程,對dubbo架構詳細介紹的有如何學習dubbo源代碼和dubbo源代碼閱讀。
簡而言之,就是使用了spring的schema的擴展機制,進而支持自定義dubbo標簽;通過類似serviceload機制配置多個可選服務。通過jdk動態代理和Javassist,使服務調用透明化。結合ZooKeeper實現高可用元數據管理
6.MQ
MQ(Message Queue,消息隊列)使服務調用異步化,可以消除并發訪問洪峰,提升網站響應速度。 在MQ實現中,可以參考Kafka/Metaq設計思想學習筆記
7.CACHE
Cache就是將數據放到距離計算最近的地方,用來加快處理速度。通常對一定時間內的熱點數據進行緩存。 在使用緩存時,需要注意緩存預熱和緩存穿透問題。
一般海量數據的緩存系統不會使用Java來實現,是因為Java有額外的對象大小開銷以及GC壓力。所以一般是用ANSI C來實現。目前用的比較火的是Redis,更多介紹請查看Redis資料匯總
**8.Storage **
在出現NOSQL之前,一統天下的是MySQL分庫分表技術。結合類似TDDL等SQL agent技術,也能夠執行類似join的操作。后來,就像忽如一夜春風來,出現了很多NOSQL/分布式存儲系統產品。
分布式存儲系統是分布式系統中最復雜的一部分,相比較SOA,CACHE等框架,它需要解決的問題更加復雜。常見的問題如下:
- 數據分布 在多臺服務器之間保證數據分布均勻,跨服務器如何讀寫
- 一致性 異常情況下如何保證副本一致性
- 容錯 把發生故障當成常態來設計,做到檢測是否發生故障并進行故障遷移
- 負載均衡 新增、移除服務器時如何負載均衡 數據遷移如何不影響已有服務
- 事務并發控制 如何實現分布式事務,如何實現多版本并發控制
- 壓縮、解壓縮 根據數據特點選擇恰當算法,如何平衡時間和空間的關系。
延伸理解可閱讀《大規模分布式存儲系統原理解析與架構實戰》和google的兩篇存儲論文。
其它
- 配置數據、元數據管理系統:可以查看這篇ZooKeeper和Diamond有什么不同
- 搜索系統:機器學習分析用戶行為,結合搜索進行推薦排名。 各種大數據分析工具。
- 云計算:硬件虛擬化。創業公司可以購買云服務,避免固定資產開銷,可能閑置, 購買,管理,安裝費用 ,無法迅速購買等問題,屬于浮動消費,類似開車和租車的區別,僅是租用服務。 云廠商在能源,制冷,運維成本,量大硬件定制,充分利用閑置資源具有優勢。
- 鷹眼系統:日志規范化+打點+數據分析+樹狀展現,詳細介紹可以參考 鷹眼下的淘寶-分布式調用跟蹤系統介紹
- 系統運維: 目標是自動化運維。監控各種資源指標:
- OS:(cpu,memory,disk(空間,讀寫次數))
- 網絡流量
- 中間件: tomcat, jvm,
- MQ:通過監控生產者,broker,消費者之間的隊列情況,動態決定增加、減少消費者
- 服務框架自省(運維監控) 依賴關系統計,前臺系統訪問路徑,
- 顯示各種監控結果:Agent —》 Explorer ,Analyze,Visual,Dashboard,Share。
- 預警,運維 自動、手工降級,系統問題自動排查甚至問題自動修復,
- 能源節省:能源消耗(CPU、機柜、水冷)
- 系統安全:涉及系統的方方面面,各種腳本,sql注入,0day等等。
- 版本開發、版本發布:開發環境,測試環境,支持開速發布,短周期,灰度發布,藍綠發布、回滾降級流程、周邊協調。 大眾點評的有個關于開發環境搭建的,感興趣的可以點擊打造高效的單機開發環境。
- 數據中心:在《程序員》2014年第一期介紹里面,提到了阿里使用了ZONE的概念來解決橫向擴展的問題。阿里主要是為了解決機房網絡瓶頸和超大規模系統的伸縮性問題,把完成某一特定業務需要的系統、核心服務、數據庫組合成一個業務單元