【轉載】架構師談五層網站架構

来源:http://www.cnblogs.com/bluedoctor/archive/2015/12/29/5084616.html
-Advertisement-
Play Games

一些大型網站常用到的技術概覽,經驗談。


原文地址:http://toutiao.com/news/6232654162220286465/?tt_from=mobile_qq&utm_campaign=client_share&app=news_article&utm_source=mobile_qq&iid=3167618386&utm_medium=toutiao_ios

目前網站架構一般分為網頁緩存層、負載均衡層、Web層、資料庫層、文件伺服器層。我們可以依次用這五層對網站架構進行討論,為了增強說服力,我將用如下三個併發較大的生產環境來說明。

  • 電子商務網站(併發最大峰值2900,日PV500萬左右)

  • 電子廣告網站(併發最大峰值1500,日PV150萬左右)

  • 大型CDN門戶廣告網站(併發最大峰值5000,日PV5000萬左右)

1.網頁緩存層

首先說網頁緩存層,比如CDN租憑,其效果比公司自己部署Squid/Varnish要好,它們專業、價格低廉(比如:快網、藍訊、阿裡、騰訊)而且覆蓋的城市更多,自己架設Squid/Varnish是次選。

很多朋友喜歡嘗試自建CDN,這是一項吃力不討好的工作,未必能達到預期的目標,系統架構師應該在架設網站初期就規劃好,不要等到網站流量及壓力巨大時才去規劃。事實上,這一層有很多優秀的開源軟體都能勝任,比如傳統的Squid Cache。另外,越來越多的朋友喜歡嘗試在自己的網站是用Nginx和Varnish作為自己的網頁緩存。事實上,Nginx已經具備Squid所擁有的Web緩存加速功能。此外,Nginx對多核CPU的利用勝過Squid,現在越來越多的架構師都喜歡將Nginx同時作為”負載均衡伺服器”與”Web緩存伺服器”來使用,大家可以根據自己的情況,來決定究竟使用那種軟體作為網站的網頁緩存。

2.負載均衡層

我們熟悉的硬體/軟體技術有F5、LVS/HAProxy,還有Nginx,它們的性能都是非常優異的,現在F5/LVS在全世界範圍內應用,而且淘寶現在升級架構,也用了LVS取代了F5。

HAProxy可能大家不是特別熟悉,單HAProxy+Keepalived確實在生產環境下表現優異,強大的吞吐能力,穩定性能比之硬體過猶不及,並且淘寶也在大規模地推廣使用HAProxy,有興趣的朋友也可以關註。

再來聊聊Nginx,我已經將Nginx+Keepalived架構用於各種生產環境,經過長期的線上觀察,發現Nginx作為負載均衡器/反向代理也很穩定,如果兵發壓力過大,我們前面可以用F5/LVS作為最前端的負載均衡,而將Nginx作為七層代理,這樣的效果其實也不差,所以說負載層壓力不算特別大。

3.Web層

Web層壓力比較大的網站現在都換成了Nginx作為Web應用伺服器,事實上,它的抗併發能力確實超過了預期。我現在維護的一家門戶網站,高峰期時某台Nginx應用伺服器的併發達到了一萬以上,但是Nginx也很穩定地提供服務。在實際的生產環境中,如果我們考慮到後端的資料庫服務時,一萬兵法應該也算是一個比較大的數值了。

另外,Linux集群有一個優勢,就是它的高擴展性,就算網站的併發有一萬以上,後端的Web服務是Nginx,我們多加幾台Nginx伺服器即可。在實際的線上維護時發現,高峰期間,實際上每台Web的併發不算是特別大,所以我們也能通過技術手段對這一層的網站的壓力加以剋服。

4.文件伺服器層

現在大家生產伺服器一般是使用如下四種作為自己的文件伺服器層:

1、單NFS+備份NFS作為文件伺服器,這樣做的好處是維護方便,但存在單點故障,需要人手動干預。

2、DRBD+HeartBeat+NFS高可用文件伺服器,維護方便,也不存在單點故障,單隨著訪問量的增大,後期一樣存在壓力過大的情況。

3、分散式文件系統MFS、Glustr。MFS易用、穩定、對海量小文件很高效,而且新版的MFS解決了MasterServer存在單點故障的問題,國內越來越多的公司在使用MFS。事實上,分散式文件系統是解決文件伺服器壓力過大的最終途徑,但也存在隱患,網站功能越多,攤子越大,機器越多,維護起來越複雜。

