Web站點架構的深入淺出,由表及里(一)

1.1 http反向代理服務器

在web站點前端,我們需要搭建一個反向代理服務器,用於負責接受用戶的請求,請求包括動態和靜態的內容請求。一般反向代理服務器的部署方案有HAProxy和Nginx,這裡將使用HAProxy來描述。

註解:HAProxy是一個使用C語言編寫的自由及開放源代碼軟件,其提供高可用性、負載均衡,以及基於TCP和HTTP的應用程序代理。

HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。

Web站點架構的深入淺出,由表及裡(一)

http反向代理服務器

1.2 http代理服務器高可用

為了提高系統安全及高可用性,我們需要在前端的http反向代理服務器配置高可用,解決方案有HAProxy+Keepalived。

註解:Keepalived是一個類似於layer3, 4 & 5交換機制的軟件,也就是我們平時說的第3層、第4層和第5層交換。Keepalived是自動完成,不需人工干涉。

Keepalived的作用是檢測服務器的狀態,如果有一臺web服務器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常後Keepalived自動將服務器加入到服務器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的服務器。

Web站點架構的深入淺出,由表及裡(一)

http代理服務器高可用

1.3 http代理服務器負載均衡

雖然我們有兩個節點的HAProxy,但是一般只有有一臺HAProxy可為用戶提供服務,而另外一臺將會空閒,這樣會造成資源浪費,為了提高資源最大化,我們需要為HAProxy做負載均衡。操作方法就是在DNS上配置兩條A記錄,這樣就能實現將用戶請求通過DNS分發給兩個不同的節點,而每個節點都通過相同的方式向後端服務器發起調度。

Web站點架構的深入淺出,由表及裡(一)

http代理服務器負載均衡

1.4 動態內容服務器

如果我們打算部署一個動態內容,而且主站也是使用應用程序來實現,那我們需要部署一套動態內容網站(例如LAMP),那麼對其我們也需要對其考慮高可用性以及負載均衡以及高可用的問題。那麼當用戶訪問主頁,例如index.jsp,index.php等動態網頁時,此時就應該由動態服務器基於響應。

Web站點架構的深入淺出,由表及裡(一)

動態內容服務器

小知識:用戶在訪問站點時,只是請求一個資源(主頁資源),而這個主頁資源包含了很多資源,有大多數都是靜態內容,這些內容都是位於當前站點上或者是其他站點上一些靜態資源,比如圖片,CSS等。而這些信息需要被單獨的資源再次請求。所以打開一個站點,訪問主頁的那一刻,只是第一次請求的入口,後續他會在同一個站點或者是同一個站點的鏈接所指向的位置發起多次請求。

1.5 數據庫節點服務器

對於動態內容來講,如果其訪問的是一個主頁,而這個主頁又包含一些動態內容,比如包含某些查詢,那麼此時就需要查詢數據庫,所以我們還需要部署數據庫節點(常見的數據庫系統有MySQL、Mariadb、Oracle等)

Web站點架構的深入淺出,由表及裡(一)

數據庫節點服務器

備註說明:

對於一個站點來講將,存儲有分為以下幾類

1、關係型數據,需要存儲在類似MySQL這種關係型數據庫中.

2、文件數據,存儲在文件系統中

3、鍵值數據,一般存儲在緩存服務器中,或者類似NoSQL非關係型數據庫中

1.6 MySQL主從架構

如果我們查詢的請求比較多,一臺MySQL服務器將無法支撐這麼龐大的查詢請求,那麼此時為提高查詢能力,我們需要部署主從架構,實現一主多從模型

Web站點架構的深入淺出,由表及裡(一)

MySQL主從架構

1.7 緩存服務器

我們瞭解到MySQL本身具有緩存功能,但由於前端應用服務器不止一臺,而MySQL也已部署成為一主多從架構,因為存在多個MySQL從節點,從而導致前端應用程序無法命中MySQL緩存的問題,那麼此時就需要增加緩存服務器(例如:Memcache服務器)

如果我們只有一臺MySQL讀節點,那麼只需使用MySQL本地的緩存即可,而無需額外增加緩存服務器。

Web站點架構的深入淺出,由表及裡(一)

緩存服務器

使用MySQL主從架構添加緩存時,使用的是緩存模式中的“旁路”緩存模式(下面有介紹緩存的工作模式),而在此處緩存的內容主要是緩存MySQL的查詢對象,也就是MySQL對象查詢的緩存結果。

1.8 關於緩存工作模式介紹

緩存工作模式有兩種

1、基於代理模式的工作

2、基於旁路的工作模式

1.8.1 代理(例如HAProxy,Nginx)

註解:Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。其特點是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。

Web站點架構的深入淺出,由表及裡(一)

用戶向緩存服務器請求資源,如果緩存服務器發現本地並沒有對應緩存記錄,會由自己向後端服務器請求資源,將請求到的結果先緩存在本地,緩存完成之後再響應給用戶。

1.8.2 旁路(例如Memcache)

註解:memcache是一套分佈式的高速緩存系統,由LiveJournal的Brad Fitzpatrick開發,但目前被許多網站使用以提升網站的訪問速度,尤其對於一些大型的、需要頻繁訪問數據庫的網站訪問速度提升效果十分顯著。這是一套開放源代碼軟件,以BSD license授權發佈。

Web站點架構的深入淺出,由表及裡(一)

用戶首先向緩存服務器請求,如果緩存服務器未有緩存記錄會立即響應用戶。這時客戶端會自行去找後端服務器,那麼後端服務器無論有無資源都會響應給客戶端。假設此時有對應緩存記錄,那麼後端服務器會將結果返回給客戶端。客戶端會根據需要來判定是否這個數據緩存到緩存服務器中。所以數據緩不緩存並不取決於緩存服務器,而取決於請求方(也就是客戶端)。

1.9 MySQL主從架構讀寫分離

由於MySQL已經部署成為主從架構,那麼又衍生另一個問題,如果用戶請求發送到MySQL服務器,應如何區分讀和寫的請求,應使用哪個節點去響應客戶端請求呢?此時我們需要解決讀寫分離的問題。這裡給出兩種方法供大家參考:

1、前端應用程序配置

在前端應用程序做設定來做讀寫分離,設定寫操作發送到主節點,讀操作發至各從節點上。但是這樣會存在一個問題,如今互聯網發展速度之快,我們很有可能為了滿足業務擴展需求,會改變架構規劃調整,此時就需要在前端應用程序端進行代碼修改,而且這樣要求前端應用程序開發工程師的技術水平,對於系統的擴展性不高,所以一般也不建議使用這樣地方。

2、搭建讀寫分離服務器(例如:Amoeba服務器)

搭建讀寫分離服務器,告訴前端應用程序,無論是讀請求還是寫請求都發至讀寫分離服務器,由此服務器負責代理區分讀寫操並做好讀寫分離,轉發至各對應的主從節點上。

Web站點架構的深入淺出,由表及裡(一)


分享到:


相關文章: