負載均衡層設計方案之負載均衡技術(shù)總結(jié)篇
1、概述
通過前面文章的介紹,并不能覆蓋負載均衡層的所有技術(shù),但是可以作為一個引子,告訴各位讀者一個學習和使用負載均衡技術(shù)的思路。雖然后面我們將轉(zhuǎn)向“業(yè)務層”和“業(yè)務通信”層的介紹,但是對負載均衡層的介紹也不會停止。在后續(xù)的時間我們將穿插進行負載均衡層的新文章的發(fā)布,包括Nginx技術(shù)的再介紹、HaProxy、LVS新的使用場景等等。
這篇文章我們對前面的知識點進行總結(jié),并有意進行一些擴展,以便于各位讀者找到新的學習思路。
2、負載均衡層的核心思想
2-1、一致性哈希與Key的選取
我們詳細介紹了一致性哈希算法。并且強調(diào)了一致性Hash算法是現(xiàn)代系統(tǒng)架構(gòu)中的最關(guān)鍵算法之一,在分布式計算系統(tǒng)、分布式存儲系統(tǒng)、數(shù)據(jù)分析等眾多領(lǐng)域中廣泛應用。針對我的博文,在負載均衡層、業(yè)務通信層、數(shù)據(jù)存儲層都會有它的身影。
一致性算法的核心是:
- 使用對象的某一個屬性(這個屬性可以是服務器的IP地址、開放端口 還可以是用戶名、某種加密串。凡是你可以想到的有散列意義的屬性),算出一個整數(shù),讓其分布在0 至 2的32次方 范圍內(nèi)。
- 一臺服務器的某個或者某一些屬性當然也可以進行hash計算,并且根據(jù)計算分布在這個圓環(huán)上的某一個點,也就是圖中圓環(huán)上的藍色點。
- 一個處理請求到來時,根據(jù)這個請求的某一個或者某一些屬性進行hash計算,并且根據(jù)計算記過分布在這個圓環(huán)上的某一個點上。也就是上圖圓環(huán)上的黃色點。
- 我們約定落在某一個藍點A左側(cè)和藍點B右側(cè)的黃色點所代表的請求,都有藍點A所代表的服務器進行處理,這樣就完成解決了“誰來處理”的問題。在藍色點穩(wěn)定存在的前提下,來自于同一個Hash約定的請求所落在的位置都是一樣的,這就保證了服務處理映射的穩(wěn)定性。
- 當某一個藍色點由于某種原因下線,其所影響到的黃色點也是有限的。即下一次客戶端的請求將由其他的藍色點所代表的服務器進行處理。
2-2、輪詢與權(quán)
不加權(quán)輪詢,就是主控節(jié)點(任務來源點)在不考慮目標節(jié)點的任何因素的情況下(例如CPU性能、磁盤性能、網(wǎng)絡性能),按照目標節(jié)點的列表順序?qū)⑷蝿找来畏峙湎氯?。這是最簡單的輪詢,也是對主控節(jié)點實現(xiàn)復雜性要求最低的輪詢。我之前的博文《架構(gòu)設計:負載均衡層設計方案(2)——Nginx安裝》、《架構(gòu)設計:負載均衡層設計方案(4)——LVS原理》 都對這種最簡輪詢進行了介紹:例如LVS中的“rr”參數(shù)。
加權(quán)輪詢中的“權(quán)”,您可以看成是“輪詢”依據(jù)的意思?!皺?quán)”可以是很多種可能,可以是目標機器的性能量化值、可以是一個固定的數(shù)字(按照固定數(shù)字加權(quán))、可以是目標節(jié)點的網(wǎng)絡速度。例如LVS中的“l(fā)c”參數(shù),就是指按照目標機器,現(xiàn)在已有的“連接”數(shù)量進行加權(quán):連接數(shù)量越少,越有更大的幾率獲得這個任務的處理權(quán)。
2-3、租約與健康檢查
租約協(xié)議主要為了保證一個事實:如果服務器對客戶端的檢查操作在“最遲時間”失敗后,那么服務器端肯定會注銷客戶端的登錄信息,同時客戶端上服務器的連接信息也會消失(并且不在向下提供服務)。每一次檢查成功,這個“最遲時間”都會向后推移。
租約協(xié)議和我們提到的哈希算法一下一樣,也是系統(tǒng)架構(gòu)設計中最基本的設計思想,并且大量運用在各類型的系統(tǒng)中,它的工作原理是每一位架構(gòu)師都需要掌握的。例如:zookeeper使用這個協(xié)議保證Flow節(jié)點和Leader節(jié)點的鏈路是正常的;分布式存儲系統(tǒng)用這個協(xié)議保證datanode和namenode的連接是正常的;
3、負載均衡層技術(shù)匯總
在前面的博文中,我重點介紹了Nginx、LVS、Keepalived技術(shù)。由于時間有限,這里我們對博文中提到的幾種技術(shù)進行一個總結(jié),然后再擴展介紹一下DNS技術(shù)、CDN技術(shù)和硬件負載技術(shù)。
3-1、Nginx技術(shù)
在負載均衡層這個大的章節(jié)中,我有三篇文章都在直接介紹Nginx的原理和使用。但是之后有朋友給我反映還想了解更多的Nginx知識,特別點名要求我再做一篇文章介紹Nginx的動態(tài)緩存。是的,我在后面的時間里是有計劃介紹Nginx的動態(tài)緩存技術(shù),還會介紹Nginx和多款主流的反向代理軟件的性能對比。但這需要時間,特別是我不想去網(wǎng)上找一些已有的性能對比圖,還是自己一邊做這樣的性能測試,一邊做性能報告比較靠譜。
下面這些技術(shù)是我在博文中已經(jīng)重點介紹過得,我們再做一下總結(jié):
- Nginx中的連接數(shù)限制問題
重要的配置項包括:worker_processes、worker_connections。但是光是配置這些屬性是不夠的,最關(guān)鍵的是我們要打開操作系統(tǒng)級別的“最大文件數(shù)”限制問題。使用“ulimit -n 65535”設置本次會話的“最大文件數(shù)”限制;還要使用“vim /etc/security/limits.conf”命令,修改內(nèi)核的配置信息。主要是以下兩項:
soft nofile 65535
hard nofile 65535
另外,還要注意和nginx配置項中的“worker_rlimit_nofile”屬性共同使用:
user root root;
worker_processes 4;
worker_rlimit_nofile 65535;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid; events {
use epoll;
worker_connections 65535;
}
- Nginx中的Gzip技術(shù)
gzip是Nginx進行HTTP Body數(shù)據(jù)壓縮的技術(shù)。下面這段Nginx配置信息是啟用gzip壓縮的實例:
#開啟gzip壓縮服務, gzip on;#gzip壓縮是要申請臨時內(nèi)存空間的,假設前提是壓縮后大小是小于等于壓縮前的。例如,如果原始文件大小為10K,那么它超過了8K,所以分配的內(nèi)存是8 * 2 = 16K;再例如,原始文件大小為18K,很明顯16K也是不夠的,那么按照 8 * 2 * 2 = 32K的大小申請內(nèi)存。如果沒有設置,默認值是申請跟原始數(shù)據(jù)相同大小的內(nèi)存空間去存儲gzip壓縮結(jié)果。 gzip_buffers 2 8k;#進行壓縮的原始文件的最小大小值,也就是說如果原始文件小于5K,那么就不會進行壓縮了 gzip_min_length 5K;#gzip壓縮基于的http協(xié)議版本,默認就是HTTP 1.1 gzip_http_version 1.1;# gzip壓縮級別1-9,級別越高壓縮率越大,壓縮時間也就越長CPU越高 gzip_comp_level 5;#需要進行g(shù)zip壓縮的Content-Type的Header的類型。建議js、text、css、xml、json都要進行壓縮;圖片就沒必要了,gif、jpge文件已經(jīng)壓縮得很好了,就算再壓,效果也不好,而且還耗費cpu。 gzip_types text/HTML text/plain application/x-javascript text/css application/xml;
http返回數(shù)據(jù)進行壓縮的功能在很多場景下都實用:
a、 如果瀏覽器使用的是3G/4G網(wǎng)絡,那么流量對于用戶來說就是money。
b、 壓縮可節(jié)約服務器機房的對外帶寬,為更多用戶服務。按照目前的市場價良好的機房帶寬資源的一般在200RMB/Mbps,而服務器方案的壓力往往也來自于機房帶寬。
c、 不是Nginx開啟了gzip功能,HTTP響應的數(shù)據(jù)就一定會被壓縮,除了滿足Nginx設置的“需要壓縮的http格式”以外,客戶端(瀏覽器)也需要支持gzip(不然它怎么解壓呢),一個好消息是,目前大多數(shù)瀏覽器和API都支持http壓縮。
- Nginx中的rewrite(重寫)技術(shù)
Nginx的強大在于其對URL請求的重寫(重定位)。Nginx的rewrite功能依賴于PCRE Lib,請一定在Nginx編譯安裝時,安裝Pcre lib。
下面是一段rewrite的示例:
#示例1:location ~* ^/(.+)/(.+).(jpg|gif|png|jpeg)$ {
rewrite ^/orderinfo/(.+).(jpg|gif|png|jpeg)$ /img/$1.$2 break;
root /cephclient;
}#location在不進行大小寫區(qū)分的情況下利用正則表達式對$url進行匹配。當匹配成功后進行rewrite重定位。#rewrite進行重寫url的規(guī)則是:regex表達式第一個括號中的內(nèi)容對應$1,regex表達式第二個括號中的內(nèi)容對應$2,以此類推。#這樣重定位的意義就很明確了:將任何目錄下的文件名重定位到img目錄下的對應文件名,#并且馬上在這個location中(注意是Nginx,而不是客戶端)執(zhí)行這個重寫后的URL定位。#示例2:server {
。。。。
。。。。
location ~* ^/orderinfo/(.+).(jpg|gif|png|jpeg)$ {
rewrite ^/orderinfo/(.+).(.+)$ /img/$1.$2 last;
}
location / {
root /cephclient;
}
}#在server中,有兩個location位置,當url需要訪問orderinfo目錄下的某一個圖片時,rewrite將重寫這個url,#并且重新帶入這個url到server執(zhí)行,這樣“l(fā)ocation /”這個location就會執(zhí)行了,并找到圖片存儲的目錄。
- Nginx的圖片處理模塊
http_image_filter_module 是nginx的圖片處理模塊,是使用nginx進行靜態(tài)資源和動態(tài)資源分開管理的關(guān)鍵引用技術(shù)。通過這個模塊可以對靜態(tài)資源進行縮放、旋轉(zhuǎn)、驗證。
需要注意的是,http_image_filter_module模塊所處理的縮率圖片是不進行保存的,完全使用節(jié)點的CPU性能進行計算,使用節(jié)點的內(nèi)存進行臨時存儲。所以如果要使用http_image_filter_module進行圖片處理,一定要根據(jù)客戶端的請求規(guī)模進行nginx節(jié)點的調(diào)整。并且當站點的PV達到一定的規(guī)模時,一定要使用CDN技術(shù)進行訪問加速、對圖片的訪問處理手段進行規(guī)劃。
由于我們在之前涉及Nginx的文章中,并沒有詳細講解Nginx的圖片處理模塊,只是說了要進行介紹,所以這里我給出一個較為詳細的安裝和配置示例:
nginx的http_image_filter_module模塊由GD library進行支持,所以要使用這個圖片處理模塊,就必須進行第三方依賴包的安裝:
yum install gd-devel
然后,Nginx要進行重新編譯:
configure --with-http_image_filter_modulemake && make install
使用圖片處理模塊的配置示例:
location ~* /(.+)_(d+)_(d+).(jpg|gif|png|ioc|jpeg)$ { set $h $3; set $w $2;
rewrite /(.+)_(d+)_(d+).(jpg|gif|png|ioc|jpeg)$ /$1.$4 break;
image_filter resize $w $h;
image_filter_buffer 2M;
}
其中關(guān)于正則表達式的語法和已經(jīng)介紹過的rewrite的語法就不再進行介紹了,主要看http_image_filter_module相關(guān)的屬性設置:
image_filter test:測試圖片文件合法性
image_filter rotate:進行圖片旋轉(zhuǎn),只能按照90 | 180 | 270進行旋轉(zhuǎn)
image_filter size:返回圖片的JSON數(shù)據(jù)
image_filter resize width height:按比例進行圖片的等比例縮小,注意,是只能縮小,第二縮小是等比例的。
image_filter_buffer:限制圖片最大讀取大小,沒有設置就是1M;根據(jù)不同的系統(tǒng)最好設置為2M—3M
image_filter_jpeg_quality:設置jpeg圖片的壓縮比例(1-99,越高越好)
image_filter_transparency:禁用gif和png圖片的透明度。
- 和Nginx類似的其他技術(shù)/軟件
目前行業(yè)內(nèi)也有很多與Nginx解決同類問題的軟件,他們分別是Apache基金會的 Apache HTTP Server、淘寶開源的Tengine、Haproxy、包括Windows 下運行的IIS,也支持反向代理 。
這里筆者再次重點提到Tengine,建議各位讀者有時間的時候可以使用一下,這個對Nginx進行了深度再開發(fā)的軟件。
3-2、LVS技術(shù)
LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集群系統(tǒng)。本項目在1998年5月由章文嵩博士成立。
LVS集群采用IP負載均衡技術(shù)和基于內(nèi)容請求分發(fā)技術(shù)。調(diào)度器具有很好的吞吐率,將請求均衡地轉(zhuǎn)移到不同的服務器上執(zhí)行,且調(diào)度器自動屏蔽掉服務器的故障,從而將一組服務器構(gòu)成一個高性能的、高可用的虛擬服務器。整個服務器集群的結(jié)構(gòu)對客戶是透明的,而且無需修改客戶端和服務器端的程序。
在我的系列文章中,《架構(gòu)設計:負載均衡層設計方案(4)——LVS原理》 、《架構(gòu)設計:負載均衡層設計方案(5)——LVS單節(jié)點安裝》 、《負載均衡層設計方案(7)——LVS + Keepalived + Nginx安裝及配置》 都涉及到LVS的講解。
這里我們再總結(jié)一下LVS中的三種工作模式:
3-2-1、NAT模式
NAT方式是一種由LVS Master服務節(jié)點收到數(shù)據(jù)報,然后轉(zhuǎn)給下層的Real Server節(jié)點,當Real Server處理完成后回發(fā)給LVS Master節(jié)點然后又由LVS Master節(jié)點轉(zhuǎn)發(fā)出去的工作方式。LVS的管理程序IPVSADMIN負責綁定轉(zhuǎn)發(fā)規(guī)則,并完成IP數(shù)據(jù)報文和TCP數(shù)據(jù)報文中屬性的重寫。
LVS-NAT模式的優(yōu)點在于:
- 配置管理簡單。LVS-NAT的工作方式是LVS三種工作模式中最容易理解、最容易配置、最容易管理的工作模式。
- 節(jié)省外網(wǎng)IP資源,一般機房分配給使用者的IP數(shù)量是有限的,特別是您購買的機架的數(shù)量不多時。LVS-NAT工作方式將您的系統(tǒng)架構(gòu)封裝在局域網(wǎng)中,只需要LVS有一個外網(wǎng)地址或外網(wǎng)地址映射就可以實現(xiàn)訪問了。
- 系統(tǒng)架構(gòu)相對封閉。在內(nèi)網(wǎng)環(huán)境下我們對防火墻的設置要求不會很高,也相對容易進行物理服務器的運維。您可以設置來源于外網(wǎng)的請求需要進行防火墻過濾,而對內(nèi)網(wǎng)請求開放訪問。
- 另外改寫后轉(zhuǎn)給Real Server的數(shù)據(jù)報文,Real Server并不會關(guān)心它的真實性,只要TCP校驗和IP校驗都能通過,Real Server就可以進行處理。所以LVS-NAT工作模式下Real Server可以是任何操作系統(tǒng),只要它支持TCP/IP協(xié)議即可。
3-2-2、DR模式
LVS的DR工作模式,是目前生產(chǎn)環(huán)境中最常用的一種工作模式,網(wǎng)上的資料也是最多的,有的文章對DR工作模式的講解還是比較透徹的:
LVS-DR模式的優(yōu)點在于:
解決了LVS-NAT工作模式中的轉(zhuǎn)發(fā)瓶頸問題,能夠支撐規(guī)模更大的負載均衡場景。
比較耗費網(wǎng)外IP資源,機房的外網(wǎng)IP資源都是有限的,如果在正式生產(chǎn)環(huán)境中確實存在這個問題,可以采用LVS-NAT和LVS-DR混合使用的方式來緩解。
LVS-DR當然也有缺點:
配置工作較LVS-NAT方式稍微麻煩一點,您至少需要了解LVS-DR模式的基本工作方式才能更好的指導自己進行LVS-DR模式的配置和運行過程中問題的解決。
由于LVS-DR模式的報文改寫規(guī)則,導致LVS節(jié)點和Real Server節(jié)點必須在一個網(wǎng)段,因為二層交換是沒法跨子網(wǎng)的。但是這個問題針對大多數(shù)系統(tǒng)架構(gòu)方案來說,實際上并沒有本質(zhì)限制。
3-2-3、TUN模式
LVS-DR模式和LVS-TUN模式的工作原理完全不一樣,工作場景完全不一樣。DR基于數(shù)據(jù)報文重寫,TUN模式基于IP隧道,后者是對數(shù)據(jù)報文的重新封裝:
IPIP隧道。將一個完整的IP報文封裝成另一個新的IP報文的數(shù)據(jù)部分,并通過路由器傳送到指定的地點。在這個過程中路由器并不在意被封裝的原始協(xié)議的內(nèi)容。到達目的地點后,由目的地方依靠自己的計算能力和對IPIP隧道協(xié)議的支持,打開封裝協(xié)議,取得原始協(xié)議:
可以說LVS-TUN方式基本上具有LVS-DR的優(yōu)點。在此基礎上又支持跨子網(wǎng)間穿透。
3-3、CDN技術(shù)
CDN技術(shù)Content Delivery Network:內(nèi)容分發(fā)網(wǎng)絡。為什么有時我們訪問互聯(lián)網(wǎng)上的視頻資源、圖片資源會比較慢,甚至訪問失敗。其中有一個重要的原因,是資源的物理位置離客戶端太遠了,可能其中有4層NAT設備(相當于使用網(wǎng)通的線路訪問電信服務器上的資源)。
我們試想一下,如果將我們要訪問的資源放到離我們客戶端最近的一個服務上(例如在廣州的客戶端訪問的資源就在廣州的機房)。那么是不是就解決了這個問題(這個點稱為“邊緣節(jié)點”)。這就是CDN網(wǎng)絡解決的問題,如下圖所示:
可以說LVS-TUN方式基本上具有LVS-DR的優(yōu)點。在此基礎上又支持跨子網(wǎng)間穿透。
3-3、CDN技術(shù)
CDN技術(shù)Content Delivery Network:內(nèi)容分發(fā)網(wǎng)絡。為什么有時我們訪問互聯(lián)網(wǎng)上的視頻資源、圖片資源會比較慢,甚至訪問失敗。其中有一個重要的原因,是資源的物理位置離客戶端太遠了,可能其中有4層NAT設備(相當于使用網(wǎng)通的線路訪問電信服務器上的資源)。
我們試想一下,如果將我們要訪問的資源放到離我們客戶端最近的一個服務上(例如在廣州的客戶端訪問的資源就在廣州的機房)。那么是不是就解決了這個問題(這個點稱為“邊緣節(jié)點”)。這就是CDN網(wǎng)絡解決的問題,如下圖所示:
目前CDN服務不需要我們進行開發(fā),市面上有很多公司都提供免費的/付費的 CDN服務。當然如果您想自行搭建CDN網(wǎng)絡,可以參考以下技術(shù)方案:
Squid:Squid是一個緩存internet數(shù)據(jù)的一個軟件,它接收用戶的下載申請,并自動處理所下載的數(shù)據(jù)。目前,國內(nèi)很多CDN服務商的網(wǎng)絡都是基于Squid搭建的
利用Nginx的proxy_cache搭建:Nginx中的rewrite技術(shù)實際上就可以實現(xiàn)URL請求重寫,實現(xiàn)請求轉(zhuǎn)發(fā)。而Nginx中的proxy_cache組件可以使得從遠端請求的源數(shù)據(jù)保存在本地,從而實現(xiàn)一個CDN網(wǎng)絡的搭建。
自己寫:CDN網(wǎng)絡沒有特別復雜的技術(shù)門檻,如果您有特別的需求,可以自己寫一個。當然上圖中所介紹的CDN網(wǎng)絡屬于第一代CDN網(wǎng)絡,將第二代/第三代P2P技術(shù)加入到CDN原理中,可以形成第二代CDN網(wǎng)絡:如下圖所示:
第三代P2P技術(shù)又被稱為混合型P2P技術(shù)主要是為了解決元數(shù)據(jù)服務器的處理壓力,加速資源的本地化速度。關(guān)于P2P技術(shù)我會在講完“業(yè)務系統(tǒng)設計”、“業(yè)務通信系統(tǒng)設計”后,專門做一個新的專題進行介紹。另外提一下,YouTube的P2P網(wǎng)絡就是自己做的。
3、負載均衡層技術(shù)匯總
3-4、Keepalived技術(shù)
在這些文章中從來沒有單獨介紹Keepalived。這是因Keepalived是為了監(jiān)控集群節(jié)點的工作狀態(tài),在因為某種原因不能正常提供服務的前提下,完成備機的切換。這里面有兩個關(guān)鍵點:監(jiān)控節(jié)點上提供的服務、完成網(wǎng)絡切換。keepalived本身是不提供業(yè)務服務的,只是監(jiān)控提供的服務是否正常工作,那么既然都沒有可以監(jiān)控的服務,那么Keepalived有什么獨立使用的必要呢?
下圖是Nginx + Keepalived的工作結(jié)構(gòu)和LVS + Keepalived 的工作結(jié)構(gòu):
Nginx + Keepalived的工作方式
LVS + Keepalived + Nginx的工作方式
相關(guān)技術(shù)還有:
Heartbeat是Linux-HA計劃中的一個重要項目,它的功能比Keepalived更強大,安裝和管理也相對復雜。網(wǎng)絡上有很多資料介紹Heartbeat和Keepalived的優(yōu)缺點和使用對比。但就我自己的使用經(jīng)驗來說,個人更喜歡使用Keepalived,原因很簡單:Keepalived安裝和配置更簡單,而且夠用。另外Redhat Rhcs套件也可以搭建類似的HA集群,但是說實話本人沒有嘗試過。
3-5、DNS輪詢和智能DNS
//TODO DNS技術(shù)還沒有介紹
3-6、硬件負載
在這個系列的“負載均衡層設計方案”博文中,我們所提到的諸如Nginx、LVS等技術(shù),沒有詳細講述的Haproxy、Squid等技術(shù),都是基于軟件的負載技術(shù)。F5是一家公司,它的BIG-IP LTM技術(shù)是基于硬件負載的。硬件負載方案提供了軟件負載技術(shù)無法提供了性能空間,并且集成了NAT映射功能、SSL加速、Cookie加密、高速緩存、攻擊過濾、包過濾、動態(tài)Session保持等等很多軟件負載無法提供的功能(或者需要多個軟件組合使用才能提供的功能)。
但是硬件負載方案也有其缺點,主要就是建設費用比較高昂,它不像軟負載可以根據(jù)系統(tǒng)的吞吐量的持續(xù)增加進行持續(xù)擴展。當然您可以根據(jù)系統(tǒng)的吞吐量需求,在前期采用軟負載,后期采用硬件負載的方案。除了F5公司提供的硬件負載技術(shù),還有Citrix公司的硬負載方案、A10公司的硬件負載方案。
4、常見負載均衡技術(shù)組合
這里我們在重新回顧一下這個系列博文中,提到的目前常用的負載均衡技術(shù)的組合方式。
4-1、獨立的Nginx/Haproxy
一般的WEB系統(tǒng),前段假設一個Nginx或者Haproxy服務器,基本上可以解決包括負載分發(fā)在內(nèi)的很多問題了。
4-2、Nginx + Keepalived 或 Haproxy + Keepalived 或 + Heartbeat
為了保證Nginx或者HaProxy服務器的穩(wěn)定性,可以使用Keepalived或者Heartbeat做一個簡單的熱備方案。
4-3、LVS + (Keepalived | Heartbeat) + (Nginx | Haproxy)
隨著訪問壓力的增大,我們開始采用多層負載方案,在Nginx或者Haproxy的前段架設LVS服務,并通過Keepalived或者Heartbeat保證Keepalived的持續(xù)工作。
4-4、加如DNS輪詢技術(shù)或者智能DNS路由技術(shù)
5、負載均衡技術(shù)的其他運用
在這個系列的文章中,我們?nèi)趯⒂糜诳蛻舳耸褂肏TTP協(xié)議請求服務器端進行處理的情況,這里的客戶端可以使最終用戶,也可以是某個一第三方系統(tǒng)。但實際上負載均衡技術(shù)在信息處理領(lǐng)域內(nèi),不是只有這樣的請求響應層才使用,在其它的技術(shù)領(lǐng)域也大量使用,這個小節(jié),我們就來梳理這些技術(shù),作為一個擴展話題。
5-1、關(guān)系型數(shù)據(jù)庫系統(tǒng)的負載均衡
一說到關(guān)系型數(shù)據(jù)庫,大家自然會聯(lián)想到Oracle、MS SQL、DB2 和Mysql。在移動互聯(lián)網(wǎng)領(lǐng)域,通常很多公司在走去OEI的路程。這里我們不去討論去OEI是否是正確的,也不去討論怎樣走去OEI這條路才合理,一個不可爭辯的事實是,目前很多移動互聯(lián)網(wǎng)公司在使用Mysql數(shù)據(jù)庫。
單臺Mysql數(shù)據(jù)庫的處理能力確實趕不上Oracle,甚至趕不上MS SQL這些商用數(shù)據(jù)庫,但是我們可以為Mysql做集群來提高整個數(shù)據(jù)服務的性能。Mysql從5.1.X版本開始,就已經(jīng)支持單數(shù)據(jù)節(jié)點的“表分區(qū)”功能了,但這個支持僅限于每個節(jié)點的配置,提高單個Mysql上的讀寫性能(還要配合底層的塊存儲選型,例如DAS)。而想要實現(xiàn)整個Mysql集群性能,就需要從更高級別實現(xiàn)讀寫分離了。
其中有一種成熟的Mysql集群讀寫分離的做法,是一臺寫節(jié)點做成Master節(jié)點(Master節(jié)點單機性能可以做得較高,后端可以使用DAS系統(tǒng));然后多臺讀節(jié)點做成Salve節(jié)點,并接受來源于Master節(jié)點的同步日志(MySQL Replication技術(shù)),并通過另一個LVS進行讀請求的負載,而且可以再配合單個節(jié)點上的“表分區(qū)”功能。這個做法在80%以上都是讀請求的任何系統(tǒng)上,都可以大大增強數(shù)據(jù)庫系統(tǒng)的整體性能,如下圖所示:
從上圖可以看到,來源于程序的“寫”操作通過一個數(shù)據(jù)源提交給了Mysql Master,而所有的讀操作則通過LVS-DR模式分發(fā)給3個Mysql Salve。這里要說明幾個問題:
- Mysql Master和Mysql Salve的數(shù)據(jù)同步是通過MySQL Replication同步技術(shù)來實現(xiàn)的,這是一種基于操作日志的異步同步,雖然響應時間不能達到“毫秒”級,但是基本上還是很快很快的。如果不是銀行系統(tǒng)、或者“秒殺系統(tǒng)”基本上可以滿足事實性
- MySQL Replication會降低Mysql Master節(jié)點的20%的工作性能,但是轉(zhuǎn)移了原來Mysql Master負責的所有讀操作。當然,我們以后介紹“多主”方式和使用HiveDB橫向切分的時候,還會重點介紹如何提高Mysql的寫性能。
- 事實上正式的開發(fā)架構(gòu)中,我們不會給程序員兩個數(shù)據(jù)源,這樣既不利于代碼的管理,也增加了開發(fā)難度。我們會采用類似Mysql-Proxy、Amoeba之類的軟件實現(xiàn)數(shù)據(jù)源的整個。
- 后面在介紹數(shù)據(jù)存儲層架構(gòu)的時候,我還會介紹多種成熟的可靠的Mysql集群、Mysql讀寫分離、Mysql橫向擴展方式,和讀者討論如何實現(xiàn)幾十臺Mysql節(jié)點的運行和管理。
5-2、分布式存儲系統(tǒng)的負載均衡
分布式存儲系統(tǒng)目前有很多,Ceph、Swift、MFS、HDFS。他們有的是基于對象存儲的,有的是基于快存儲的(在《標準Web系統(tǒng)的架構(gòu)分層》這篇博文中,我對塊存儲、文件存儲和對象存儲做了較詳細的介紹,后文我們還將詳細介紹存儲系統(tǒng))。但是他們有一個或者多個主控節(jié)點(有的叫namenode、有的叫master、有的叫Metadata),無論怎么叫,他們都有一些相同的功能:
- 計算“數(shù)據(jù)該存儲在哪里”的問題
- 協(xié)調(diào)控制“數(shù)據(jù)是否正確存儲”的問題
- 監(jiān)控“數(shù)據(jù)節(jié)點”的健康狀態(tài)
- 轉(zhuǎn)移數(shù)據(jù)
- 回答客戶端“到哪里取數(shù)據(jù)”的問題
- 。。。。。
在處理問題的過程中,這些控制節(jié)點實際上起到的就是負載分發(fā)的作用,他們的基本原理都是通過“一致性hash算法”,對“數(shù)據(jù)該存儲在”哪里的問題進行分析(用來做hash的屬性依據(jù)不同而已):
5-3、更廣義的負載均衡系統(tǒng)
相同的客流量下,銀行多個窗口排隊的等待時間肯定比一個窗口排隊的時間短;同樣的車流量,8車道肯定比6車道的通過率高;把一個任務拆分成多個任務由多個人負責處理其中的一部分,肯定比一個人做一個大任務的時間短;
負載均衡的核心思想在于分流、關(guān)鍵問題在于如何分流、評價標準在于分流后的吞吐量。