4、如果是淘寶和騰訊這種巨量級的公司,可以嘗試開發自己的分散式文件系統了。大家可以嘗試根據自己網站的情況,來決定究竟選擇哪一種如那件作為自己的文件伺服器。

5.資料庫層

資料庫層的壓力,我覺得網站的PV和併發上去以後,資料庫這塊的壓力是最大的,CND大型廣告網站用的是Oracle RAC方案,它保證了數據的搞可用性,當然了價格也是非常昂貴的(如果使用高配置的PC伺服器,Oracle一般按照CPU個數收費);那麼字啊使用免費的MySQL數據時,面對這種併發壓力打的情況,我們應該怎麼辦?

首先,可以在資料庫中加入memcached數據緩存,在實際線上使用時,發現memcached功能強大、性能穩定,在數據流頻繁讀寫,壓力過大的情況下,增加一臺memcached資料庫緩存伺服器的效果能超過我們的預期。

資料庫的硬體方面可以考慮投入磁碟隊列做成RAID10,如果資金充裕,磁碟可以用固定硬碟來代替SAS硬碟,畢竟資料庫的壓力主要來自磁碟I/O方面。

合理的設計MySQL資料庫的架構,事實上,在生產環境下,一主多從、讀寫分離是靠譜的設計方案,從MySQL的負載均衡推薦大家使用LVS,這是因為當後面的MySQL機器超過十臺時,HAProxy在這方面的性能不如LVS。

如果網站的業務量過大,可以採用分庫的方法,比如將網站的業務量分成Web、BBS、Blog等幾組,每一組均採用主從還夠,這樣的設計避免了單組資料庫壓力過大的情況。

另外我們應該還配合公司的MySQL、DBA和開發人員,在資料庫參數優化、SQL語句優化、數據切分上多下功夫,避免資料庫成為網站的瓶頸。

後續我會發佈如何優化MySQL,從硬體–安裝方式–配置文件優化-SQL優化-status狀態優化–慢查詢優化–表優化-MySQL高可用的擴展。

網站架構關註方向小結

1、我們的網站放在IDC機房內,首選考慮的就應該是如何防止DDOS/CC攻擊。DDOS攻擊雖然沒什麼技術含量,但真正攻擊過來還是很讓人煩躁的。在搭建網站或系統時,我們應該儘可能地瞭解和熟悉各種防火牆的技術指標參數,為客戶提供性價比最好的防火牆方案也是保證整套系統或網站成功的因素之一。

2、業務邏輯設計要合理,尤其是程式代碼層的相關設計,如果程式應用架構和業務實現不夠優化,一個本來很簡單的實現卻繞了很多彎路才實現,那麼多強的硬體也沒有用。

3、也許是受張宴先生的影響,現在越來越多的朋友把註意力放在Nginx上了。其實Apache的抗併發能力並不弱。在生產環境下,如果我們的網站不是廣告型網站、門戶型網站或游戲型網站,2000併發已經是一個很驚人的數字。另外這個僅僅是一臺Apache的併發,一個中等規模的網站,後端至少會有3~4台Apache的Web應用程式,所以,全部加起來我們的網站差不多可以頂住上萬的併發,上萬的併發量對網站根本沒有什麼大的影響。當然,如果換作Nginx作為Web應用伺服器更沒問題了。另外,就算併發量非常大,我們最前端的F5/LVS還是頂得住的,無非是在後端多加幾台Web應用伺服器。所以說,併發量大不可能成為Web應用伺服器的瓶頸。

4、DRBD+HeartBeat+NFS文件伺服器在初期沒什麼壓力,但隨著網站的用戶數和流量越來越大,它可能會感覺有些頂不住了,特別是用戶頻繁訪問圖片文件時。我們在公司內部也測試郭Google的分散式文件系統,但是一直沒敢用於生產環境中,最後還是決定採用Nginx作為中層代理,增加Squid反向代理伺服器集群的方法來解決文件伺服器的壓力問題。另外,如果資金充裕,最前端也應該租售CDN用於網站加速。

