很多平台一旦做大了,平台的流量就會陡增,同時並發訪問的流量也會暴增,原本規划的硬件配置就無法滿足當下的流量問題。
那么如何處理好高並發的流量問題呢?
小編將這些分為2個方面:架構層面和網站本地項目層面。
一、架構層面
1、硬件升級
假設一台服務器最多能支持每天10萬獨立IP,如果訪問量增大的話,那么必須升級這台服務器的配置才能解決問題,否則怎么優化都不可能徹底解決性能問題。
這對於企業用戶來說不是問題,買就是了。
為了避免采購浪費,建議先對服務器做一下壓力測試,看看到底能支持多少訪問量。
詳細參考《怎么做服務器壓力測試?》
建議使用:
阿里雲服務器ECS,阿里雲的口碑不用說了,最主要的是可以彈性擴展升級。
阿里雲哪個節點服務器好?ping一下看看:https://ping.gaomeluo.com/aliyun/
2、負載均衡
它是對多台雲服務器進行流量分發的負載均衡服務,讓整個服務器群來處理網站的請求。負載均衡支持億級連接和千萬級並發,可輕松應對大流量訪問,滿足業務需求。
一般有錢的公司,可以購買專門負責負載均衡的硬件,效果肯定會很好。
但是對於大部分公司,會選擇廉價有效的方法擴展整個系統的架構,來增加服務器的吞吐量和處理能力,以及承載能力。通常會選擇相對成熟的成品架構,比如:阿里雲的負載均衡SLB
詳細可參考《阿里雲負載均衡SLB怎么用》
3、服務器集群
服務器集群就是指將很多服務器集中起來一起進行同一種服務,在客戶端看來就像是只有一個服務器。集群可以利用多個計算機進行並行計算從而獲得很高的計算速度,也可以用多個計算機做備份,從而使得任何一個機器壞了整個系統還是能正常運行。
如果你的企業、平台夠大,那么完全可以自己來搞集群。但是對於一遍企業來講,這種服務器框架耗錢、耗時、耗力。好在現在雲服務廠商都提供了集群服務器,比較有名的就是阿里雲集群。這也給企業省去不少人力、時間成本。
詳細可參考《如何搭建阿里雲集群服務器》
4、分布式結構
分布式結構就是將一個完整的系統,按照業務功能,拆分成一個個獨立的子系統,在分布式結構中,每個子系統就被稱為“服務”.這些子系統能夠獨立運行在web容器中,它們之間通過RPC方式通.
好處就是系統之間的耦合度大大降低,可以獨立開發、獨立部署、獨立測試,系統與系統之間的邊界非常明確,排錯也變得相當容易,開發效率大大提升。
提示一下:
負載均衡:
是一種優化手段,目的是為了讓集群中的每台機器的負載保持均衡,這樣就不會出現集群中某台機器掛了的情況;
集群:
多台機器做相同的業務,對外如一台機器在做事情一樣,集群中任意一台機器掛了沒有影響,因為其他機器還在工作;
分布式:
一個業務在不同的物理點上做,比如web服務器、應用服務器、數據庫服務器,這三個節點分開部署在不同的機器上,共同完成一個業務;分布式的特點是,每個節點都不能掛,否則這個業務就不能完成了;當然,我們可以給分布式中的每個節點都做集群處理,這樣可以降低分布式系統的單節點故障;
所以,針對自己業務量大小,對上述的負載均衡、服務器集群、分布式結構,任意選用方案。
二、網站本地項目層面
1、頁面靜態化
前台實現完全的靜態化最好,可以完全不用訪問數據庫。這樣服務器的壓力就減輕了不少。
這點我們可以借鑒一些比較成熟的框架方案,比如說dedecms、帝國cms、wordpress等,他們都可以對已產生的網頁生成純靜態頁面,每次更新內容,會再次生成純靜態頁面。
另外還建議,頁面中的圖文進行動靜分離處理,把頁面用到的圖片放到專用存儲空間(比較常見的有阿里雲OSS ),減少網站服務器的壓力,另外也建議動靜分離的那一部分也做一下CDN加速。讓圖片等相對較大的資源才CDN節點獲取,提高網站打開速度。
2、緩存技術(Memcache、Redis等)
緩存技術就是另一個解決方案,就是將動態數據存儲到緩存文件中,動態網頁直接調用 這些文件,而不必再訪問數據庫。
簡單羅列一下redis和memcache的區別
- Redis和Memcache都是將數據存放在內存中,都是內存數據庫。不過memcache還可用於緩存其他東西,例如圖片、視頻等等;
- Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲;
- 虛擬內存--Redis當物理內存用完時,可以將一些很久沒用到的value 交換到磁盤;
- 過期策略--memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire 設定,例如expire name 10;
- 分布式--設定memcache集群,利用magent做一主多從;redis可以做一主多從。都可以一主一從;
- 存儲數據安全--memcache掛掉后,數據沒了;redis可以定期保存到磁盤(持久化);
- 災難恢復--memcache掛掉后,數據不可恢復; redis數據丟失后可以通過aof恢復;
- Redis支持數據的備份,即master-slave模式的數據備份;
- 應用場景不一樣:Redis出來作為NoSQL數據庫使用外,還能用做消息隊列、數據堆棧和數據緩存等;Memcached適合於緩存SQL語句、數據集、用戶臨時性數據、延遲查詢數據和session等。
參考一下開源案例《【圖文】wordpress如何開啟Memcached緩存來加速網站?》
3、數據庫優化
數據庫的優化總結為如下三點
1、數據庫分表技術
當一張的數據達到幾百萬時,你查詢一次所花的時間會變多,如果有聯合查詢的話,很有可能會死在那兒了。分表的目的就在於此,減小數據庫的負擔,縮短查詢時間。
可參考《mysql數據庫如何分表》
2、數據庫讀寫分離
數據庫讀寫分離的基本原理是讓主數據庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從數據庫處理SELECT查詢操作。
可參考《如何實現數據庫讀寫分離》
3、表建立相應的索引
使用索引可快速訪問數據庫表中的特定信息。
可參考《mysql建表並創建索引》
對於一些成熟的數據庫產品,已經無需自己做分表,不需要自己做讀寫分離,只要主實例下有只讀實例以及開通讀寫分離功能即可。
比如說 阿里雲的RDS
詳情參考《RDS是否需要自己做分表、讀寫分離?》
4、CDN
將源站內容分發至最接近用戶的節點,使用戶可就近取得所需內容,提高用戶訪問的響應速度和成功率。解決因分布、帶寬、服務器性能帶來的訪問延遲問題,適用於站點加速、點播、直播等場景。
使用CDN的好處不僅僅是緩存網站靜態資源,還可以起到隱藏源IP的作用,這樣還可以應對一些小的流量攻擊,避免源IP泄露被人攻擊。
通常用的CDN就那么幾家,這里以阿里雲CDN為例:阿里雲CDN。
詳細參考《阿里雲CDN怎么使用》
5、禁止盜鏈
外部網站的圖片或者文件盜鏈往往會帶來大量的負載壓力,因此應該嚴格限制外部對於自身的圖片或者文件盜鏈。
這個操作相對就簡單了很多,如果你使用了阿里雲的CDN(對象存儲OSS),這些CDN/對象存儲OSS的控制台里可以一鍵設置防盜鏈。
詳細可參考官方教程:
《阿里雲CDN怎樣設置防盜鏈》
《阿里雲OSS怎樣設置防盜鏈》
6、控制大文件的上傳下載
大文件的下載會占用很大的流量,並且對於非SCSI硬盤來說,大量文件下載會消耗 CPU,使得網站響應能力下降。因此,盡量不要提供超過2M的大文件下載,如果需要提供,建議將大文件放在專門的存儲空間上(對象存儲OSS/COS)。
這個方法詳細參考:
《如何限制windows系統服務器上傳文件的大小》
《如何限制Linux系統服務器上傳文件的大小》
友情提示:
在產品的選用上,盡量都選用同一家的產品(要么都用阿里雲家的,要么都用其他雲家的),部分產品也盡量選同一區域。選同一家是為了,一來是方便管理,二來部分產品不適合兩家接入使用。選同一區域的,是為了同一區域可以內網互聯,還能節省一些費用。
(原文:流量大的網站 如何處理高並發流量問題)
