一步步帶你,如何網站架構【轉】

何爲大型網站

大型網站特性

既然說的是大型網站架構,那麼架構的背後天然是解決人因面對大型網站特性而帶來的問題。這樣能夠先給你們說下大型網站的特性,這些特性帶來的問題就是人要解決的問題前端

  1. 高併發、大流量:PV 量巨大;
  2. 高可用:7*24 小時不間斷服務;
  3. 海量數據:文件數目分分鐘 xxTB;
  4. 用戶分佈普遍,網絡狀況複雜:網絡運營商;
  5. 安全環境惡劣:黑客的攻擊;
  6. 需求快速變動,發佈頻繁:快速適應市場,知足用戶需求;
  7. 漸進式發展:慢慢地運營出大型網站;

大型網站目標

既然說到了大型網站的特性,那麼解決這些特性帶來的問題要達到什麼目標呢?以下:程序員

大型網站架構目標

每一個目標背後面臨着技術、設計、維護等諸多方面的挑戰; 而目標自己的指望值也會根據實際狀況進行調整,這也意味着網站架構建設是個不斷調整的過程。數據庫

有了問題,也定了偉大的目標,那麼網站在不一樣階段面對不一樣的問題,是如何解決的?又是如何一步步成長爲大型網站架構,實現這些偉大的目標呢?後端

如何網站架構

首先,什麼是大型網站架構呢?瀏覽器

其實大型網站架構的概念對於每個開發者來講很籠統、很模糊,正如盲人摸象,看到的、瞭解到的只是很小的一部分,大部分狀況下咱們只是負責架構中的一小塊內容,因此很難清晰地給出具體定義。這就是所謂「不識廬山真面目 只緣身在此山中」的尷尬吧。因此咱們要跳出來,站在宏觀的角度,從總體到細節實現來認識大型網站架構。緩存

那麼從宏觀的角度怎麼去認識大型網站架構呢?正如前面幾篇《細品架構系列》所描述對架構的認識,按照問題識別—>概念認知—>架構切分的思路,來分析大型網站架構的誕生:安全

  1. 問題識別:當前什麼問題、誰的問題、問題邊界;
  2. 概念認知:經過分析問題,會產生哪些概念,統一律念認知,達成溝通交流規範;
  3. 架構切分:根據概念來解決問題,如何架構切分,產生哪些架構,提出具體解決方案;

PS:上面的三個步驟具體如何識別、認知、切分,請詳細參考前面幾篇《細品架構系列》文章,可能使你會對架構有從新的認識。服務器

在進行分析大型網站架構的演進之路前,首先咱們要明確的兩個價值觀:網絡

  1. 核心價值:隨網站所需靈活應對;大型網站不是從無到有一步就搭建好一個大型網站,而是可以伴隨小型網站業務的漸進發展,慢慢地演化成一個大型網站;
  2. 驅動力量:網站的業務發展—業務成就了技術,事業成就了人,而不是相反;

還有,大型網站架構演進必須避免的幾個誤區:架構

  1. 一味追隨大公司的解決方案;
  2. 爲了技術而技術–>常見問題;
  3. 企圖用技術解決全部問題:技術是用來解決業務問題的,而業務的問題,也能夠經過業務的手段去解決;

架構體系演進

單機時代

草根時期,快速開發網站並上線。固然,一般只是先試水,用戶規模也沒有造成,經濟能力和投入也很是有限應用程序、數據庫、文件等全部資源都集中在一臺 Server上,典型案例:基於 LAMP 架構的 PHP 網站;

單機時代(純依賴RDBMS)

優勢:簡單、快速迭代達成業務目標;
缺點:存在單點、談不上高可用;
技術點:應用設計要保證可擴展;

緩存出場

有必定的業務量和用戶規模了,想提高網站速度,因而,緩存出場了

單機時代+緩存出場

優勢:簡單有效、方便維護;
缺點:存在單點、談不上高可用;
技術點:客戶端(瀏覽器)緩存、前端頁面緩存、頁面片斷緩存、本地數據緩存/數據庫緩存、遠程緩存;

如上圖,緩存能夠分爲:

  1. 頁面緩存:客戶端緩存,減小對網站的訪問;
  2. 本地緩存:訪問速度快,但數據量有限,減小對DB查詢;
  3. 遠程緩存:遠程訪問,能夠集羣,所以容量不受限制;

數據服務與應用分離

市場反響還不錯,用戶量天天在增加,數據庫瘋狂讀寫,逐漸發現一臺服務器快撐不住了。因而,決定把數據服務和APP作分離

