天天看點

大型網際網路架構概述

本文旨在簡單介紹大型網際網路的架構和核心元件實作原理。 理論上講,從安裝配置,最佳實踐以及源碼來剖析各個元件,這個自然是極好的。由于筆者時間以及知識有限,有很多知識沒有在工作中親自實踐的機會。是以有些地方語焉不詳,還請大家多多指教。

大型網際網路架構

解決問題的通用思路是将分而治之(divide-and-conquer),将大問題分為若幹個小問題,各個擊破。在大型網際網路的架構實踐中,無一不展現這種思想。

架構目标

  • 低成本:任何公司存在的價值都是為了擷取商業利益。在可能的情況下,希望一切都是低成本的。
  • 高性能:網站性能是客觀的名額,可以具體展現到響應時間、吞吐量等技術名額。系統的響應延遲,指系統完成某一功能需要使用的時間;系統的吞吐量,指系統在某一時間可以處理的資料總量,通常可以用系統每秒處理的總的資料量來衡量;系統的并發能力,指系統可以同時完成某一功能的能力,通常也用 QPS(query per second)來衡量。
  • 高可用:系統的可用性(availability)指系統在面對各種異常時可以正确提供服務的能力。系統的可用性可 

    以用系統停服務的時間與正常服務的時間的比例來衡量,也可以用某功能的失敗次數與成功次數的比例來衡量。

  • 易伸縮:注重線性擴充,是否可以容易通過加入機器來處理不斷上升的使用者通路壓力。系統的伸縮性(scalability)指分布式系統通過擴充叢集機器規模提高系統性能(吞吐、延遲、并發)、存儲容量、計算能力的特性。
  • 高安全:現在商業環境中,經常出現被網站被拖庫,使用者賬戶被盜等現象。網站的安全性不言而喻。

典型實作

下面典型的一次web互動請求示意圖。

大型網際網路架構概述

DNS

  1. 當使用者在浏覽器中輸入網站位址後,浏覽器會檢查浏覽器緩存中是否存在對應域名的解析結果。如果有,則解析過程結束;否則進入下一個步驟
  2. 浏覽器查找作業系統緩存中是否存在這個域名的解析結果。這個緩存的内容來源就是作業系統的hosts檔案。如果有,則解析過程結束;否則進入下一個步驟
  3. 前兩個步驟都是本地查找,沒有發生網絡互動。在本步驟中,會使用到在網絡配置的中DNS位址。這個位址我們通常稱之為LDNS(Local DNS)。作業系統會把域名發送給LDNS解析。如果解析成功,則解析過程結束;否則進入下一個步驟
  4. LDNS将請求傳回給GTLD(Global Top Level Domain)伺服器,GTLD伺服器查找此域名對應的Name Server域名的位址。這個Name Server通常就是你的域名提供商的伺服器。Name Server根據客戶請求,傳回該域名對應的IP位址和TTL(Time To Live)值。
  5. 浏覽器根據TTL值,把這個域名對應的IP緩存在本地系統中。域名至此解析結束。

CDN

CDN(Content Delivery Network,内容分發網絡)部署在網絡提供商的機房裡面。在使用者請求網站服務時,可以從距離自己最近的網絡提供商擷取資料。比如視訊網站和内容網站的熱點内容。

如果需要自己搭建CDN系統,有3種主流方案可以選擇:

  • squid是緩存伺服器科班出生,自己實作了一套記憶體頁/磁盤頁的管理系統
  • varnish是覺得squid性能不行,varnish覺得linux核心已經把虛拟記憶體管理做得很好了,squid的多此一舉反而影響了性能。
  • nginx cache是屬于不務正業,得益于nginx強大的插件機制。

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 綁定域名)的形式對網站進行通路。

WEB APP

前端技術:遵循基本的Web前端優化經驗,詳見Web前端優化最佳實踐及工具集錦 

介紹。另外還可以使用BigPipe,動态頁面靜态化,無限滾動的翻頁技術等技術提供更好的使用者體驗。另外一部分就是考慮mobile技術了,這塊筆者暫時還沒涉足,就不談了。

後端技術:

  • HTTP協定:HTTP協定大概分為請求頭,請求體,響應頭,響應體。無論是WebServer還是ApplicationServer,很多花樣都是基于請求頭的請求路徑來玩的。
  • API接口:使用RESTFUL API,暴露接口。它具有如下好處:1.充分利用 HTTP 協定本身語義。2.面向資源,一目了然,具有自解釋性。3.無狀态,在調用一個接口(通路、操作資源)的時候,可以不用考慮上下文,極大的降低了複雜度。
  • Application Server:在Java中,為了保證程式能夠在各個廠商的AS中相容運作,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和傳回資料庫的執行結果。

SOA

網站架構的演進之路,從單一應用架構到垂直應用架構,分布式服務架構以及流動計算架構,越來越展現SOA架構的重要性。這裡以優秀的開源實作dubbo為例,簡單介紹下。

dubbo的功能介紹見服務治理過程,對dubbo架構詳細介紹的有如何學習dubbo源代碼和dubbo源代碼閱讀。

簡而言之,就是使用了spring的schema的擴充機制,進而支援自定義dubbo标簽;通過類似serviceload機制配置多個可選服務。通過jdk動态代理和Javassist,使服務調用透明化。結合ZooKeeper實作高可用中繼資料管理。

MQ

MQ(Message Queue,消息隊列)使服務調用異步化,可以消除并發通路洪峰,提升網站響應速度。 在MQ實作中,筆者寫過一篇介紹Kafka的學習筆記,詳細介紹見Kafka/Metaq設計思想學習筆記,不再多言。

CACHE

Cache就是将資料放到距離計算最近的地方,用來加快處理速度。通常對一定時間内的熱點資料進行緩存。 

在使用緩存時,需要注意緩存預熱和緩存穿透問題。

一般海量資料的緩存系統不會使用Java來實作,是因為Java有額外的對象大小開銷以及GC壓力。是以一般是用ANSI C來實作。目前用的比較火的是Redis,更多介紹請檢視Redis資料彙總

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等等。
  • 版本開發、版本釋出:開發環境,測試環境,支援開速釋出,不用大的cycle,灰色釋出,復原降級流程,周邊協調。 大衆點評的有個關于開發環境搭建的,感興趣的可以點選打造高效的單機開發環境。
  • 資料中心:在《程式員》2014年第一期介紹裡面,提到了阿裡使用了ZONE的概念來解決橫向擴充的問題。阿裡主要是為了解決機房網絡瓶頸和超大規模系統的伸縮性問題,把完成某一特定業務需要的系統、核心服務、資料庫組合成一個業務單元。

參考

    • 《深入分析Java Web 技術内幕》
    • 《大規模分布式存儲系統原了解析與架構實戰》
    • 《大型網站技術架構核心原理與案例分析》
    • 《分布式系統原理介紹》
    • 《大規模Web服務開發技術》
    • 《程式員》2014年第一期
    • google系列論文
    • varnish / squid / nginx cache 有什麼不同?
    • RESTful的優點

繼續閱讀