名詞解釋:併發在作業系統中,是指乙個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同乙個處理機上執行,但任意乙個時刻上只有乙個程式在處理機上執行。
我們說的高併發是什麼?上面的定義明顯不是我們通常所言的併發,在網際網路時代,所講的併發、高併發,通常是指併發訪問。也就是在某個時間點,有多少個訪問同時到來通常如果乙個系統的日pv在千萬以上,有可能是乙個高併發的系統,但是有的公司完全不走技術路線,全靠機器堆,這不在我們的討論範圍。
高併發的問題,我們具體該關心什麼?
qps達到極限,各種情況如何處理?隨著qps的增長,每個階段需要根據實際情況來進行優化,優化的方案也與硬體條件、網路頻寬息息相關。
假設單頁面只有乙個sql查詢,那麼100qps意味這1秒鐘完成100次請求,但是此時我們並不能保證資料庫查詢能完成100次方案:資料庫快取層、資料庫的負載均衡
qps達到800假設我們使用百兆頻寬,意味著**出口的實際頻寬是8m左右
假設每個頁面只有10k,在這個併發條件下,百兆頻寬已經吃完
方案:cdn加速、負載均衡
qps達到1000假設使用memcache快取資料庫查詢資料,每個頁面對memcache的請求遠大於直接對db的請求
memcache的悲觀併發數在2w左右,但有可能在之前內網頻寬已經吃光,表現出不穩定
方案:靜態html快取
qps達到2000這個級別下,檔案系統訪問鎖都成為災難
方案:做業務分離,分布式儲存
一、資料庫快取層的優化mysql等一些常見的關係型資料庫的資料都儲存在磁碟中,在高併發場景下,業務應用對mysql產生的增、刪、改、查的操作造成巨大的i/o開銷和查詢壓力,這無疑對資料庫和伺服器都是一種巨大的壓力,為了解決此類問題,快取資料的概念應運而生
快取資料是為了讓客戶端很少甚至不訪問資料庫伺服器進行資料的查詢,高併發下,能最大程度的降低對資料庫伺服器的訪問壓力極大地解決資料庫伺服器的壓力
使用者請求-->資料查詢-->連線資料庫伺服器並查詢資料-->將資料快取起來(html、記憶體、json、序列化資料)-->顯示給客戶端
使用者再次請求或者新使用者訪問-->資料查詢-->直接從快取中獲取資料-->顯示給客戶端
二、cdn加速cdn的全稱是content delivery network,即內容分發網路,盡可能避開網際網路上有可能影響資料傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定
在網路各處放置節點伺服器所構成的在現有的網際網路基礎之上的一層智慧型虛擬網路
cdn系統能夠實時地根據網路流量和各節點的連線、負載狀況以及到使用者的距離和響應時間等綜合資訊將使用者的請求重新導向離使用者最近的服務節點上
本地cache加速,提高了企業站點(尤其含有大量和靜態頁面站點)的訪問速度
跨運營商的網路加速,保證不同網路的使用者都得到良好的訪問質量
遠端訪問使用者根據dns負載均衡技術智慧型自動選擇cache伺服器
自動生成伺服器的遠端mirror(映象)cache伺服器,遠端使用者訪問時從cache伺服器上讀取資料,減少遠端訪問的頻寬,分擔網路流量,減輕原站點web伺服器負載等功能
廣泛分布的cdn節點加上節點之間的智慧型冗餘機制,可以有效地預防黑客入侵
三、web伺服器的負載均衡、請求分發基於url等應用資訊的負載均衡
nginx的proxy是它乙個很強大的功能,實現了7層負載均衡
功能強大,效能卓越,執行穩定
配置簡單靈活
能夠自動剔除工作不正常的後端伺服器
上傳檔案使用非同步模式
支援多種分配策略,可以分配權重,分配方式靈活
內建策略,擴充套件策略
內建策略:ip hash、加權輪詢
擴充套件策略:fair策略、通用hash、一致性hash
首先將請求都分給高權重的機器,直到該機器的權值降到了比其他機器低,才開始將請求分給下乙個高權重的機器
當所有後端機器都down掉時,nginx會立即將所有機器的標誌位清成初始狀態,以避免造成所有的機器都處於timeout的狀態
nginx內建的另乙個負載均衡的策略,流程和輪詢很類似,只是七種的演算法和具體的策略有些變化
ip hash演算法是一種變相的輪詢演算法
如何解決高併發和大流量
名詞解釋 併發 在作業系統中,是指乙個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同乙個處理機上執行,但任意乙個時刻上只有乙個程式在處理機上執行。我們說的高併發是什麼?上面的定義明顯不是我們通常所言的併發,在網際網路時代,所講的併發 高併發,通常是指併發訪問。也就是在某個時間...
如何解決web大流量,高併發問題
對於當今大流量的 每天幾千萬甚至上億的流量,是如何解決訪問量問題的呢?以下是一些總結的方法 第一,確認伺服器硬體是否足夠支援當前的流量。普通的p4伺服器一般最多能支援每天10萬獨立ip,如果訪問量比這個還要大,那麼必須首先配置一台更高效能的專用伺服器才能解決問題,否則怎麼優化都不可能徹底解決效能問題...
如何解決高併發
如何解決高併發 快取靜態頁面 伺服器分離 優化資料庫結構,多做索引 資料庫集群和庫表雜湊 不要頻繁得使用new物件,能使用單例模式就使用,對於utility型別的類通過靜態方法來訪問。使用執行緒安全的集合物件vector hashtable 使用執行緒池 盡量使用快取,包括使用者快取,資訊快取等,多...