數據服務與應用分離

優勢:簡單有效、方便維護、提升不一樣Server對硬件資源的利用率;
缺點:存在單點、談不上高可用;
技術點:文件服務器部署、數據庫服務器,擴展數據訪問模塊;

分離後三臺 Server 對硬件資源的需求各不相同:

  1. 應用服務器:須要更快更強大的 CPU;
  2. 數據庫服務器:須要更快的硬盤和更大的內存;
  3. 文件服務器:須要更大的硬盤;

數據庫讀寫分離

單臺數據庫也感受快撐不住了,通常都會嘗試作「讀寫分離」。因爲大部分互聯網「讀多寫少」的特性所決定的。Salve的臺數,取決於按業務評估的讀寫比例。

數據庫讀寫分離

優勢:簡單有效、下降數據庫單臺壓力;
缺點:讀寫分離,增長程序難度,架構變複雜,維護難度增長;
技術點:數據庫主從同步部署,擴展數據訪問模塊,實現讀寫分離;

應用服務集羣

數據庫層面是緩解了,可是應用程序層面也出現了瓶頸,因爲訪問量增大,加上早期程序員水平有限寫的代碼也很爛,人員流動性也大,很難去維護和優化。因此,很經常使用的辦法仍是「堆機器」。

應用出現瓶頸 負載均衡集羣

優勢:增長服務器和HA機制,系統性能及可用性獲得保證;
缺點:應用之間緩存、Session一致性問題;
技術點:負載均衡;

經過集羣解決高併發、海量數據問題的經常使用手段,實現系統的可伸縮性。經過負載均衡調度器,可將用戶訪問分發到集羣中的某臺 Server 上,應用服務器的負載壓力再也不成爲整個網站的瓶頸。

集中式緩存、Session集中存儲

加機器誰都會加,關鍵是加完以後得有效果,加完以後可能會引起一些問題。例如很是常見的:集羣應用之間頁面輸出緩存和本地緩存一致性的問題,Session保存的問題……

集中式緩存 Session集中存儲

優勢:應用之間緩存、Session一致,存儲無限制,能夠擴展;
缺點:不如本地緩存訪問快,緩存服務器、Session服務器等仍存在單點問題;
技術點:緩存服務器部署、Session集中存儲方案;

動靜分離

動靜分離也是提升網站響應速度的一種經常使用方式。將動態請求與靜態請求分離開,儘可能減小對應用服務器的壓力。同時,能夠再進一步對靜態請求,進行緩存,以加快響應速度。能夠須要開發人員配合(把靜態資源放獨立站點下),也能夠不須要開發人員配合(利用7層反向代理來處理,根據後綴名等信息來判斷資源類型)。

使用動靜分離

優勢:減輕應用負載壓力,針對靜態文件緩存;
缺點:靜態文件緩存更新失效問題;
技術點:動靜分離、靜態文件緩存方案;

反向代理和CDN加速網站響應

使用反向代理和CDN加速網站響應:CDN 和反向代理的基本原理都是緩存,區別在於:

  1. CDN部署在網絡提供商的機房;
  2. 反向代理則部署在網站的中心機房;

使用 CDN 和反向代理的目的都是儘早返回數據給用戶,一方面加快用戶訪問速度,另外一方面也減輕後端服務器的負載壓力。

使用反向代理和 CDN 加速網站響應

優勢:減輕應用負載壓力,異地緩存有效解決不一樣地方用戶訪問過慢的問題;
缺點:成本大幅增長,架構進一步複雜化,也維護難度進一步增大,靜態文件緩存更新失效問題;
技術點:CDN、反向代理方案;

使用NoSQL和搜索引擎

到這裏,已經基本作到了DB層面和應用層面的橫向擴展了,能夠開始關注一些其它方面,例如:站內搜索的精準度,對DB的依賴,開始引入全文索引、NoSQL

NoSQL和搜索引擎都是源自互聯網的技術手段,對可伸縮的分佈式特性具備更好的支持。應用服務器則經過一個統一數據訪問模塊訪問各類數據,減輕應用程序管理諸多數據源的麻煩。

使用NoSQL和搜索引擎

優勢:下降DB依賴;
缺點:單點問題,談不上高可用;
技術點:NoSQL、搜索引擎、分佈式;

到目前爲止,一個可以承載日均百萬級訪問量的中型網站架構基本介紹完了。

如何保證高可用

在作擴展知足了基本的性能需求後,咱們會逐漸關注「可用性」(也就是咱們一般聽別人吹牛時說的SLA、幾個9)。如何保證真正「高可用」,也是個難題。

