1. 程式人生 > >大並發server架構 && 大型站點架構演變

大並發server架構 && 大型站點架構演變

大型 amp mark height ebs 處理方法 競爭 位置 replicat

server的三條要求:

高性能:對於大量請求,及時高速的響應

高可用:7*24 不間斷,出現問題自己主動轉移。這叫fail over(故障轉移)

伸縮性:使用跨機器的通信(TCP

另外不論什麽網絡系統結構都能夠抽象成C/S架構。我們常說的B/S模式本質上也是C/S架構(瀏覽器看作client)。

一個典型的server架構:

技術分享

註: epoll是linux下最高效的網絡I/O

因為server須要高效處理大並發連接。因此多個位置均可能出現性能瓶頸,以下我們分析不同位置產生瓶頸的原因及其處理方法:

(一)數據庫瓶頸

【1】超過數據庫的連接數的解決方法:加上一層DAL。使用隊列等待

(隊列等待--數據訪問層)。也能夠再使用連接池DAL隊列服務+連接池)這樣不須要又一次連接。直接從池中找資源。

【2】超出時限的解決方法:

1)將業務邏輯放置應用server(操作系統業務處理),數據庫邏輯不要太復雜。僅僅是進行一定的輔助業務處理。

(2)緩存數據。可是面臨緩存的更新和同步的問題,例如以下:

1. 緩存的時效性。if timeout then 又一次去數據庫查詢。(將熱點數據放至緩存)這樣的方法實時性較差。

2. 一旦數據庫更新,馬上通知前端緩存更新。

Update之後改動更新緩存,實時性較好。可能實現起來較難。

假設內存不夠用,那麽就放到外部磁盤,使用緩存換頁機制(類似OS中的內存換頁)。

上面提到的這些都能夠使用開源產品實現:Nosql ---> (反sql

主要存放非關系的數據。key/value

還有Redis memached 緩存等分布式開源軟件。這些軟件是能夠跨server的。可是假設部署在應用server上,則是局部的,其它同級server訪問非常麻煩。

可是假設單獨布置機器,使用分布式緩存,這些就是全局的。全部的應用server都能夠訪問。方便快捷。

【3】數據庫讀寫分離

數據庫的查詢操作一般比寫操作頻繁,我們能夠對數據庫進行負載均衡。使用主server進行寫操作,從server進行讀操作。DAL進行讀寫分離,通過replication機制

進行主從server間的同步。

【4】數據分區(分庫、分表)

分庫:數據庫能夠依照一定的邏輯把表分散到不同的數據庫--->垂直分區(用戶表,業務表)

更加經常使用的分表--水平分區:將表中的記錄分至不同的數據庫,10條記錄分至10個數據庫,類似這樣,這樣的方式非常easy擴展水平結構。

(二)應用server瓶頸

加入任務server相應用server的任務分配進行負載均衡,當中又分為主動和被動兩種方案:

(1)應用server被動接受方案:

使用任務server實現負載均衡,暴露一個接口,任務server能夠當作一個client,應用server看作httpserver

任務server能夠監視應用server的負載,CPU/IO/並發/內存換頁高,查詢到信息後,選取負載最低(算法確定)的server來分配任務.

2應用server主動到任務server接受任務進行處理

應用server處理完自己的任務後主動向任務server申請求任務。

(1)的方式可能會造成不公平。(2)的缺點是假設應用server處理不同的業務。那麽可能任務server的編程邏輯會非常復雜。

當中任務server能夠設置多臺。彼此之間通過心跳聯系------>滿足 高可用性(fail over機制)。

如此一來(數據庫,緩存,應用server,任務server)不論什麽位置出現瓶頸就僅僅須要添加server好了。

為了高效的進行服務端的編程。我們也須要知道server性能四大殺手:

(1)數據拷貝 ----> 緩存來解決

(2)環境切換 -----> 理性創建線程:是否須要多線程。哪個好?單核server(採用狀態機的編程效率最佳,類似OS中的進程切換)

多線程可以充分發揮多核server的性能,也要註意線程間切換的開銷

(3)內存分配 ------> 內存池,降低向操作系統申請內存

(4)鎖競爭 -------> 通過邏輯盡量降低鎖的使用

以上的信息能夠歸納為以下的這張圖:

技術分享

我們接下來介紹實際中的大型站點架構的演變過程,和我們上面的問題處理流程基本一致:

[Step1]web server與數據庫分離

技術分享

技術分享

Apache/Nginx處理靜態(前端server) JBoss/Tomat處理動態 (後端server)

[Step2]緩存處理

技術分享

1.瀏覽器緩存降低對站點的訪問

2.前端server靜態頁面緩存降低對webserver的請求

3.動態中相對靜態的部分使用ESI

4.本地緩存降低對數據庫的查詢

[Step3]web server集群+讀寫分離

技術分享

負載均衡: 前端負載均衡
DNS負載均衡
在DNSserver中,能夠為多個不同的地址配置同一個名字,對於不同的客戶機訪問同一個名字,得到不同的地址。

反向代理
使用代理server將請求發給內部server,讓代理server將請求均勻轉發給多臺內部webserver之中的一個。從而達到負載均衡的目的。標準代理方式是客戶使用代理訪問多個外部Webserver。而這樣的代理方式是多個客戶使用它訪問內部Webserver。因此也被稱為反向代理模式。

基於NAT的負載均衡技術 LVS F5硬件負載均衡
應用server負載均衡
數據庫負載均衡
[Step4]CDN、分布式緩存、分庫分表

技術分享

眼下流行分布式緩存方案:memcached、membase、redis等,基本上當前的NoSQL方案都能夠用來做分布式緩存方案

[Step5]多數據中心+分布式存儲與計算

技術分享

技術點:分布式文件系統(DFS

技術分享

Map/Reduce

文件太大,無法載入至內存。切割得到key-value數據,這個是map過程(多個機器完畢)

將其合並的過程稱為reduce。Map-->combine-->reduce,這就是所謂的分布式計算。


大並發server架構 && 大型站點架構演變