LVS (Linux Virtual Server)
什么是LVS?它是一種集群(Cluster)技術(shù),采用IP負(fù)載均衡技術(shù)和基于內(nèi)容請求分發(fā)技術(shù)。調(diào)度器具有很好的吞吐率,將請求均衡地轉(zhuǎn)移到不同的服務(wù)器上執(zhí)行,且調(diào)度器自動屏蔽掉服務(wù)器的故障,從而將一組服務(wù)器構(gòu)成一個高性能的、高可用的虛擬服務(wù)器。整個服務(wù)器集群的結(jié)構(gòu)對客戶是透明的,而且無需修改客戶端和服務(wù)器端的程序。(另外,LVS 項目是章文嵩博士的成名作[1])
LVS 主要組成部分
- 負(fù)載調(diào)度器(load balancer / Director),它是整個集群對外面的前端機(jī),負(fù)責(zé)將客戶的請求發(fā)送到一組服務(wù)器上執(zhí)行,而客戶認(rèn)為服務(wù)是來自一個IP地址(我們可稱之為虛擬IP地址)上的。
- 服務(wù)器池(server pool / Realserver),是一組真正執(zhí)行客戶請求的服務(wù)器,執(zhí)行的服務(wù)一般有 WEB, MAIL, FTP 和 DNS 等。
- 共享存儲(shared storage),它為服務(wù)器池提供一個共享的存儲區(qū),這樣很容易使得服務(wù)器池?fù)碛邢嗤膬?nèi)容,提供相同的服務(wù)。
LVS 負(fù)載均衡方式[2]
LVS 有三種負(fù)載均衡方式:
- Virtual Server via Network Address Translation NAT (VS/NAT)
- Virtual Server via IP Tunneling (VS/TUN)
- Virtual Server via Direct Routing (VS/DR)
VS/DR 方式是目前大型網(wǎng)站使用最廣泛的一種負(fù)載均衡手段。對這三種方式,我談下自己的理解:
1 中的 LB 工作在 http 層,可看做一個 http 服務(wù)器,它接收到客戶端請求后向 real server 發(fā)出請求,接收到返回后再返回給客戶端。為什么 real server 不能直接返回給客戶端呢?因為根據(jù) TCP/IP 協(xié)議,real server 返回的包的目標(biāo) IP 地址是請求包的源 IP,即 LB 的 IP。
2 中的 LB 用到了 IP 封裝協(xié)議,大概可以這樣理解(是我揣測的,沒有求證)。LB 向 real server 發(fā)送請求時,源 IP 還是 LB 的 IP,但是包體里面包含了客戶端的 IP,根據(jù)協(xié)議 real server 返回的時候會把包的目標(biāo) IP 設(shè)為包體里的客戶端 IP。如果真是這樣的話,協(xié)議數(shù)據(jù)走在應(yīng)用層,但是又對傳輸層的數(shù)據(jù)做了修改,比較 hack,沒有遵守分層的設(shè)計規(guī)范。
3 中的 LB 工作在數(shù)據(jù)鏈路層,LB 直接把 frame 的 mac 地址修改為 某臺 real server 的 mac 地址,轉(zhuǎn)發(fā)給 real server。real server 拿到包里的源 IP 是客戶端的 IP,返回包的目標(biāo) IP 自然為客戶端的 IP。
基于它們工作的網(wǎng)絡(luò)協(xié)議,有下面的特點。(注:子網(wǎng)的出口的路由器叫做網(wǎng)關(guān))
| 指標(biāo) | VS/NAT | VS/TUN | VS/DR |
|---|---|---|---|
| 服務(wù)器操作系統(tǒng) | 任意 | 支持隧道 | 多數(shù)(支持Non-arp) |
| 服務(wù)器網(wǎng)絡(luò) | 私有網(wǎng)絡(luò) | 局域網(wǎng)/廣域網(wǎng) | 局域網(wǎng) |
| 服務(wù)器數(shù)目(100M網(wǎng)絡(luò)) | 10~20 | 100 | 大于100 |
| 服務(wù)器網(wǎng)關(guān) | 負(fù)載均衡器 | 自己的路由 | 自己的路由 |
| 效率 | 一般 | 高 | 最高 |
其他負(fù)載均衡方法
HTTP 重定向負(fù)載均衡
當(dāng)用戶發(fā)來請求的時候,Web 服務(wù)器通過修改 HTTP 響應(yīng)頭中的 Location 標(biāo)記來返回一個新的 url,然后瀏覽器再繼續(xù)請求這個新 url,實際上就是頁面重定向。通過重定向,來達(dá)到“負(fù)載均衡”的目標(biāo)。例如,我們在下載 PHP 源碼包的時候,點擊下載鏈接時,為了解決不同國家和地域下載速度的問題,它會返回一個離我們近的下載地址。重定向的 HTTP 返回碼是 302。
優(yōu)點:比較簡單。
缺點:瀏覽器需要兩次請求服務(wù)器才能完成一次訪問,性能較差。重定向服務(wù)自身的處理能力有可能成為瓶頸,整個集群的伸縮性國模有限;使用 HTTP 302 響應(yīng)碼重定向,有可能使搜索引擎判斷為 SEO 作弊,降低搜索排名。
DNS 域名解析負(fù)載均衡
DNS(Domain Name System)負(fù)責(zé)域名解析的服務(wù),域名url實際上是服務(wù)器的別名,實際映射是一個IP地址,解析過程,就是DNS完成域名到IP的映射。而一個域名是可以配置成對應(yīng)多個 IP的。因此,DNS也就可以作為負(fù)載均衡服務(wù)。
事實上,大型網(wǎng)站總是部分使用DNS域名解析,利用域名解析作為第一級負(fù)載均衡手段,即域名解析得到的一組服務(wù)器并不是實際提供Web服務(wù)的物理服務(wù)器,而是同樣提供負(fù)載均衡服務(wù)的內(nèi)部服務(wù)器,這組內(nèi)部負(fù)載均衡服務(wù)器再進(jìn)行負(fù)載均衡,將請求分發(fā)到真是的 Web 服務(wù)器上。
優(yōu)點:將負(fù)載均衡的工作轉(zhuǎn)交給 DNS,省掉了網(wǎng)站管理維護(hù)負(fù)載均衡服務(wù)器的麻煩,同時許多 DNS 還支持基于地理位置的域名解析,即會將域名解析成舉例用戶地理最近的一個服務(wù)器地址,這樣可以加快用戶訪問速度,改善性能。
缺點:不能自由定義規(guī)則,而且變更被映射的IP或者機(jī)器故障時很麻煩,還存在 DNS 生效延遲的問題。而且DNS負(fù)載均衡的控制權(quán)在域名服務(wù)商那里,網(wǎng)站無法對其做更多改善和更強(qiáng)大的管理。
反向代理負(fù)載均衡
反向代理服務(wù)可以緩存資源以改善網(wǎng)站性能。實際上,在部署位置上,反向代理服務(wù)器處于Web服務(wù)器前面(這樣才可能緩存 Web 相應(yīng),加速訪問),這個位置也正好是負(fù)載均衡服務(wù)器的位置,所以大多數(shù)反向代理服務(wù)器同時提供負(fù)載均衡的功能,管理一組 Web 服務(wù)器,將請求根據(jù)負(fù)載均衡算法轉(zhuǎn)發(fā)到不同的 Web 服務(wù)器上。Web服務(wù)器處理完成的響應(yīng)也需要通過反向代理服務(wù)器返回給用戶。由于 Web 服務(wù)器不直接對外提供訪問,因此 Web 服務(wù)器不需要使用外部ip地址,而反向代理服務(wù)器則需要配置雙網(wǎng)卡和內(nèi)部外部兩套 IP 地址。
優(yōu)點:和反向代理服務(wù)器功能集成在一起,部署簡單。
缺點:反向代理服務(wù)器是所有請求和響應(yīng)的中轉(zhuǎn)站,其性能可能會成為瓶頸。
反向代理負(fù)載均衡跟 VS/NAT 的原理一樣。
參考資料