高性能的網站架構離不開各層中間件的支持,作為一個成長中的架構師,富有創造力固然很重要,但是博覽各家之架構,集各家之所長,拓展眼界,不斷進步無疑是同樣重要的,看多了各大型互聯網的架構,其實多多少少都離不開下面列到的一些東西,所謂萬變不離其宗,這些就好比各種兵器,作為一個武林高手,18般武器還是多少要熟悉一些的。下面是我的一些整理,有些實戰過,有些只是初步研究:
高性能網站的架構如下圖:
1.最前端負載均衡層
硬件負載均衡:
NetScaler、F5、Radware和Array:優點就是有專業的維護團隊來對這些服務進行維護、缺點就是花銷太大,所以對於規模較小的網絡服務來說暫時還沒有需要使用。
軟件負載均衡:
LVS:采用persistent機制(NAT/TUN/DR),工作在網絡4層之上僅作分發之用,高抗負載,易配置,穩定性強,但對網絡要求較高,且不支持正則,不能做動靜分離。
Nginx:采用ip_hash機制,工作在網絡7層之上,網絡依賴小,支持靈活正則表達,能通過端口檢測到服務器內部故障,但不支持url檢測,而且僅能支持http和Email。
HA-Proxy:采用balance source機制,工作在網絡第4層和第7層,純負載軟件,支持虛擬主機,能夠補充Nginx的一些缺點比如Session的保持,Cookie的引導等工作,並且支持url檢測,負載效率和並發處理優於Nginx,它跟LVS的persistent和Nginx的ip_hash一樣,是讓客戶機訪問時始終訪問后端的某一台真實的web服務器。
2.代理緩存層
代理緩存主要部署在web server之上,當用戶對網站后台發起連接請求時,用戶請求先到代理緩存中去查找,如果命中,則將請求返回給用戶,如果沒有命中,則代理緩存將請求發到 web server,然后web sever將請求復制一份到代理緩存中,同時把請求返回給客戶。常用的代理緩存有varnish和squid。
Varnish:將所有的HTTP object存於一個單獨的大文件中,該文件在工作進程初始化的時候,將其整個映射到內存中。這樣Varnish在該塊內存中實現一個簡單的文件系統,具有分配、釋放、修剪、合並內存等功能。其工作進程分為master進程和child進程,master進程負責初始化及fork並監控child進程,而child進程分配若干線程(Accept線程,Work線程,Epoll監聽線程,Expire過期處理線程)
Squid:每一台Squid代理服務器上存有若干個顆磁盤。每顆磁盤又分割成多個分區,每一個分區又可建立很多目錄,目錄下存放着具體的文件(object)。其通過查詢表的方式來定位某個資源的位置。所查詢的表有兩種,一種是Hash table,一種是Digest table。Hash table記錄着所有Digest table表信息,所以Hash table可以稱之為目錄或者提綱。而Digest table記錄了磁盤上每個分區、每個目錄里存放的緩存摘要,所以Digest table可以稱之為摘要或者索引。所以,Squid接到請求后先查詢Hashtable,根據Hash table所指向的Digest table,再查詢所需要的文件。
Nginx:Nginx已經具備Squid所擁有的Web緩存加速功能,此外,Nginx對多核CPU的利用,勝過Squid不少,現在越來越來的架構師都喜歡將Nginx同時作為“負載均衡服務器”與“Web緩存服務器”來使用。
3.Web Server
Web server的作用就是解析HTTP協議,通過用戶發來請求的url地址從web服務器的文件系統中找到用戶需要的HTML頁面、靜態文件,然后返回給用戶。如果用戶訪問的是動態頁面,則將請求轉發到應用服務器(其上部署了如CGI(Common Gateway Interface), JSP, Servlets, ASP.NET,PHP腳本等)來執行。
Lighttpd:一個單進程模型的web server,內存使用量很小,CPU占用率低,性能好的輕量級Web Server。支持FastCGI, CGI, 輸出壓縮,URL重寫,Alias等重要功能。使用FastCGI方式運行php。
Apache:是一款重量級的web服務器,也是世界上使用最多的web服務器,總體來講,Apache web 服務器具有以下特性:
(1) 支持HTTP1.1通信協議。
(2) 支持通用網關接口。
(3) 支持基於ip、域名、端口的虛擬主機。
(4) 支持服務器端包含指令(ssl)。
(5) 支持FastCGI。
(6) 支持url重寫。
Nginx:使用多線程來處理請求,這使得多個線程之間可以共享內存資源,使用分階段的內存分配策略,按需分配,及時釋放,總體占用內存很小,可以支持較大的並發連接數。能夠選擇高效的epoll(Linux 2.6內核)、kqueue(FreeBSD)、eventport(Solaris 10)作為網絡I/O模型,在高連接並發的情況下,Nginx是Apache服務器很好的替代者,因為在同樣並發連接的情況下,Nginx相對 Apache占用更少的系統資源。
4.應用服務器
Tomcat
websphere
JBoss
Weblogic
GlassFish
5.服務端緩存
Memcached:是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提供動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護進程通信。默認情況下采用名為Slab Allocator機制分配、管理內存。Slab Allocator的基本原理是將分配的內存分割成各種尺寸的塊(chunk),並將尺寸相同的塊分成組(chunk的集合)
6.文件服務器層
單NFS:
熱備DRDB+HeartBeat+NFS:
MFS:
自主研發分布式文件系統:
淘寶TFS
7.數據庫
memcached數據緩存服務器:
Mysql主從復制,讀寫分離:
LVS+MySql集群:
當后面的MySQL機器超過十台時,HAProxy在這方面的性能不如LVS
水平分庫設計:
垂直分區設計: