負載均衡軟件實現方式之一 - URL重定向方式html
有一種用軟件實現負載均衡的方式,是基於"URL重定向"的.前端
先看看什麼是URL重定向:mysql
"簡單的說,若是一個網站有正規的URL和別名URL,對別名URL進行重定向到正規URL,訪問同一個網址,或者網站改換成了新的域名則把舊的域名重定向到新的域名,都叫URL重定向"。linux
"不少網絡協議都支持「重定向」功能,例如在HTTP協議中支持Location指令,接收到這個指令的瀏覽器將自動重定向到Location指明的另外一個URL上。"web
這種方式,對於簡單的網站,若是網站是本身開發的,也在必定程度上可行.可是它存在着較多的問題:算法
一、「例如一臺服務器如何能保證它重定向過的服務器是比較空閒的,而且不會再次發送Location指令,Location指令和瀏覽器都沒有這方面的支持能力,這樣很容易在瀏覽器上造成一種死循環。」sql
二、在哪裏放LOCATION,也是一個問題。頗有可能用戶會訪問系統的不少個不一樣URL,這個時候作起來會很是麻煩。而且,對URL的訪問,有的時候是 直接過來的,能夠被重定向,有的時候是帶着SESSION之類的,重定向就可能會出問題。而且,這種作法,將負載均衡這個系統級的問題放到了應用層,結果 多是麻煩多多。shell
三、這種方式通常只適用於HTTP方式,可是實際上有太多狀況不只僅是HTTP方式了,特別是用戶若是在應用裏面插一點流媒體之類的。後端
四、重定向的方式,效率遠低於IP隧道。瀏覽器
五、這種方式,有的時候會伴以對服務器狀態的檢測,但每每也是在應用層面實現,從而實時性大打折扣。
實際上,這種方式是一種「對付」的解決方法,並不能真正用於企業級的負載均衡應用(這裏企業級是指稍微複雜一點的應用系統)
能夠看一下專業的負載均衡軟件是如何來實現的:
對比一下能夠發現,專業的負載均衡軟件要更適用於正規應用,而重定向方式則比較適用於一些簡單的網站應用。
負載均衡軟件實現方式之二 - 基於DNS
講到負載均衡,幾乎全部地方都必需要講一下基於DNS的方式,由於這實在是最基本、最簡單的方式了。固然,也幾乎全部地方都說到這種方式的種種缺點,不過,既然很基本,就仍是要說明一下。
下面這段講得很清楚:
最先的負載均衡技術是經過DNS來實現的,在DNS中爲多個地址配置同一個名字,於是查詢這個名字的客戶機將獲得其中一個地址,從而使得不一樣的客戶訪問不一樣的服務器,達到負載均衡的目的。
DNS負載均衡是一種簡單而有效的方法,可是它不能區分服務器的差別,也不能反映服務器的當前運行狀態。當使用DNS負載均衡的時候,必須儘可能保證不一樣的 客戶計算機能均勻得到不一樣的地址。因爲DNS數據具有刷新時間標誌,一旦超過這個時間限制,其餘DNS服務器就須要和這個服務器交互,以從新得到地址數 據,就有可能得到不一樣IP地址。所以爲了使地址能隨機分配,就應使刷新時間儘可能短,不一樣地方的DNS服務器能更新對應的地址,達到隨機得到地址,然而將過 期時間設置得太短,將使DNS流量大增,而形成額外的網絡問題。DNS負載均衡的另外一個問題是,一旦某個服務器出現故障,即便及時修改了DNS設置,仍是 要等待足夠的時間(刷新時間)才能發揮做用,在此期間,保存了故障服務器地址的客戶計算機將不能正常訪問服務器。
儘管存在多種問題,但它仍是一種很是有效的作法,包括Yahoo在內的不少大型網站都使用DNS。
引自:負載均衡技術研究
原文:http://www.ha999.com/loadbalance/lb_tech.htm
比較一下DNS方式與專業的負載均衡軟件如PCL負載均衡軟件,會發現DNS的問題在於,一是每每不能根據系統與服務的狀態來判斷負載,二是每每不能創建較複雜的負載均衡算法,而最主要的是DNS每每有緩存,簡單分配負載問題不大,若是是應用集羣這個就是沒法接受的。
那麼,爲何象Yahoo在內的大型網站都使用DNS方式呢?由於對於門戶網站來說,應用形態單一且簡單,重要的是服務器數量與分佈,而若是出現短時 間對於少許用戶的服務中斷問題並不大(好比有100臺服務器,有一臺不行了,即便DNS有緩存,也關係不大,用戶從新刷一下,就極可能又分配到其餘機器上了)。
可是,對於應用系統而言,好比兩三臺服務器,跑着比較複雜的應用,DNS方式就徹底不適合了,這個時候,就要用專業的負載均衡軟件了。
咱們能夠看一個實例,這樣會對專業化負載均衡軟件應該支持什麼樣的應用有更多的理解:36000人同時應用的負載均衡實例
負載均衡軟件實現方式之三 - LVS
LVS是一個開源的軟件,能夠實現LINUX平臺下的簡單負載均衡.
後面所附文章,講述了LVS實現負載均衡的方法.
由於文章較長,因此在轉載前,先總結一下LVS的優缺點:
優勢:
一、開源,免費
二、在網上能找到一些相關技術資源
三、具備軟件負載均衡的一些優勢
缺點:
一、具備開源產品常有的缺點,最核心的就是沒有可靠的支持服務,沒有人對其結果負責
二、功能比較簡單,支持複雜應用的負載均衡能力較差,如算法較少等。
三、開啓隧道方式需重編譯內核
四、配置複雜
五、只支持LINUX,若是應用還包括WINDOWS、SOLIRIS等就不行了
所以,建議在簡單的LINUX應用中使用LVS,複雜的應用,或者重要的應用,仍是應該使用專業的負載均衡軟件,如富士通西門子公司的PCL負載均衡軟件。
下面轉載一下如何使用LVS實現負載均衡:
搭建集羣負載均衡系統 (原文:http://www.xxlinux.com/linux/artic ... p/20060707/2519.html)
負載均衡集羣是在應用服務器高負載的狀況下,由多臺節點提供可伸縮的,高負載的服務器組以保證對外提供良好的服務響應;而LVS就是實現這一功能的技 術.實際上LVS是一種Linux操做系統上基於IP層的負載均衡調度技術,它在操做系統核心層上,未來自IP層的TCP/UDP請求均衡地轉移到不一樣的 服務器,從而將一組服務器構成一個高性能、高可用的虛擬服務器。使用三臺機器就能夠用LVS實現最簡單的集羣。
假設一臺名爲Director的機器是前端負載均衡器,運行LVS,目前只能在Linux下運行.能夠針對web、ftp、cache、mms甚至 mysql等服務作load balance;後端兩臺機器稱之爲Real Server,是須要負載均衡的服務器,能夠爲各種系統,Linux、Solaris、Aix、BSD、Windows均可,甚至Director自己也 能夠做爲Real Server.
本文將經過實際操做,重點介紹如何在Redhat 9上用LVS構建一個負載均衡集羣,關於負載均衡集羣、LVS的詳細內容,可參考以下信息:
安裝LVS
RedHat在 9.0之後,就將ipvsadm這些套件去除,所以若是想使用LVS(Linux Virtual Server),就得本身從新編譯核心(kernel)。
下載所需軟件
下載ipvs補丁包
從RedHat 9開始ipvs再也不被預先編譯到了RedHat發行版的內核中,咱們須要從下載新版的ipvs, 這裏咱們使用ipvs-1.0.9.tar.gz這個版本.
下載內核linux-2.4.20.tar.gz
這裏須要強調的是因爲全部的ipvs的補丁包都是爲標準內核開發的,因此安裝ipvs時不能使用RedHat光盤中的Kernel Source,而是須要去下載標準的內核。因此咱們從 獲得standard kernel linux-2.4.20.tar.gz
下載ipvs管理工具ipvsadm
從http://www.linuxvirtualserver.org/ 獲得ipvs管理工具ipvsadm-1.21.tar.gz, ipvsadm是設置ipvs轉發方式和調度算法的工具.
開始安裝
安裝內核源碼
把linux-2.4.20.tar.gz解壓到/usr/src目錄,生成了/usr/src/linux目錄;若是生成的是/usr/src /linux-2.4.20目錄,則要在/usr/src下創建一個鏈接 ln –s linux-2.4.20 linux,由於在ipvs-1.0.9中的makefile文件中默認指定Kernel Source的路徑爲:KERNELSOURCE = /usr/src/linux
把ipvs補丁Patch到內核源碼中
把ipvs-1.0.9.tar.gz解壓縮到某個目錄,如/test,生成了/test/ipvs-1.0.9目錄;進入/test/ipvs- 1.0.9,依次執行以下命令:make patchkernel、make installsource,將ipvs的Patch加載到kernel的source中。
從新編譯支持ipvs的內核
進入/usr/src/linux目錄,分別執行:
make mrproper 爲建立新的內和配置作好準備
make menuconfig 進行配置
這裏請確保IP:Virtual Server Configuration中的選項設定都用M
make dep 檢測是否有相關的軟件包被使用
make clean 爲新內核結構準備源目錄樹
make bzImage 建立內核引導映像
make modules、make modules_install 生成模塊
make install安裝新的內核到指定位置並從新配置grub.conf
到這裏新內核就安裝完畢了,請重啓並用此內核引導系統
安裝ipvs管理工具ipvsadm
當使用新內核啓動後,就能夠安裝ipvsadm:
tar xzvf ipvsadm-1.21.tar.gz
cd ./ipvsadm-1.21
make
make install
安裝完成後,執行ipvsadm命令,若是有以下信息出現則說明安裝成功了。
[root@leon c]# ipvsadm
IP Virtual Server version 1.0.9 (size=65536)
Prot LocalAddress:Port Scheduler Flags
->; RemoteAddress:Port Forward Weight ActiveConn InActConn
到如今爲止,支持負載均衡功能的director就安裝成功了,接下來咱們能夠經過ipvsadm來配置一個負載均衡集羣。
構建負載均衡集羣
這裏咱們假設局域網中有兩臺FTP服務器,IP分別爲FTP1:10.83.33.103,FTP2: 10.83.33.2 所提供的資料都是相同的,這能夠經過無密碼SSH登陸+RSYNC來保證數據一致,這非本文中電,故而略過.咱們提供給用戶的虛擬IP是 10.83.33.100,而在後臺爲這兩臺FTP服務器實行LVS負載均衡的服務器的IP是10.83.33.83.這三臺均安裝RedHat9系統.
咱們最終要實現的目標是當用戶輸入ftp 10.83.33.100時, LVS負載均衡服務器系統會根據當時的負載狀況,依據輪換策略來決定Real Server究竟是FTP1仍是FTP2,從而使得整個FTP服務器的負載到達均衡.
目前LVS有三種負載平衡方式,NAT(Network Address Translation),DR(Direct Routing),IP Tunneling。其中,最爲經常使用的是DR方式,所以這裏只說明DR(Direct Routing)方式的LVS負載平衡。其它兩種的詳細狀況請參考LVS-HOWTO.
Director(即10.83.33.83)上執行的設置
爲了方便咱們將全部步驟寫成一個shell script.
#!/bin/bash
echo "0" >; /proc/sys/net/ipv4/ip_forward (關閉ip_forward)
echo "1" >; /proc/sys/net/ipv4/conf/all/send_redirects (開啓ICMP Redirects)
echo "1" >; /proc/sys/net/ipv4/conf/default/send_redirects (開啓ICMP Redirects)
echo "1" >; /proc/sys/net/ipv4/conf/eth0/send_redirects (開啓ICMP Redirects)
ifconfig eth0:100 10.83.33.100 broadcast 10.83.33.100 netmask 255.255.255.255
(設置虛擬IP)
route add -host 10.83.33.100 dev eth0:100 (設置達到虛擬Ip的路由)
ipvsadm –C (清空ipvsadm table)
ipvsadm -A -t 10.83.33.100:21 -s wrr (創建service rule, 當前調度算法爲加權輪叫調度) ipvsadm -a -t 10.83.33.100:21 -r 10.83.33.76 -g -w 3 (創建轉發規則)
ipvsadm -a -t 10.83.33.100:21 -r 10.83.33.2 -g -w 1 (創建轉發規則)
ipvsadm (檢查當前ipvsadm table)
將此shell script加入到/etc/rc.local中,這樣在每次系統啓動時均可以自動運行進行設置了。 Realserver(即10.83.33.2和10.83.33.76)上的設置
這裏咱們必須先修正real server上arp problem .這是由於在使用VS/DR的時候,real server會在一塊網卡上綁定兩個IP,但linux在kernel 2.2.14之後就將eth0:1的NOARP FLAG關閉,這使得eth0:1僅僅是eth0的別名,任何對eth0:1的操做都對eth0有效,所以若是此時使eth0:1 NOARP,則也使得eth0 NOARP,這樣整個網卡都不會收到數據包,具體的說就是由於我全部的機器都放在同一個網段,當該網段的Router接收到用戶對虛擬IP的TCP connection要求(即便用FTP登陸服務器)時,會先在網段中利用Arp request詢問誰有VIP的地址,而包含Director與Real Servers上全部的interface,只要他有那個ip,都會發送arp reply回去,形成網段內全部擁有Virtual IP的interface都會reply給Router,最後結果就是看誰的速度快,Router就將該封包送給誰,如此會形成LVS的Server並沒有 法發揮其效果,而咱們所但願的是隻有Director上的Virtual IP發送arp reply回去,所以須要利用hidden這個pattch,將real server上的Virtual IP給隱藏起來,如此他就不會對Arp Request進行Reply,就能夠解決ARP的問題.具體步驟是:
下載所需的軟件包
從http://www.ssi.bg/~ja/ 獲得hidden修正包,不一樣的核心使用相應的版本.請參考下表
Patch Linux 2.4 Created
hidden-2.4.28-1.diff 2.4.28 - 2.4.30 November 18, 2004
hidden-2.4.26-1.diff 2.4.26 - 2.4.27 February 28, 2004
hidden-2.4.25-1.diff 2.4.25 February 19, 2004
hidden-2.4.20pre10-1.diff 2.4.20pre10 - 2.4.24 October 12, 2002
hidden-2.4.19pre5-1.diff 2.4.19pre5 - 2.4.20pre9 April 7, 2002
hidden-2.4.5-1.diff 2.4.5 - 2.4.19pre4 June 2, 2001
hidden-2.4.4-1.diff 2.4.4 April 29, 2001
Patch Linux 2.6 Created
hidden-2.6.9-1.diff 2.6.9 - 2.6.11 October 19, 2004
hidden-2.6.4-1.diff 2.6.4 - 2.6.8 March 12, 2004
hidden-2.6.3-1.diff 2.6.3 February 19, 2004
hidden-2.5.67-1.diff 2.5.67 - 2.6.2 April 9, 2003
本例使用的內核版本是2.4.20-8,所以下載hidden-2.4.20pre10-1.diff
從新編譯內核,修正arp problem
把hidden-2.4.20pre10-1.diff放到/usr/src/linux下,用命令
patch -p1 < hidden-2.4.20pre10-1.diff對kernel進行patch
進入/usr/src/linux目錄,分別執行:
make mrproper 爲建立新的內和配置作好準備
make menuconfig 進行配置
make dep 檢測是否有相關的軟件包被使用
make clean 爲新內核結構準備源目錄樹
make bzImage 建立內核引導映像
make modules、make modules_install 生成模塊
make install 安裝新的內核到指定位置並從新配置grub.conf
到這裏新內核就安裝完畢了,請重啓並用此內核引導系統
設置Real server
爲了方便咱們將全部步驟寫成一個shell script.
#!/bin/bash
echo "0" >; /proc/sys/net/ipv4/ip_forward (關閉ip_forward)
ifconfig lo:100 10.83.33.100 broadcast 10.83.33.100 netmask 0xffffffff up (設置虛擬IP) route add -host 10.83.33.100 dev lo:100 (設置達到虛擬Ip的路由)
echo "1" >; /proc/sys/net/ipv4/conf/all/hidden (開啓No-ARP)
echo "1" >; /proc/sys/net/ipv4/conf/lo/hidden (開啓No-ARP)
將此shell script加入到/etc/rc.local中,這樣在每次系統啓動時均可以自動運行進行設置了。
測試
爲了使得咱們清楚地知道訪問的是那一臺FTP服務器,咱們在FTP1上編輯
/etc/vsftpd/vsftpd.conf,設置 ftpd_banner=Welcome to FTP1 server,在FTP2設置
ftpd_banner=Welcome to FTP2 server,設置完畢後重啓服務.
如今在另外一臺客戶機開幾個終端,依次輸入ftp 10.83.33.100,咱們能夠從歡迎詞上看到,每次登陸的FTP服務器都不是固定的,它會在FTP1和FTP2上互相交替,試驗成功!
負載均衡軟件實現方式之四 - 專業負載均衡軟件
看一下專業的負載均衡軟件是什麼樣的:PCL負載均衡軟件
詳細內容,你們能夠本身去看。簡單講,專業負載均衡軟件大概有如下特色:
一、它是基於IP隧道的,而不是象URL重定向方式那樣。因此,它是獨立於應用的
二、它支持不一樣平臺,即應用能夠是基於LINUX,WINDOWS或SOLARIS的,而不是象LVS只能在LINUX上
三、它是實時的,這點與DNS方式有極大的差異。
四、它可以根據系統、應用的狀況來決定負載,這一點與硬件負載均衡設備有很大差異。
五、專業負載均衡軟件,適用於企業級應用,不管從其可靠性,仍是從其服務保障上,都不是象LVS那樣的開源軟件可比的。
總結一下,若是是象YAHOO那樣的網站應用,能夠考慮DNS方式,參見:負載均衡軟件實現方式之二 - 基於DNS
若是是特別簡單的應用,能夠考慮URL重定向方式,參見:負載均衡軟件實現方式之一 - URL重定向方式
若是是不過重要的純LINUX應用,能夠考慮LVS,參見:負載均衡軟件實現方式之三 - LVS
若是是重要、流量大、應用簡單、預算充足的狀況,能夠考慮硬件方式(好比用F5)(必定要作雙機啊!),參見:軟件與硬件負載均衡的比較
而若是是重要的企業應用,兩臺或幾十臺服務器,應用比較複雜,包括有可能跨平臺,則應該考慮專業的負載均衡軟件。參見:PCL負載均衡軟件-應用集羣的理想選擇。