內容出自:http://z00w00.blog.51cto.com/515114/1031287
套用古龍武俠小說套路來說,代理服務技術是一門很古老的技術,是在互聯網早期出現就使用的技術。一般實現代理技術的方式就是在服務器上安裝代理服務軟件,讓其成為一個代理服務器,從而實現代理技術。常用的代理技術分為正向代理、反向代理和透明代理。本文就是針對這三種代理來講解一些基本原理和具體的適用范圍,便於大家更深入理解代理服務技術。
一、正向代理(Forward Proxy)

1、訪問本無法訪問的服務器B,如下圖1.2
(圖1.2)
我們拋除復雜的網絡路由情節來看圖1.2,假設圖中路由器從左到右命名為R1,R2假設最初用戶A要訪問服務器B需要經過R1和R2路由器這樣一個路由節點,如果路由器R1或者路由器R2發生故障,那么就無法訪問服務器B了。但是如果用戶A讓代理服務器Z去代替自己訪問服務器B,由於代理服務器Z沒有在路由器R1或R2節點中,而是通過其它的路由節點訪問服務器B,那么用戶A就可以得到服務器B的數據了。現實中的例子就是“翻牆”。不過自從VPN技術被廣泛應用外,“翻牆”不但使用了傳統的正向代理技術,有的還使用了VPN技術。
2、加速訪問服務器B
3、Cache作用
Cache(緩存)技術和代理服務技術是緊密聯系的(不光是正向代理,反向代理也使用了Cache(緩存)技術。還如上圖所示,如果在用戶A訪問服務器B某數據J之前,已經有人通過代理服務器Z訪問過服務器B上得數據J,那么代理服務器Z會把數據J保存一段時間,如果有人正好取該數據J,那么代理服務器Z不再訪問服務器B,而把緩存的數據J直接發給用戶A。這一技術在Cache中術語就叫Cache命中。如果有更多的像用戶A的用戶來訪問代理服務器Z,那么這些用戶都可以直接從代理服務器Z中取得數據J,而不用千里迢迢的去服務器B下載數據了。
4、客戶端訪問授權
這方面的內容現今使用的還是比較多的,例如一些公司采用ISA SERVER做為正向代理服務器來授權用戶是否有權限訪問互聯網,挼下圖1.3

(圖1.3)
圖1.3防火牆作為網關,用來過濾外網對其的訪問。假設用戶A和用戶B都設置了代理服務器,用戶A允許訪問互聯網,而用戶B不允許訪問互聯網(這個在代理服務器Z上做限制)這樣用戶A因為授權,可以通過代理服務器訪問到服務器B,而用戶B因為沒有被代理服務器Z授權,所以訪問服務器B時,數據包會被直接丟棄。
5、隱藏訪問者的行蹤
如下圖1.4 我們可以看出服務器B並不知道訪問自己的實際是用戶A,因為代理服務器Z代替用戶A去直接與服務器B進行交互。如果代理服務器Z被用戶A完全控制(或不完全控制),會慣以“肉雞”術語稱呼。
(圖1.4)
我們總結一下 正向代理是一個位於客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求並指定目標(原始服務器),然后代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端必須設置正向代理服務器,當然前提是要知道正向代理服務器的IP地址,還有代理程序的端口。
二、反向代理(reverse proxy)
反向代理正好與正向代理相反,對於客戶端而言代理服務器就像是原始服務器,並且客戶端不需要進行任何特別的設置。客戶端向反向代理的命名空間(name-space)中的內容發送普通請求,接着反向代理將判斷向何處(原始服務器)轉交請求,並將獲得的內容返回給客戶端。
使用反向代理服務器的作用如下:
1、 保護和隱藏原始資源服務器
如下圖2.1
(圖2.1)
用戶A始終認為它訪問的是原始服務器B而不是代理服務器Z,但實用際上反向代理服務器接受用戶A的應答,從原始資源服務器B中取得用戶A的需求資源,然后發送給用戶A。由於防火牆的作用,只允許代理服務器Z訪問原始資源服務器B。盡管在這個虛擬的環境下,防火牆和反向代理的共同作用保護了原始資源服務器B,但用戶A並不知情。
2、 負載均衡
如下圖2.2
(圖2.2)
當然反向代理服務器像正向代理服務器一樣擁有CACHE的作用,它可以緩存原始資源服務器B的資源,而不是每次都要向原始資源服務器B請求數據,特別是一些靜態的數據,比如圖片和文件,如果這些反向代理服務器能夠做到和用戶X來自同一個網絡,那么用戶X訪問反向代理服務器X,就會得到很高質量的速度。這正是CDN技術的核心。如下圖2.3
(圖2.3)
三、透明代理
如果把正向代理、反向代理和透明代理按照人類血緣關系來划分的話。那么正向代理和透明代理是很明顯堂親關系,而正向代理和反向代理就是表親關系了 .透明代理的意思是客戶端根本不需要知道有代理服務器的存在,它改編你的request fields(報文),並會傳送真實IP。注意,加密的透明代理則是屬於匿名代理,意思是不用設置使用代理了。透明代理實踐的例子就是時下很多公司使用的行為管理軟件。如下圖3.1
圖3.1
用戶A和用戶B並不知道行為管理設備充當透明代理行為,當用戶A或用戶B向服務器A或服務器B提交請求的時候,透明代理設備根據自身策略攔截並修改用戶A或B的報文,並作為實際的請求方,向服務器A或B發送請求,當接收信息回傳,透明代理再根據自身的設置把允許的報文發回至用戶A或B,如上圖,如果透明代理設置不允許訪問服務器B,那么用戶A或者用戶B就不會得到服務器B的數據。
延伸說明:
內容來自:http://blog.csdn.net/longxibendi/article/details/6665670
大型網站的負載均衡器、db proxy和db
本文主要分析網站后台架構中的負載均衡器,企業常用的硬件負載均衡器軟件負載均衡器、數據庫代理服務器和數據庫。
1.1 負載均衡
在大型網站部署中,負載均衡至少有三層部署。第一層為web server或者緩存代理之上的負載均衡,第二層為數據庫之上的負載均衡,第三層為存儲設備之上的負載均衡。
在第一層部署中,最常使用的是硬件負載均衡器有F5 BIG-IP、Citrix NetScaler、Radware、Cisco CSS、Foundry等產品。這些產品價格不菲,高達幾十萬人民幣。在中國大陸,采用F5Network公司的BIG-IP負載均衡交換機的網站有新浪網、雅虎、百度、搜狐、鳳凰網、央視國際、中華英才網、貓撲、暢游等。之前淘寶采用 NetScaler作為其硬件負載均衡器。后來用軟件負載均衡器LVS和HAproxy混合使用來代替硬件負載均衡器。硬件負載均衡器可以提供OSI參考模型的第四/七層進行負載均衡。在第七層實現負載均衡的原理是,通過檢查流經的HTTP報頭,根據報頭內的信息來執行負載均衡任務。在第四層(網絡層)實現負載均衡的DR模式的原理是,通過更改請求包的目的MAC地址來進行負載均衡。
在第一層部署中,最常用的軟件負載均衡器為LVS(LinuxVirtual Server)和HAproxy。其中LVS采用基於IP負載均衡技術和基於內容請求分發技術。最常用的LVS負載均衡技術為DR負載均衡。
在第二層部署中,最常用的為MySQL-proxy(后端部署必須為MySQL數據庫),該代理服務器可以監測、分析或改變客戶端的通信。最常用途為負載均衡,讀寫分離等。
在第三層部署中,最常用的存儲設備都要做RAID,其中RAID0便為最基本的存儲層的負載均衡。RAID0通過分帶技術,將數據分割,然后並行的讀寫於各個磁盤上。這樣實現底層存儲一級的負載均衡。
1.2 LVS軟件負載均衡器
LVS(LinuxVirtual Server)是由章文嵩博士主導開發的一款開源軟件,可以實現Linux平台下的基於網絡層的負載均衡軟件。典型的基本架構圖如圖6-2-1所示。
圖6-2-1
LVS集群采用IP負載均衡技術和基於內容請求分發技術。
如圖6-2-1所示,LVS集群采用基於IP負載均衡技術和基於內容請求分發技術。當客戶端有請求時,首先將請求包傳送到Load Balance,然后Load Balance從后面的Real Servers中按照一定的算法策略選取一台Real Server,比如Real Server1,然后把請求包發送給Real Server1進行處理。對所有用戶而言,面向用戶的服務器端IP地址,只有一台,稱之為VirtualIP Address。
1.2.1 LVS集群中實現的三種IP負載均衡技術
VS/NAT、 VS/TUN 和VS/DR技術是LVS集群中實現的三種IP負載均衡技術。
1.2.1.1 VS/NAT技術
VS/NAT(VirtualServer via Network Address Translation)技術,主要通過網絡地址轉換,將一組服務器構成一個高性能的、高可用的虛擬服務器。NAT的工作原理是當內部網絡中的主機要訪問Internet或被Internet訪問時,就需要采用網絡地址轉換NAT,將內部地址轉化為Internet上可用的外部地址。NAT的工作原理是報文頭(目標地址、源地址和端口等)被正確改寫后,客戶端相信他們連接到了一個IP地址,而不同的IP地址服務器組也認為他們與客戶直接相連的。由此,可以用NAT方法將不同IP地址的並行網絡服務變成一個IP地址上的虛擬服務。VS/NAT的體系結構如圖6-2-1-1所示。
圖6-2-1-1
客戶端訪問服務器的請求包和響應包變化情況如下所示:
訪問Web服務的報文可能有以下的源地址和目標地址:
SOURCE |
202.100.1.2:3456 |
DEST |
202.103.106.5:80 |
調度器從調度列表中選出一台服務器,例如是172.16.0.3:8000。該報文會被改寫為如下地址,並將它發送給選出的服務器。
SOURCE |
202.100.1.2:3456 |
DEST |
172.16.0.3:8000 |
從服務器返回到調度器的響應報文如下:
SOURCE |
172.16.0.3:8000 |
DEST |
202.100.1.2:3456 |
響應報文的源地址會被改寫為虛擬服務的地址,再將報文發送給客戶:
SOURCE |
202.103.106.5:80 |
DEST |
202.100.1.2:3456 |
這樣,客戶認為是從202.103.106.5:80服務得到正確的響應,而不會知道該請求是服務器172.16.0.2還是服務器172.16.0.3處理的。
1.2.1.2 VS/TUN技術
VS/TUN 的工作原理:它的連接調度和管理與VS/NAT中的一樣,只是它的報文轉發方法不同。調度器根據各個服務器的負載情況,動態地選擇一台服務器,將請求報文封裝在另一個IP報文中,再將封裝后的IP報文轉發給選出的服務器;服務器收到報文后,先將報文解封獲得原來目標地址為VIP的報文,服務器發現VIP地址被配置在本地的IP隧道設備上,所以就處理這個請求,然后根據路由表將響應報文直接返回給客戶。如圖6-2-1-2所示。
圖6-2-1-2
1.2.1.3 VS/DR技術
在VS/DR中,調度器根據各個服務器的負載情況,動態地選擇一台服務器,不修改也不封裝IP報文,而是將數據幀的MAC地址改為選出服務器的MAC地址,再將修改后的數據幀在與服務器組的局域網上發送。因為數據幀的MAC地址是選出的服務器,所以服務器肯定可以收到這個數據幀,從中可以獲得該IP報文。當服務器發現報文的目標地址VIP是在本地的網絡設備上,服務器處理這個報文,然后根據路由表將響應報文直接返回給客戶。如圖6-2-1-3所示。
圖6-2-1-3
1.2.1.4 LVS的調度算法
前面幾節,介紹了LVS的三種基於IP的負載均衡技術,下面簡單介紹一下調度算法。調度算法的目的是解決如何合理有效的從LVS后端的RealServers中,選擇一個RealServer來對請求包進行處理。在整個LVS項目中,共給出八種調度算法,主要有:
(1)輪詢調度。主要指按順序從RealServers中選擇一台RealServers。
(2) 加權輪叫調度。給Real Servers設置一定權值,進行調度。
(3)最小連接調度。按照RealServers的連接情況進行調度。
(4)加權最小連接。根據設置的權值和現有的連接數進行調度。
(5)基於局部性的最小連接。主要用於增大Cache命中。
(6)代復制的基於局部性的最小連接。
(7)目標地址散列調度。
(8)源地址散列調度。
在上述八種調度算法中,最常用的調度算法是輪詢調度。
1.3 db proxy
在大型互聯網站的數據庫部署中,部署最多的數據庫為MySQL。隨着MySQL中Innodb存儲引擎對事物的支持,MySQL在互聯網公司部署中,應用量越來越多。典型應用MySQL的公司有Google、Baidu、Taobao等大型互聯網公司。MySQL的優勢在於其高擴展性和價格優勢等。實際上,MySQL可以免費應用於企業級的部署中。
在MySQL復制方式部署中,有兩種部署方式:同步復制和異步復制。同步復制采用NDB 存儲引擎,異步復制需要使用mysql-proxy結合master-slave實現。
異步復制主要為了解決讀寫分離的問題。因為用戶對網站的訪問有讀操作多,寫操作少的特點。甚至像taobao.com這樣的網站讀寫比例高達10:1,所以采用MySQL-Proxy結合主從異步復制實現讀寫分離是非常重要的增快訪問速度的方法。這樣如果有更高的用戶訪問需求,通過增加slave機器,不會對現有系統提供的服務產生影響而實現很好的、很靈活的業務擴展。
1.3.1 mysql-proxy
mysql-proxy是一個MySQL的代理服務器,用戶的請求先發向mysql-proxy,然后mysql-proxy對用戶的數據包進行分析,從下一層的mysql 數據庫中選擇一台數據庫,將用戶的請求包交給mysql處理。
首先MySQL Proxy 以服務器的身份接受客戶端的請求,根據相應配置對這些請求進行分析處理,然后以客戶端的身份轉發給相應的后端數據庫服務器,再接受服務器的信息,然后返回給客戶端。所以MySQL Proxy需要同時實現客戶端和服務器的協議。由於要對客戶端發送過來的SQL語句進行分析,還需要包含一個SQL解析器。MySQL Proxy通過使用lua腳本,來實現復雜的連接控制和過濾,從而實現讀寫分離和負載平衡。所以部署MySQL-Proxy需要安裝運行Lua語言的環境。典型的MySQL-Proxy應用為實現讀寫分離,如圖6-3-1所示。
圖6-3-1
1.3.2 MySQL主從復制(Master-Slave Replication)
MySQL主從復制(Master-Slave Replication)是通過設置在Master MySQL上的binlog(使其處於打開狀態),Slave MySQL上通過一個I/O線程從Master MySQL上讀取binlog,然后傳輸到Slave MySQL的中繼日志中,然后Slave MySQL的SQL線程從中繼日志中讀取中繼日志,然后應用到Slave MySQL的數據庫中。這樣實現了數據庫的復制功能。原理如圖6-3-2所示:
圖6-3-2
MySQL主從復制的作用如下:
(1) 可以作為一種備份機制。
(2) 可以用來做讀寫分離。
1.3.3 MySQL主從復制結合MySQL Proxy實現讀寫分離
通過使用MySQL-Proxy來作為代理服務器,配置MySQL Proxy,將所有的寫操作,分流到master MySQL上,所有的讀操作分流到slave MySQLs。
這樣就實現了讀寫分離。如果有新的訪問需求,只需添加slave MySQL機器來解決問題。所以這樣的結構擴展能力非常好。如圖6-3-3所示。
圖6-3-3
1.4 本文小結
本文主要論述了負載均衡在大型網站后台架構中的應用。主要分析了應用層的軟件負載均衡器LVS的三種負載均衡算法,簡單介紹了LVS的八種調度算法。詳細分析了MySQL的主從復制和讀寫分離的實現機制。給出了高可用網站后台的部署中解決負載均衡的方案。