標籤:

傻瓜都能看懂的高並發量伺服器架構

先普及一下基礎知識:

一、硬體條件。確認伺服器硬體是否足夠支持當前的流量,一台普通的P4伺服器一般最多能支持每天10萬獨立IP,如果訪問量比這個還要大, 那麼必須首先配置一台更高性能的專用伺服器才能解決問題 ,另外就是增加伺服器數量,否則怎麼優化都不可能徹底解決性能問題。

二、資料庫。優化資料庫訪問前台實現完全的靜態化當然最好,可以完全不用訪問資料庫,不過對於頻繁更新的網站, 靜態化往往不能滿足某些功能。緩存技術就是另一個解決方案,就是將動態數據存儲到緩存文件中,動態網頁直接調用 這些文件,而不必再訪問資料庫,WordPress和Z-Blog都大量使用這種緩存技術。如果確實無法避免對資料庫的訪問,那麼可以嘗試優化資料庫的查詢SQL,避免使用 Select * from這樣的語句,每次查詢只返回自己需要的結果,避免短時間內的大,盡量做到"所查即所得" ,遵循以小表為主,附表為輔,查詢條件先索引,先小後大的原則,提高查詢效率.量SQL查詢。

三、禁止盜鏈。外部網站的圖片或者文件盜鏈往往會帶來大量的負載壓力,因此應該嚴格限制外部對於自身的圖片或者文件盜鏈,好在目前可以簡單地通過refer來控制盜鏈,Apache自 己就可以通過配置來禁止盜鏈,IIS也有一些第三方的ISAPI可以實現同樣的功能。當然,偽造refer也可以通過代碼來實現盜鏈,不過目前蓄意偽造refer盜鏈的還不多, 可以先不去考慮,或者使用非技術手段來解決,比如在圖片上增加水印。

四、控制大文件的下載。大文件的下載會佔用很大的流量,並且對於非SCSI硬碟來說,大量文件下載會消耗 CPU,使得網站響應能力下降。因此,盡量不要提供超過2M的大文件下載,如果需要提供,建議將大文件放在另外一台伺服器上。

五、鏡像分流。將文件放在不同的主機上,提供不同的鏡像供用戶下載。比如如果覺得RSS文件佔用流量大,那麼使用FeedBurner或者FeedSky等服務將RSS輸出放在其他主機上,這樣別人訪問的流量壓力就大多集中在FeedBurner的主機上,RSS就不佔用太多資源了。

六、做好流量監控。在網站上安裝一個流量分析統計軟體,可以即時知道哪些地方耗費了大量流量,哪些頁面需要再進行優化,因此,解決流量問題還需要進行精確的統計分析才可以。推薦使用的流量分析統計軟體是Google Analytics(Google分析)。

接下來我們來說說伺服器架構,前段時間我們請到了國內伺服器頂級攻城獅,他把伺服器那點事講得非常通透簡單。對於一個剛起步的創業公司,不需要考慮太多複雜的伺服器架構,能把業務跑起來就行了。但是在早期業務邏輯設計時,懂一些稍微複雜的伺服器架構的邏輯,後面可以少走很多彎路。

下面這個圖估計大家都明白,這就是最基礎的伺服器架構。傻瓜式的方法是把應用伺服器、文件伺服器、資料庫伺服器全部混合在一起,呵呵呵!但這並不是最科學的。

當業務量持續增加到一定量以後,執行應用程序、讀寫文件、訪問資料庫應該有所區分,保證各自的需求都能得到滿足,這時候你需要考慮把應用伺服器、文件伺服器、資料庫伺服器分離,這個時候的伺服器架構應該是下面這樣的,它是由三個獨立的伺服器組成,各司其職。

隨著業務量持續增加,應用程序訪問緩存數據會成為瓶頸,這個時候需要增加本地緩存,有的也需要分散式緩存。分散式緩存是指緩存部署在多個伺服器組成的伺服器集群中,以集群的方式提供緩存服務,其架構方式主要有兩種,一種是以JBoss Cache為代表的需要同步更新的分散式緩存,一種是以Memchached為代表的互不通信的分散式緩存。如下圖:

接下來,需要更多台應用伺服器以應對複雜的業務邏輯,同時需要負載均衡調度伺服器來調度和分配應用伺服器的工作任務。

再往後,需要考慮資料庫伺服器的承壓能力,通常可以採用主從式資料庫伺服器架構,把讀、寫兩部分分開,既可以提高數據訪問的安全性,也能提高數據讀寫的效率。

隨著業務量暴增,單一區域的伺服器帶寬將不能承載全國的業務需求,這時候需要增加反向代理和CDN伺服器。CDN系統能夠實時地根據網路流量和各節點的連接、負載狀況以及到用戶的距離和響應時間等綜合信息將用戶的請求重新導向離用戶最近的服務節點上。其目的是使用戶可就近取得所需內容,解決 Internet網路擁擠的狀況,提高用戶訪問網站的響應速度。

同樣,伺服器架構師應該分析文件伺服器和資料庫伺服器的網路讀寫速度,進一步部署分散式文件和分散式資料庫的架構。

對於有搜索和大量查詢的網路業務,還需要增加獨立的搜索引擎和NoSQL伺服器。

對於更複雜的系統,還需要進一步拆分應用伺服器,增加消息隊列伺服器。增加消息隊列伺服器有以下幾點好處:

1,由於消息隊列伺服器的速度遠遠高於資料庫伺服器,所以能夠快遞處理並返回數據;

2,消息隊列伺服器具有更好的擴展性;

3,在高並發的情況下,延遲寫入資料庫,可以有效降低資料庫的壓力。

對於一些超大型綜合互聯網業務,應用伺服器也需要分散式的架構,這個時候在不同業務的應用伺服器之間做好消息協同會有較大的挑戰。

讀完後,是不是感覺很簡單,基本上就是圍繞著應用伺服器、文件伺服器、資料庫伺服器,以及不斷提升其性能需要增加的伺服器。好在如今騰訊雲、阿里雲、金山雲都提供了完整的解決方案,有空去他們官網看看,一周即可完成百萬並發業務部署,一個月時間完成千萬並發業務部署也不是不可能。

aHR0cDovL3dlaXhpbi5xcS5jb20vci9WVHI0NERyRTFtZXByWDZEOTI5SA== (二維碼自動識別)

推薦閱讀:

如何求解傅里葉17線難題?
從零開始寫個編譯器吧 - tao 語言的文法定義(上)
程序、技術、潮流與時尚
C++中如何把一個變數的值作為另一個變數的名?
哪些字體適合程序員用來維護代碼?

TAG:程序 | 参考 |