5、將Nginx作為中層代理使用是一件性價比非常高的事情。如果擔心單點Nginx故障,我們可以設置3台以上的Nginx負載均衡器,而它們的load balance可以讓F5/LVS來做。Nginx在這層可以利用其強大的正則處理能力很完美地處理客戶端對靜態文件的訪問,比如將html、jpg、png、css等交給後端的Squid/varnish集群處理,冬天的PHP/JSP訪問請求交給後端的PHP/Tomcat集群伺服器處理,動靜分離,最大化地發揮Nginx作為負載均衡器/反向代理的優勢。

如果沒有硬體的F5 Big-Ip設備,我們也可以用軟體LVS來實現,這樣成本會相當低。Nginx則利用其強大的正則功能,並根據URL或客戶請求文件的尾碼名來做動靜分離,或者輪訓不同的Squid/Varnish反向代理群組。

6、上線的項目在後期無論怎麼優化或架構,最後其壓力最大的肯定是MySQL資料庫,尤其是那些動態網站。我們在維護時也發現,MySQL資料庫在頻繁地讀寫,如何優化MySQL資料庫及設計高性能高可用的MySQL資料庫架構一致是我們關註和研究的方向,我也希望大家在工作中註意這個問題。

7、系統或網站的構建、運維和調試並不只是一個人的事情,它是整個團隊合作努力的結果,需要整個團隊的開發人員、系統工程師和DBA及測試人員共同努力,要寫出安全、效率高、優美的代碼,需要花費開發人員大量的心血。

作者:徐亮偉

原文:http://www.xuliangwei.com/xubusi/188.html

快來測測你的身價,點擊閱讀原文開始測試↓


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 回到目錄大家好,今天有時間來介紹一下Lind.DDD框架里的消息機制,消息發送這塊一般的實現方法是將Email,SMS等集成到一個公用類庫里,而本身Email和SMS沒什麼關係,它們也不會有什麼介面約定,即你想實現某種消息的多態發送,不需要程式代碼,基本不可能實現,而在Lind.DDD裡面,大叔將它...
  • 你可以從你們現在項目裡面隨便找幾處註釋,看看寫註釋的代碼是不是存在如下兩種毛病之一:1. 命名不准確;2. 方法太長(超過50行)。如果你找到的代碼沒有出現上面兩種毛病而註釋依然存在,那你再看看這個註釋是否有實際意義,是不是這個註釋不要也無所謂呢。註釋是惡魔這個觀點可能你第一次看到,你可能很難接受,...
  • 一、 生成對象的原始模式假定我們把Bob看成一個對象,它有"name"和"age"兩個屬性。 var person = { name : '', age : }現在,我們需要根據這個原型對象的規格(schema),生成兩個實例對象。 var person1 = {}; // 創建...
  • 編者按:本文由PMCAFF產品經理社區原創專欄作者 喬向陽 翻譯自 http://goodui.org/一個好的界面設計應該擁有高轉化率且方便用戶使用,換句話說:既能達到商業目的又能滿足方便易用的要求。有一個設計咨詢公司根據自己的客戶案例,總結了 75 個經過實踐證明的原則:之前國內流傳這篇文章的前...
  • Reactor事件驅動的兩種設計實現:面向對象 VS 函數式編程這裡的函數式編程的設計以muduo為例進行對比說明;Reactor實現架構對比面向對象的設計類圖如下:函數式編程以muduo為例,設計類圖如下:面向對象的Reactor方案設計我們先看看面向對象的設計方案,想想為什麼這麼做; 拿出Rea...
  • 最近的工作比較清閑,公司目前想開展一個財富類的P2B的一個門戶,另外碰上移動公司核心測試,元旦後要飛深圳出差,所以這個交叉點工作安排下去了,自己比較清閑一些,我也把自己開展南京生活這個網站的歷程進行記錄下來。想要開展移動互聯網創業,就要有自己的門戶,怎麼把這個門戶弄起來,確實需要慎重思考。但是也不需...
  • 回到目錄Lind.DDD框架里提出了對數據集的控制,某些許可權的用戶為某些表添加某些數據集的許可權,具體實現是在一張表中存儲用戶ID,表名,檢索欄位,檢索值和檢索操作符,然後用戶登陸後,通過自己許可權來構建對應表的查詢語句,即動態構建表達式樹,這種操作一些被寫在業務層上,我們可以在業務層需要進行數據集許可權...
  • 1.橋接模式 個人覺得有些類似於抽象工廠模式2.命令模式 提供了一個中介,中介集成了各類功能,客戶端可以添加刪除某些功能,可以執行某些功能
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...