對關鍵應用/服務,作集羣冗餘負載,這也是保證高可用比較經常使用的手段:

  1. 文件系統、數據庫系統集羣;
  2. 靜態內容服務器集羣;
  3. CDN服務器集羣;
  4. 反向代理服務器集羣;
  5. 負載均衡調度器集羣;
  6. 分佈式NoSQL服務器集羣;
  7. 搜索引擎服務器集羣;
  8. 分佈式緩存服務器集羣;
  9. 分佈式Session服務器集羣;

使用集羣冗餘負載 保證高可用

優勢:集羣負載,保證高可用;
缺點:數據一致性、數據有狀態問題;
技術點:負載調度器、集羣方案;

截止目前爲止,都沒有怎麼去改動應用程序的架構,或者說通俗點,都不怎麼須要大面積的修改代碼。

若是上面那些手段都用光了,仍是支撐不住怎麼辦?不停的加機器也不是辦法啊?

應用垂直拆分

隨着業務愈來愈複雜,網站的功能愈來愈多,雖然部署層面是採用的集羣,可是應用程序架構層面仍是「集中式」的,這樣會致使不少耦合,不便於開發、維護,並且容易「一榮俱損」。因此,一般會把網站拆分出不一樣的子站點來單獨宿主。

經過分而治之的手段將整個網站業務分紅不一樣的產品線,如首頁、商鋪、訂單、賣家、買家等拆分紅不一樣的產品線,分歸不一樣的業務團隊負責。各個應用之間能夠經過創建一個超連接創建關係,也能夠經過消息隊列進行數據分發。

應用垂直拆分(分壓,解耦)

優勢:下降耦合、分壓;
缺點:應用架構複雜;
技術點:業務抽取拆分;

業務垂直分庫

應用都拆了,因爲單個數據庫的鏈接,QPS,TPS,I/O處理能力都很是有限,DB層面也能夠去作垂直分庫操做。

業務垂直分庫 分壓 解耦

優勢:下降DB耦合、分壓DB;
缺點:數據訪問模塊複雜;
技術點:業務抽取拆分;

分佈式服務化

拆分應用和DB以後,其實仍是會有不少問題。不一樣的站點,裏面可能會有相同邏輯和功能的代碼。固然,對於一些基礎的功能咱們能夠封裝DLL或者Jar包去處處提供引用,可是這種強依賴也很容易形成一些問題(版本問題、依賴關係等處理起來很是麻煩)。

既然每個應用系統都須要執行許多相通的業務操做,好比用戶管理、商品管理等,那麼能夠將這些共用的業務提取出來,獨立部署。這樣,傳說中的SOA的價值就獲得體現了。

分佈式服務化(解耦,去重複)

優勢:服務統一管理,提供重用度;
缺點:應用架構更復雜;
技術點:業務抽取拆分、服務化技術方案;

消息隊列

應用、服務之間仍是會出現一些依賴問題,這時候,高吞吐量的解耦利器出現了

消息隊列(服務間異步解耦 高吞吐量)

優勢:提升吞吐量、應用、服務之間解耦;
缺點:存在消息消費延遲問題;
技術點:消息隊列技術方案;

分庫分表

*後,再介紹一個大型互聯網公司都用的絕技–分庫分表。我的經驗,不是業務發展和各方面很是迫切,不要輕易走這一步

由於分庫分表誰都會幹,關鍵是拆完以後怎麼辦。目前,市面上尚未徹底開源免費的方案,能讓你一勞永逸地解決數據庫拆分問題。

分庫分表:

  1. 橫向拆分;
  2. 縱向拆分;
  3. 分佈式數據庫訪問層;
  4. 數據庫中間件(代理);

網站架構總結

上面講述了在網站業務發展的不一樣階段,會面臨不一樣的問題,針對不一樣的問題,會選擇不一樣的架構。大型網站架構就是在不一樣階段時解決不一樣問題的過程當中慢慢演進來的。

*後幾句話,送給有緣的你:

  1. 一切以解決業務目標爲首要任務;
  2. 沒有以業務爲目標的任何架構、技術,都是毫無心義的耍流氓;
  3. 再牛逼的架構、再牛逼的技術,不可以解決業務的問題,你也只能算是會架構、會技術的工匠,而不能算是真正意義上的架構師;
  4. 業務成就了技術,平臺成就了人,事業成就了人,而不是相反;

本文思惟導圖,以下:

本文思惟導圖
相關文章
相關標籤/搜索