歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> 大並發服務器架構 && 大型網站架構演變

大並發服務器架構 && 大型網站架構演變

日期:2017/3/1 12:17:34   编辑:關於Linux

服務器的三條要求:

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

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

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

另外任何網絡系統結構都可以抽象成C/S架構,我們常說的B/S模式本質上也是C/S架構(浏覽器看作客戶端)。

一個典型的服務器架構:

\

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

由於服務器需要高效處理大並發連接,因此多個位置均可能出現性能瓶頸,下面我們分析不同位置產生瓶頸的原因及其處理方法:

(一)數據庫瓶頸

【1】超過數據庫的連接數的解決方法:加上一層DAL,使用隊列等待(隊列等待--數據訪問層),也可以再使用連接池(DAL隊列服務+連接池)這樣不需要重新連接,直接從池中找資源。

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

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

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

1. 緩存的時效性,if timeout then 重新去數據庫查詢,(將熱點數據放至緩存)這種方法實時性較差。

2. 一旦數據庫更新,立即通知前端緩存更新。Update之後修改更新緩存,實時性較好。可能實現起來較難。

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

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

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

還有Redis ,memached 緩存等分布式開源軟件。這些軟件是可以跨服務器的,但是如果部署在應用服務器上,則是局部的,其他同級服務器訪問很麻煩。

但是如果單獨布置機器,使用分布式緩存,這些就是全局的,所有的應用服務器都可以訪問,方便快捷。

【3】數據庫讀寫分離

數據庫的查詢操作一般比寫操作頻繁,我們可以對數據庫進行負載均衡,使用主服務器進行寫操作,從服務器進行讀操作,DAL進行讀寫分離,通過replication機制進行主從服務器間的同步。

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

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

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

(二)應用服務器瓶頸

添加任務服務器對應用服務器的任務分配進行負載均衡,其中又分為主動和被動兩種方案:

(1)應用服務器被動接受方案:

使用任務服務器實現負載均衡,暴露一個接口,任務服務器可以當作一個客戶端,應用服務器看作http服務器

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

(2)應用服務器主動到任務服務器接受任務進行處理

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

(1)的方式可能會造成不公平,(2)的缺點是如果應用服務器處理不同的業務,那麼可能任務服務器的編程邏輯會很復雜。

其中任務服務器可以設置多台,彼此之間通過心跳聯系------>滿足 高可用性(fail over機制)。

如此一來(數據庫,緩存,應用服務器,任務服務器)任何位置出現瓶頸就只需要增加服務器好了。

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

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

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

多線程能夠充分發揮多核服務器的性能,也要注意線程間切換的開銷

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

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

以上的信息可以歸納為下面的這張圖:

\

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

[Step1]web server與數據庫分離

\

\

Apache/Nginx處理靜態(前端服務器) JBoss/Tomat處理動態 (後端服務器)

[Step2]緩存處理

\

1.浏覽器緩存減少對網站的訪問

2.前端服務器靜態頁面緩存減少對web服務器的請求

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

4.本地緩存減少對數據庫的查詢

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

\

負載均衡: 前端負載均衡
DNS負載均衡
在DNS服務器中,可以為多個不同的地址配置同一個名字,對於不同的客戶機訪問同一個名字,得到不同的地址。
反向代理
使用代理服務器將請求發給內部服務器,讓代理服務器將請求均勻轉發給多台內部web服務器之一,從而達到負載均衡的目的。標准代理方式是客戶使用代理訪問多個外部Web服務器,而這種代理方式是多個客戶使用它訪問內部Web服務器,因此也被稱為反向代理模式。
基於NAT的負載均衡技術 LVS F5硬件負載均衡
應用服務器負載均衡
數據庫負載均衡 [Step4]CDN、分布式緩存、分庫分表

\

目前流行分布式緩存方案:memcached、membase、redis等,基本上當前的NoSQL方案都可以用來做分布式緩存方案

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

\

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

\

Map/Reduce:

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

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

Copyright © Linux教程網 All Rights Reserved